Skip to content

Commit a04b64d

Browse files
committed
routes
1 parent 78dbe6c commit a04b64d

File tree

5 files changed

+97
-14
lines changed

5 files changed

+97
-14
lines changed

coordinator/internal/controller/proxy/get_task.go

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -68,23 +68,51 @@ func (ptc *GetTaskController) GetTasks(ctx *gin.Context) {
6868

6969
session := ptc.proverMgr.Get(publicKey)
7070

71-
// if the priority upsteam is set, we try this upstream first until get the task resp or no task resp
72-
priorityUpstream, exist := ptc.priorityUpstream[publicKey]
73-
if exist {
74-
cli := ptc.clients[priorityUpstream]
75-
resp, err := session.GetTask(ctx, &getTaskParameter, cli, priorityUpstream)
71+
getTask := func(upStream string, cli Client) (tryNext bool) {
72+
resp, err := session.GetTask(ctx, &getTaskParameter, cli, upStream)
7673
if err != nil {
7774
types.RenderFailure(ctx, types.ErrCoordinatorGetTaskFailure, err)
7875
return
7976
} else if resp.ErrCode != types.ErrCoordinatorEmptyProofData {
80-
// simply dispatch the error from upstream to prover
81-
types.RenderFailure(ctx, resp.ErrCode, fmt.Errorf("%s", resp.ErrMsg))
77+
78+
if resp.ErrCode != 0 {
79+
// simply dispatch the error from upstream to prover
80+
types.RenderFailure(ctx, resp.ErrCode, fmt.Errorf("%s", resp.ErrMsg))
81+
return
82+
}
83+
84+
var task coordinatorType.GetTaskSchema
85+
if err = resp.DecodeData(&task); err == nil {
86+
task.TaskID = formUpstreamWithTaskName(upStream, task.TaskID)
87+
// TODO: log the new id in debug level
88+
types.RenderSuccess(ctx, &task)
89+
} else {
90+
types.RenderFailure(ctx, types.InternalServerError, fmt.Errorf("decode task fail: %v", err))
91+
}
92+
93+
return
94+
}
95+
tryNext = true
96+
return
97+
}
98+
99+
// if the priority upsteam is set, we try this upstream first until get the task resp or no task resp
100+
priorityUpstream, exist := ptc.priorityUpstream[publicKey]
101+
if exist {
102+
cli := ptc.clients[priorityUpstream]
103+
if cli != nil && !getTask(priorityUpstream, cli) {
82104
return
105+
} else if cli == nil {
106+
// TODO: log error
83107
}
84108
}
85109

86110
for n, cli := range ptc.clients {
87-
// return the first task we can get
88-
// TODO: use random array for all clients
111+
if !getTask(n, cli) {
112+
return
113+
}
89114
}
115+
116+
// if all get task failed, throw empty proof resp
117+
types.RenderFailure(ctx, types.ErrCoordinatorEmptyProofData, fmt.Errorf("get empty prover task"))
90118
}

coordinator/internal/controller/proxy/submit_proof.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package proxy
22

33
import (
44
"fmt"
5+
"strings"
56

67
"github.com/gin-gonic/gin"
78
"github.com/prometheus/client_golang/prometheus"
@@ -26,10 +27,17 @@ func NewSubmitProofController(cfg *config.ProxyConfig, clients Clients, proverMg
2627
}
2728

2829
func upstreamFromTaskName(taskID string) string {
29-
// TODO
30+
parts, _, found := strings.Cut(taskID, ":")
31+
if found {
32+
return parts
33+
}
3034
return ""
3135
}
3236

37+
func formUpstreamWithTaskName(upstream string, taskID string) string {
38+
return fmt.Sprintf("%s:%s", upstream, taskID)
39+
}
40+
3341
// SubmitProof prover submit the proof to coordinator
3442
func (spc *SubmitProofController) SubmitProof(ctx *gin.Context) {
3543
var submitParameter coordinatorType.SubmitProofParameter

coordinator/internal/middleware/challenge_jwt.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import (
1414
)
1515

1616
// ChallengeMiddleware jwt challenge middleware
17-
func ChallengeMiddleware(conf *config.Config) *jwt.GinJWTMiddleware {
17+
func ChallengeMiddleware(auth *config.Auth) *jwt.GinJWTMiddleware {
1818
jwtMiddleware, err := jwt.New(&jwt.GinJWTMiddleware{
1919
Authenticator: func(c *gin.Context) (interface{}, error) {
2020
return nil, nil
@@ -30,8 +30,8 @@ func ChallengeMiddleware(conf *config.Config) *jwt.GinJWTMiddleware {
3030
}
3131
},
3232
Unauthorized: unauthorized,
33-
Key: []byte(conf.Auth.Secret),
34-
Timeout: time.Second * time.Duration(conf.Auth.ChallengeExpireDurationSec),
33+
Key: []byte(auth.Secret),
34+
Timeout: time.Second * time.Duration(auth.ChallengeExpireDurationSec),
3535
TokenLookup: "header: Authorization, query: token, cookie: jwt",
3636
TokenHeadName: "Bearer",
3737
TimeFunc: time.Now,

coordinator/internal/middleware/login_jwt.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99

1010
"scroll-tech/coordinator/internal/config"
1111
"scroll-tech/coordinator/internal/controller/api"
12+
"scroll-tech/coordinator/internal/controller/proxy"
1213
"scroll-tech/coordinator/internal/types"
1314
)
1415

@@ -46,3 +47,31 @@ func LoginMiddleware(conf *config.Config) *jwt.GinJWTMiddleware {
4647

4748
return jwtMiddleware
4849
}
50+
51+
// ProxyLoginMiddleware jwt auth middleware for proxy login
52+
func ProxyLoginMiddleware(conf *config.ProxyConfig) *jwt.GinJWTMiddleware {
53+
jwtMiddleware, err := jwt.New(&jwt.GinJWTMiddleware{
54+
PayloadFunc: api.Auth.PayloadFunc,
55+
IdentityHandler: api.Auth.IdentityHandler,
56+
IdentityKey: types.PublicKey,
57+
Key: []byte(conf.Auth.Secret),
58+
Timeout: time.Second * time.Duration(conf.Auth.LoginExpireDurationSec),
59+
Authenticator: proxy.Auth.Login,
60+
Authorizator: nonIdendityAuthorizator,
61+
Unauthorized: unauthorized,
62+
TokenLookup: "header: Authorization, query: token, cookie: jwt",
63+
TokenHeadName: "Bearer",
64+
TimeFunc: time.Now,
65+
LoginResponse: loginResponse,
66+
})
67+
68+
if err != nil {
69+
log.Crit("new jwt middleware panic", "error", err)
70+
}
71+
72+
if errInit := jwtMiddleware.MiddlewareInit(); errInit != nil {
73+
log.Crit("init jwt middleware panic", "error", errInit)
74+
}
75+
76+
return jwtMiddleware
77+
}

coordinator/internal/route/route.go

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88

99
"scroll-tech/coordinator/internal/config"
1010
"scroll-tech/coordinator/internal/controller/api"
11+
"scroll-tech/coordinator/internal/controller/proxy"
1112
"scroll-tech/coordinator/internal/middleware"
1213
)
1314

@@ -25,7 +26,7 @@ func Route(router *gin.Engine, cfg *config.Config, reg prometheus.Registerer) {
2526
func v1(router *gin.RouterGroup, conf *config.Config) {
2627
r := router.Group("/v1")
2728

28-
challengeMiddleware := middleware.ChallengeMiddleware(conf)
29+
challengeMiddleware := middleware.ChallengeMiddleware(conf.Auth)
2930
r.GET("/challenge", challengeMiddleware.LoginHandler)
3031

3132
loginMiddleware := middleware.LoginMiddleware(conf)
@@ -39,3 +40,20 @@ func v1(router *gin.RouterGroup, conf *config.Config) {
3940
r.POST("/submit_proof", api.SubmitProof.SubmitProof)
4041
}
4142
}
43+
44+
func v1_proxy(router *gin.RouterGroup, conf *config.ProxyConfig) {
45+
r := router.Group("/v1")
46+
47+
challengeMiddleware := middleware.ChallengeMiddleware(conf.Auth)
48+
r.GET("/challenge", challengeMiddleware.LoginHandler)
49+
50+
loginMiddleware := middleware.ProxyLoginMiddleware(conf)
51+
r.POST("/login", challengeMiddleware.MiddlewareFunc(), loginMiddleware.LoginHandler)
52+
53+
// need jwt token api
54+
r.Use(loginMiddleware.MiddlewareFunc())
55+
{
56+
r.POST("/get_task", proxy.GetTask.GetTasks)
57+
r.POST("/submit_proof", proxy.SubmitProof.SubmitProof)
58+
}
59+
}

0 commit comments

Comments
 (0)