diff --git a/controllers/workflow_execution.go b/controllers/workflow_execution.go index 70c333b..ccee668 100644 --- a/controllers/workflow_execution.go +++ b/controllers/workflow_execution.go @@ -1,13 +1,10 @@ package controllers import ( - "encoding/json" "time" oclib "cloud.o-forge.io/core/oc-lib" dbs "cloud.o-forge.io/core/oc-lib/dbs" - "cloud.o-forge.io/core/oc-lib/models/workflow_execution" - "cloud.o-forge.io/core/oc-lib/tools" beego "github.com/beego/beego/v2/server/web" "go.mongodb.org/mongo-driver/bson/primitive" ) @@ -89,37 +86,3 @@ func (o *WorkflowExecutionController) Search() { o.Data["json"] = oclib.NewRequest(collection, user, peerID, groups, nil).Search(nil, search, isDraft == "true") o.ServeJSON() } - -// @Title ScheduleWorkflow -// @Description schedule workflow -// @Param id path string true "id execution" -// @Param body body models.compute true "The compute content" -// @Success 200 {workspace} models.workspace -// @router /workflow/:id [post] -func (o *WorkflowExecutionController) ScheduleWorkflow() { - user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request) - id := o.Ctx.Input.Param(":id") - var resp *workflow_execution.WorkflowSchedule - json.Unmarshal(o.Ctx.Input.CopyBody(100000), &resp) - caller := tools.NewHTTPCaller(map[tools.DataType]map[tools.METHOD]string{ // paths to call other OC services - tools.PEER: { - tools.POST: "/status/", - }, - tools.BOOKING: { - tools.GET: "/booking/check/:id/:start_date/:end_date", - }, - }) - sch, err := oclib.NewRequest(collection, user, peerID, groups, caller).Schedule(id, resp) - code := 200 - e := "" - if err != nil { - code = 409 - e = err.Error() - } - o.Data["json"] = map[string]interface{}{ - "data": sch, - "code": code, - "error": e, - } - o.ServeJSON() -} diff --git a/controllers/workflow_sheduler.go b/controllers/workflow_sheduler.go new file mode 100644 index 0000000..5e46076 --- /dev/null +++ b/controllers/workflow_sheduler.go @@ -0,0 +1,122 @@ +package controllers + +import ( + "encoding/json" + "fmt" + + oclib "cloud.o-forge.io/core/oc-lib" + "cloud.o-forge.io/core/oc-lib/dbs" + "cloud.o-forge.io/core/oc-lib/models/workflow_execution" + "cloud.o-forge.io/core/oc-lib/tools" + beego "github.com/beego/beego/v2/server/web" +) + +var orderCollection = oclib.LibDataEnum(oclib.ORDER) + +// Operations about workflow +type WorkflowSchedulerController struct { + beego.Controller +} + +// @Title Schedule +// @Description schedule workflow +// @Param id path string true "id execution" +// @Param body body models.compute true "The compute content" +// @Success 200 {workspace} models.workspace +// @router /:id [post] +func (o *WorkflowSchedulerController) Schedule() { + code := 200 + e := "" + user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request) + id := o.Ctx.Input.Param(":id") + var resp *workflow_execution.WorkflowSchedule + json.Unmarshal(o.Ctx.Input.CopyBody(100000), &resp) + caller := tools.NewHTTPCaller(map[tools.DataType]map[tools.METHOD]string{ // paths to call other OC services + tools.PEER: { + tools.POST: "/status/", + }, + tools.BOOKING: { + tools.GET: "/booking/check/:id/:start_date/:end_date", + }, + }) + req := oclib.NewRequest(collection, user, peerID, groups, caller) + sch, err := req.Schedule(id, resp) + if err != nil { + filter := &dbs.Filters{ + And: map[string][]dbs.Filter{ + "workflow_id": {{Operator: dbs.EQUAL.String(), Value: id}}, + }, + } + d := req.Search(filter, "", true) + if d.Data != nil { + for _, w := range d.Data { + req.DeleteOne(w.GetID()) + } + } + o.Data["json"] = map[string]interface{}{ + "data": nil, + "code": 409, + "error": err.Error(), + } + o.ServeJSON() + return + } + order, err := req.DraftOrder(sch) + fmt.Println("SCHEDULED", order, err) + + if err != nil { + for _, w := range sch.WorkflowExecutions { + oclib.NewRequest(collection, user, peerID, groups, nil).DeleteOne(w.GetID()) + } + o.Data["json"] = map[string]interface{}{ + "data": nil, + "code": 409, + "error": err.Error(), + } + o.ServeJSON() + return + } + o.Data["json"] = map[string]interface{}{ + "data": order, + "code": code, + "error": e, + } + o.ServeJSON() +} + +// @Title UnSchedule +// @Description schedule workflow +// @Param id path string true "id execution" +// @Param body body models.compute true "The compute content" +// @Success 200 {workspace} models.workspace +// @router /:id [delete] +func (o *WorkflowSchedulerController) UnSchedule() { + user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request) + id := o.Ctx.Input.Param(":id") + // TODO UNSCHEDULER + filter := &dbs.Filters{ + And: map[string][]dbs.Filter{ + "workflow_id": {{Operator: dbs.EQUAL.String(), Value: id}}, + }, + } + o.Data["json"] = oclib.NewRequest(collection, user, peerID, groups, nil).Search(filter, "", true) + o.ServeJSON() +} + +// @Title SearchScheduledDraftOrder +// @Description schedule workflow +// @Param id path string true "id execution" +// @Success 200 {workspace} models.workspace +// @router /:id/order [get] +func (o *WorkflowSchedulerController) SearchScheduledDraftOrder() { + user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request) + id := o.Ctx.Input.Param(":id") + filter := &dbs.Filters{ + And: map[string][]dbs.Filter{ + "workflow_id": {{Operator: dbs.EQUAL.String(), Value: id}}, + "order_by": {{Operator: dbs.EQUAL.String(), Value: peerID}}, + }, + } + o.Data["json"] = oclib.NewRequest(orderCollection, user, peerID, groups, nil).Search(filter, "", true) + o.ServeJSON() +} diff --git a/go.mod b/go.mod index 942d23c..400cbdb 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.22.0 toolchain go1.22.4 require ( - cloud.o-forge.io/core/oc-lib v0.0.0-20250205160221-88b7cfe2fd0f + cloud.o-forge.io/core/oc-lib v0.0.0-20250211081618-d82ae166a1e5 github.com/beego/beego/v2 v2.3.1 github.com/smartystreets/goconvey v1.7.2 go.mongodb.org/mongo-driver v1.17.1 diff --git a/go.sum b/go.sum index ff00443..4e1a2a5 100644 --- a/go.sum +++ b/go.sum @@ -230,6 +230,32 @@ cloud.o-forge.io/core/oc-lib v0.0.0-20250205154116-7201cabb438a h1:DAEI00i+r2MAl cloud.o-forge.io/core/oc-lib v0.0.0-20250205154116-7201cabb438a/go.mod h1:2roQbUpv3a6mTIr5oU1ux31WbN8YucyyQvCQ0FqwbcE= cloud.o-forge.io/core/oc-lib v0.0.0-20250205160221-88b7cfe2fd0f h1:6V+Z81ywYoDYSVMnM4PVaJYXFgCN3xSG3ddiUPn4jL8= cloud.o-forge.io/core/oc-lib v0.0.0-20250205160221-88b7cfe2fd0f/go.mod h1:2roQbUpv3a6mTIr5oU1ux31WbN8YucyyQvCQ0FqwbcE= +cloud.o-forge.io/core/oc-lib v0.0.0-20250206080835-e646cfef0b46 h1:YnM9WwcijS+/OrpgML7y1O5c8hJ3Wt5iIPSSZYai+zw= +cloud.o-forge.io/core/oc-lib v0.0.0-20250206080835-e646cfef0b46/go.mod h1:2roQbUpv3a6mTIr5oU1ux31WbN8YucyyQvCQ0FqwbcE= +cloud.o-forge.io/core/oc-lib v0.0.0-20250206085600-3ffff7d32cf1 h1:PZ6Z3PdgjmiXQlNA64rhZgPyuZugs/jJROEVDHZs9yg= +cloud.o-forge.io/core/oc-lib v0.0.0-20250206085600-3ffff7d32cf1/go.mod h1:2roQbUpv3a6mTIr5oU1ux31WbN8YucyyQvCQ0FqwbcE= +cloud.o-forge.io/core/oc-lib v0.0.0-20250206101306-ad3293da9dbc h1:3X2bDl/ErUp+ahzROiscJTF6XyF81Swv4JXY2xqI6/o= +cloud.o-forge.io/core/oc-lib v0.0.0-20250206101306-ad3293da9dbc/go.mod h1:2roQbUpv3a6mTIr5oU1ux31WbN8YucyyQvCQ0FqwbcE= +cloud.o-forge.io/core/oc-lib v0.0.0-20250206115651-940ef17f7b0c h1:T4NE8PQY0opcYREioh4V2eVvJkagn52jytg4S1ZtpGE= +cloud.o-forge.io/core/oc-lib v0.0.0-20250206115651-940ef17f7b0c/go.mod h1:2roQbUpv3a6mTIr5oU1ux31WbN8YucyyQvCQ0FqwbcE= +cloud.o-forge.io/core/oc-lib v0.0.0-20250207072957-31ec352b57b9 h1:lmzktnKiGDo6f1+a8kRAeXvbu/+CEPe/PLsqIOt8hsc= +cloud.o-forge.io/core/oc-lib v0.0.0-20250207072957-31ec352b57b9/go.mod h1:2roQbUpv3a6mTIr5oU1ux31WbN8YucyyQvCQ0FqwbcE= +cloud.o-forge.io/core/oc-lib v0.0.0-20250207104112-3d1383357252 h1:zLU294Mc2bcxdeihG2K+wK2Zr2B/lTm+dJCMIEMUOKU= +cloud.o-forge.io/core/oc-lib v0.0.0-20250207104112-3d1383357252/go.mod h1:2roQbUpv3a6mTIr5oU1ux31WbN8YucyyQvCQ0FqwbcE= +cloud.o-forge.io/core/oc-lib v0.0.0-20250210085846-4a178d01e3ee h1:SwWTxlaRAX5p24XwOTBVbAeTLiLFNlSqDZpU0yICrWc= +cloud.o-forge.io/core/oc-lib v0.0.0-20250210085846-4a178d01e3ee/go.mod h1:2roQbUpv3a6mTIr5oU1ux31WbN8YucyyQvCQ0FqwbcE= +cloud.o-forge.io/core/oc-lib v0.0.0-20250210094237-e55727d9e273 h1:flQk8D7BAQNolfMRXehxZ5QcWuR3ytUvwJWt5GyFSbw= +cloud.o-forge.io/core/oc-lib v0.0.0-20250210094237-e55727d9e273/go.mod h1:2roQbUpv3a6mTIr5oU1ux31WbN8YucyyQvCQ0FqwbcE= +cloud.o-forge.io/core/oc-lib v0.0.0-20250210103255-f663ec80f5dd h1:myQN5EugL+AvIy4Ugw+jlHEfzcVaQ1bZ+RbwTioaZqs= +cloud.o-forge.io/core/oc-lib v0.0.0-20250210103255-f663ec80f5dd/go.mod h1:2roQbUpv3a6mTIr5oU1ux31WbN8YucyyQvCQ0FqwbcE= +cloud.o-forge.io/core/oc-lib v0.0.0-20250210121042-52d5a1fbf9b8 h1:LQpmqcx6b+RjfvYzyrgquLSIWdRqcJi2UXybB9wk9Vk= +cloud.o-forge.io/core/oc-lib v0.0.0-20250210121042-52d5a1fbf9b8/go.mod h1:2roQbUpv3a6mTIr5oU1ux31WbN8YucyyQvCQ0FqwbcE= +cloud.o-forge.io/core/oc-lib v0.0.0-20250211065515-a573a4ce715e h1:00SdIMSwwSJpKVfdwplehHpFULrVvAoc0HxKQD06KEs= +cloud.o-forge.io/core/oc-lib v0.0.0-20250211065515-a573a4ce715e/go.mod h1:2roQbUpv3a6mTIr5oU1ux31WbN8YucyyQvCQ0FqwbcE= +cloud.o-forge.io/core/oc-lib v0.0.0-20250211073038-ffaa67fb5dca h1:mZBcicJezYO7gY5SHMzyUusyLxYKwFptliiysqaGwD0= +cloud.o-forge.io/core/oc-lib v0.0.0-20250211073038-ffaa67fb5dca/go.mod h1:2roQbUpv3a6mTIr5oU1ux31WbN8YucyyQvCQ0FqwbcE= +cloud.o-forge.io/core/oc-lib v0.0.0-20250211081618-d82ae166a1e5 h1:S+vFupQoyTwa2QrtxmSChxzAYCrh6mLf7GXRNKU475g= +cloud.o-forge.io/core/oc-lib v0.0.0-20250211081618-d82ae166a1e5/go.mod h1:2roQbUpv3a6mTIr5oU1ux31WbN8YucyyQvCQ0FqwbcE= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/beego/beego/v2 v2.3.0 h1:iECVwzm6egw6iw6tkWrEDqXG4NQtKLQ6QBSYqlM6T/I= github.com/beego/beego/v2 v2.3.0/go.mod h1:Ob/5BJ9fIKZLd4s9ZV3o9J6odkkIyL83et+p98gyYXo= diff --git a/oc-scheduler b/oc-scheduler index ab674d9..f7cc8b3 100755 Binary files a/oc-scheduler and b/oc-scheduler differ diff --git a/routers/commentsRouter.go b/routers/commentsRouter.go index 4a23c72..f1b69dd 100644 --- a/routers/commentsRouter.go +++ b/routers/commentsRouter.go @@ -61,13 +61,22 @@ func init() { Filters: nil, Params: nil}) - beego.GlobalControllerRouter["oc-scheduler/controllers:WorkflowExecutionController"] = append(beego.GlobalControllerRouter["oc-scheduler/controllers:WorkflowExecutionController"], + beego.GlobalControllerRouter["oc-scheduler/controllers:WorkflowSchedulerController"] = append(beego.GlobalControllerRouter["oc-scheduler/controllers:WorkflowSchedulerController"], beego.ControllerComments{ - Method: "ScheduleWorkflow", - Router: `/workflow/:id`, + Method: "Schedule", + Router: `/:id`, AllowHTTPMethods: []string{"post"}, MethodParams: param.Make(), Filters: nil, Params: nil}) + beego.GlobalControllerRouter["oc-scheduler/controllers:WorkflowSchedulerController"] = append(beego.GlobalControllerRouter["oc-scheduler/controllers:WorkflowSchedulerController"], + beego.ControllerComments{ + Method: "UnSchedule", + Router: `/:id`, + AllowHTTPMethods: []string{"delete"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + } diff --git a/routers/router.go b/routers/router.go index b908054..06a6588 100644 --- a/routers/router.go +++ b/routers/router.go @@ -18,6 +18,11 @@ func init() { beego.NSInclude( &controllers.WorkflowExecutionController{}, ), + beego.NSNamespace("/workflow", + beego.NSInclude( + &controllers.WorkflowSchedulerController{}, + ), + ), beego.NSNamespace("/version", beego.NSInclude( &controllers.VersionController{}, diff --git a/swagger/swagger.json b/swagger/swagger.json index 832a909..79a07ad 100644 --- a/swagger/swagger.json +++ b/swagger/swagger.json @@ -133,10 +133,40 @@ "/workflow/{id}": { "post": { "tags": [ - "oc-scheduler/controllersWorkflowExecutionController" + "workflow" ], "description": "schedule workflow\n\u003cbr\u003e", - "operationId": "WorkflowExecutionController.ScheduleWorkflow", + "operationId": "WorkflowSchedulerController.Schedule", + "parameters": [ + { + "in": "path", + "name": "id", + "description": "id execution", + "required": true, + "type": "string" + }, + { + "in": "body", + "name": "body", + "description": "The compute content", + "required": true, + "schema": { + "$ref": "#/definitions/models.compute" + } + } + ], + "responses": { + "200": { + "description": "{workspace} models.workspace" + } + } + }, + "delete": { + "tags": [ + "workflow" + ], + "description": "schedule workflow\n\u003cbr\u003e", + "operationId": "WorkflowSchedulerController.UnSchedule", "parameters": [ { "in": "path", @@ -197,6 +227,10 @@ "name": "oc-scheduler/controllersWorkflowExecutionController", "description": "Operations about workflow\n" }, + { + "name": "workflow", + "description": "Operations about workflow\n" + }, { "name": "version", "description": "VersionController operations for Version\n" diff --git a/swagger/swagger.yml b/swagger/swagger.yml index e2a5acf..545730d 100644 --- a/swagger/swagger.yml +++ b/swagger/swagger.yml @@ -117,11 +117,33 @@ paths: /workflow/{id}: post: tags: - - oc-scheduler/controllersWorkflowExecutionController + - workflow description: |- schedule workflow
- operationId: WorkflowExecutionController.ScheduleWorkflow + operationId: WorkflowSchedulerController.Schedule + parameters: + - in: path + name: id + description: id execution + required: true + type: string + - in: body + name: body + description: The compute content + required: true + schema: + $ref: '#/definitions/models.compute' + responses: + "200": + description: '{workspace} models.workspace' + delete: + tags: + - workflow + description: |- + schedule workflow +
+ operationId: WorkflowSchedulerController.UnSchedule parameters: - in: path name: id @@ -145,6 +167,9 @@ tags: - name: oc-scheduler/controllersWorkflowExecutionController description: | Operations about workflow +- name: workflow + description: | + Operations about workflow - name: version description: | VersionController operations for Version