diff --git a/Dockerfile b/Dockerfile index a46f314..c889443 100644 --- a/Dockerfile +++ b/Dockerfile @@ -20,11 +20,11 @@ FROM scratch WORKDIR /app -COPY --from=builder /app/oc-scheduler /usr/bin/ +COPY --from=builder /app/oc-peers /usr/bin/ COPY --from=builder /app/swagger /app/swagger -COPY docker_scheduler.json /etc/oc/scheduler.json +COPY docker_peers.json /etc/oc/peers.json EXPOSE 8080 -ENTRYPOINT ["oc-scheduler"] +ENTRYPOINT ["oc-peers"] diff --git a/README.md b/README.md index ab730f2..81311eb 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# oc-scheduler OpenCloud scheduler service. +# oc-peers OpenCloud scheduler service. Manages user schedulers diff --git a/conf/app.conf b/conf/app.conf index 929a516..da5091b 100644 --- a/conf/app.conf +++ b/conf/app.conf @@ -1,4 +1,4 @@ -appname = oc-scheduler +appname = oc-peers httpport = 8080 runmode = dev autorender = false diff --git a/controllers/peer.go b/controllers/peer.go new file mode 100644 index 0000000..de98525 --- /dev/null +++ b/controllers/peer.go @@ -0,0 +1,61 @@ +package controllers + +import ( + "encoding/json" + + oclib "cloud.o-forge.io/core/oc-lib" + beego "github.com/beego/beego/v2/server/web" +) + +// Operations about workflow +type PeerController struct { + beego.Controller +} + +// @Title Search +// @Description search workspace +// @Param search path string true "the word search you want to get" +// @Success 200 {workspace} models.workspace +// @router /search/:search [get] +func (o *PeerController) Search() { + // store and return Id or post with UUID + search := o.Ctx.Input.Param(":search") + o.Data["json"] = oclib.Search(nil, search, oclib.LibDataEnum(oclib.PEER)) + o.ServeJSON() +} + +// @Title Update +// @Description create peers +// @Param id path string true "the peer id you want to get" +// @Param body body models.peer true "The peer content" +// @Success 200 {object} models.peer +// @router /:id [put] +func (o *PeerController) Put() { + // store and return Id or post with UUID + var res map[string]interface{} + id := o.Ctx.Input.Param(":id") + json.Unmarshal(o.Ctx.Input.CopyBody(10000), &res) + data := oclib.UpdateOne(oclib.LibDataEnum(oclib.PEER), res, id, nil) + o.Data["json"] = data + o.ServeJSON() +} + +// @Title GetAll +// @Description find all peer +// @Success 200 {peer} models.peer +// @router / [get] +func (o *PeerController) GetAll() { + o.Data["json"] = oclib.LoadAll(oclib.LibDataEnum(oclib.PEER)) + o.ServeJSON() +} + +// @Title Get +// @Description find peer by peerid +// @Param id path string true "the peer id you want to get" +// @Success 200 {peer} models.peer +// @router /:id [get] +func (o *PeerController) Get() { + id := o.Ctx.Input.Param(":id") + o.Data["json"] = oclib.LoadOne(oclib.LibDataEnum(oclib.PEER), id) + o.ServeJSON() +} diff --git a/controllers/status.go b/controllers/status.go new file mode 100644 index 0000000..6287f69 --- /dev/null +++ b/controllers/status.go @@ -0,0 +1,52 @@ +package controllers + +import ( + "encoding/json" + + oclib "cloud.o-forge.io/core/oc-lib" + "cloud.o-forge.io/core/oc-lib/tools" + beego "github.com/beego/beego/v2/server/web" +) + +type State int + +const ( + ALIVE State = iota + REDUCED_SERVICE + DB_FALLOUT + DEAD +) + +func (s State) String() string { + return [...]string{"alive", "reduced service", "database fallout", "dead"}[s] +} + +// Operations about workflow +type StatusController struct { + beego.Controller +} + +// @Title Status +// @Description get peer status if it's alive +// @Param body body list of addresses true "The addresses list" +// @Success 200 {status} models.status +// @router / [post] +func (o *StatusController) Status() { + var address []string + json.Unmarshal(o.Ctx.Input.CopyBody(10000), &address) + if len(address) == 0 { // default if nothing is send in body + for k, v := range oclib.GetPaths() { + address = append(address, "http://"+k.API()+v+"/oc") + } + } + api := tools.API{} + state, code, err := api.CheckRemoteAPIs(address) + o.Data["json"] = map[string]interface{}{ + "data": map[string]string{ + "state": state.String(), + }, + "code": code, + "error": err.Error(), + } + o.ServeJSON() +} diff --git a/controllers/workflow_execution.go b/controllers/workflow_execution.go deleted file mode 100644 index 943cede..0000000 --- a/controllers/workflow_execution.go +++ /dev/null @@ -1,56 +0,0 @@ -package controllers - -import ( - "time" - - oclib "cloud.o-forge.io/core/oc-lib" - dbs "cloud.o-forge.io/core/oc-lib/dbs" - beego "github.com/beego/beego/v2/server/web" - "go.mongodb.org/mongo-driver/bson/primitive" -) - -// Operations about workflow -type WorkflowExecutionController struct { - beego.Controller -} - -// @Title Search -// @Description search workspace -// @Param start_date path string true "the word search you want to get" -// @Param end_date path string true "the word search you want to get" -// @Success 200 {workspace} models.workspace -// @router /search/:start_date/:end_date [get] -func (o *WorkflowExecutionController) Search() { - // store and return Id or post with UUID - start_date, _ := time.Parse("2006-01-02", o.Ctx.Input.Param(":start_date")) - end_date, _ := time.Parse("2006-01-02", o.Ctx.Input.Param(":end_date")) - sd := primitive.NewDateTimeFromTime(start_date) - ed := primitive.NewDateTimeFromTime(end_date) - f := dbs.Filters{ - And: map[string][]dbs.Filter{ - "execution_date": {{Operator: "gte", Value: sd}, {Operator: "lte", Value: ed}}, - }, - } - o.Data["json"] = oclib.Search(&f, "", oclib.LibDataEnum(oclib.WORKFLOW_EXECUTION)) - o.ServeJSON() -} - -// @Title GetAll -// @Description find workflow by workflowid -// @Success 200 {workflow} models.workflow -// @router / [get] -func (o *WorkflowExecutionController) GetAll() { - o.Data["json"] = oclib.LoadAll(oclib.LibDataEnum(oclib.WORKFLOW_EXECUTION)) - o.ServeJSON() -} - -// @Title Get -// @Description find workflow by workflowid -// @Param id path string true "the workflowid you want to get" -// @Success 200 {workflow} models.workflow -// @router /:id [get] -func (o *WorkflowExecutionController) Get() { - id := o.Ctx.Input.Param(":id") - o.Data["json"] = oclib.LoadOne(oclib.LibDataEnum(oclib.WORKFLOW_EXECUTION), id) - o.ServeJSON() -} diff --git a/docker-compose.yml b/docker-compose.yml index fb76fdc..fe15f53 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,13 +1,13 @@ version: '3.4' services: - oc-scheduler: + oc-peers: environment: - MONGO_DATABASE=DC_myDC - image: 'oc-scheduler:latest' + image: 'oc-peers:latest' ports: - - 8090:8080 - container_name: oc-scheduler + - 8093:8080 + container_name: oc-peers networks: - catalog diff --git a/docker_scheduler.json b/docker_peers.json similarity index 100% rename from docker_scheduler.json rename to docker_peers.json diff --git a/go.mod b/go.mod index 3283e78..d48ec86 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module oc-scheduler +module oc-peers go 1.22.0 @@ -11,7 +11,7 @@ require ( ) require ( - cloud.o-forge.io/core/oc-lib v0.0.0-20240808150044-2ae15c720ab6 // indirect + cloud.o-forge.io/core/oc-lib v0.0.0-20240821140757-39030a0a80e8 // indirect filippo.io/edwards25519 v1.1.0 // indirect github.com/beego/bee/v2 v2.1.0 // indirect github.com/beorn7/perks v1.0.1 // indirect @@ -50,6 +50,9 @@ require ( github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/montanaflynn/stats v0.7.1 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/nats-io/nats.go v1.37.0 // indirect + github.com/nats-io/nkeys v0.4.7 // indirect + github.com/nats-io/nuid v1.0.1 // indirect github.com/pelletier/go-toml v1.9.5 // indirect github.com/pelletier/go-toml/v2 v2.2.2 // indirect github.com/prometheus/client_golang v1.19.1 // indirect @@ -87,7 +90,7 @@ require ( golang.org/x/mod v0.19.0 // indirect golang.org/x/net v0.28.0 // indirect golang.org/x/sync v0.8.0 // indirect - golang.org/x/sys v0.23.0 // indirect + golang.org/x/sys v0.24.0 // indirect golang.org/x/text v0.17.0 // indirect golang.org/x/tools v0.23.0 // indirect google.golang.org/protobuf v1.34.2 // indirect diff --git a/go.sum b/go.sum index d3b5d6b..ba7559d 100644 --- a/go.sum +++ b/go.sum @@ -154,6 +154,12 @@ cloud.o-forge.io/core/oc-lib v0.0.0-20240808142619-8dc009564a13 h1:JSkXsMjScEOhi cloud.o-forge.io/core/oc-lib v0.0.0-20240808142619-8dc009564a13/go.mod h1:V5EL+NV2s9P1/BcFm3/icfLeBYVVMLl1Z0F0eecJZGo= cloud.o-forge.io/core/oc-lib v0.0.0-20240808150044-2ae15c720ab6 h1:uePDhEWN1kcF3XByLH/WTb/+wPDGe2cuG/jG0VqJOGw= cloud.o-forge.io/core/oc-lib v0.0.0-20240808150044-2ae15c720ab6/go.mod h1:V5EL+NV2s9P1/BcFm3/icfLeBYVVMLl1Z0F0eecJZGo= +cloud.o-forge.io/core/oc-lib v0.0.0-20240821082117-b7ecea25ebf0 h1:0iUOyKVa+wI1tOuBQ1WpbTYqHHFklcjtpdJ3QrmHIW8= +cloud.o-forge.io/core/oc-lib v0.0.0-20240821082117-b7ecea25ebf0/go.mod h1:1hhYh5QWAbYw9cKplQ0ZD9PMgU8t6gPqiYF8sldv1HU= +cloud.o-forge.io/core/oc-lib v0.0.0-20240821121228-c14e06744938 h1:gMl7U5D+tZ4ui1HE8n4xXOLFBLM/69gxz08FKdsnzm4= +cloud.o-forge.io/core/oc-lib v0.0.0-20240821121228-c14e06744938/go.mod h1:1hhYh5QWAbYw9cKplQ0ZD9PMgU8t6gPqiYF8sldv1HU= +cloud.o-forge.io/core/oc-lib v0.0.0-20240821140757-39030a0a80e8 h1:y4hngS1bedPKYXecTCcZk2WkuQNFazD11rMng9dmIzI= +cloud.o-forge.io/core/oc-lib v0.0.0-20240821140757-39030a0a80e8/go.mod h1:1hhYh5QWAbYw9cKplQ0ZD9PMgU8t6gPqiYF8sldv1HU= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= @@ -414,6 +420,12 @@ github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/nats-io/nats.go v1.37.0 h1:07rauXbVnnJvv1gfIyghFEo6lUcYRY0WXc3x7x0vUxE= +github.com/nats-io/nats.go v1.37.0/go.mod h1:Ubdu4Nh9exXdSz0RVWRFBbRfrbSxOYd26oF0wkWclB8= +github.com/nats-io/nkeys v0.4.7 h1:RwNJbbIdYCoClSDNY7QVKZlyb/wfT6ugvFCiKy6vDvI= +github.com/nats-io/nkeys v0.4.7/go.mod h1:kqXRgRDPlGy7nGaEDMuYzmiJCIAAWDK0IMBtDmGD0nc= +github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/ogier/pflag v0.0.1/go.mod h1:zkFki7tvTa0tafRvTBIZTvzYyAu6kQhPZFnshFFPE+g= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= @@ -681,6 +693,8 @@ golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM= golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg= +golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/main.go b/main.go index bbcb9d5..36bdfe4 100644 --- a/main.go +++ b/main.go @@ -1,46 +1,49 @@ package main import ( - _ "oc-scheduler/routers" + _ "oc-peers/routers" oclib "cloud.o-forge.io/core/oc-lib" + "cloud.o-forge.io/core/oc-lib/tools" beego "github.com/beego/beego/v2/server/web" "github.com/goraz/onion" ) -const defaultConfigFile = "/etc/oc/scheduler.json" -const localConfigFile = "./docker_scheduler.json" +const defaultConfigFile = "/etc/oc/peers.json" func main() { configFile := "" var o *onion.Onion l3 := onion.NewEnvLayerPrefix("_", "OCSCHEDULER_") - l1, err := onion.NewFileLayer(localConfigFile, nil) - if err == nil { - configFile = localConfigFile - } l2, err := onion.NewFileLayer(defaultConfigFile, nil) if err == nil { configFile = defaultConfigFile } - if configFile == "" { + if configFile == "" || l2 == nil { o = onion.New(l3) - } else if l1 == nil && l2 == nil { - o = onion.New(l1, l2, l3) - } else if l1 == nil { + } else { o = onion.New(l2, l3) - } else if l2 == nil { - o = onion.New(l1, l3) } - oclib.SetConfig( + tools.SetConfig( o.GetStringDefault("MONGO_URL", "mongodb://127.0.0.1:27017"), o.GetStringDefault("MONGO_DATABASE", "DC_myDC"), + "", ) - oclib.Init("oc-scheduler") + oclib.Init("oc-peers") + + oclib.AddPath(oclib.LibDataEnum(oclib.BOOKING), o.GetStringDefault("BOOKING_URL", ":8092")) + oclib.AddPath(oclib.LibDataEnum(oclib.WORKFLOW), o.GetStringDefault("WORKFLOW_URL", ":8088")) + oclib.AddPath(oclib.LibDataEnum(oclib.WORKFLOW), o.GetStringDefault("WORKSPACE_URL", ":8089")) + oclib.AddPath(oclib.LibDataEnum(oclib.SHARED_WORKSPACE), o.GetStringDefault("SHARED_WORKSPACE_URL", ":8091")) + + oclib.AddPath(oclib.LibDataEnum(oclib.DATACENTER_RESOURCE), o.GetStringDefault("CATALOG_URL", ":8087")) + oclib.AddPath(oclib.LibDataEnum(oclib.DATA_RESOURCE), o.GetStringDefault("CATALOG_URL", ":8087")) + oclib.AddPath(oclib.LibDataEnum(oclib.STORAGE_RESOURCE), o.GetStringDefault("CATALOG_URL", ":8087")) + oclib.AddPath(oclib.LibDataEnum(oclib.WORKFLOW_RESOURCE), o.GetStringDefault("CATALOG_URL", ":8087")) + oclib.AddPath(oclib.LibDataEnum(oclib.PROCESSING_RESOURCE), o.GetStringDefault("CATALOG_URL", ":8087")) + // Normal beego init - //if beego.BConfig.RunMode == "dev" { beego.BConfig.WebConfig.DirectoryIndex = true beego.BConfig.WebConfig.StaticDir["/swagger"] = "swagger" - //} beego.Run() } diff --git a/routers/commentsRouter.go b/routers/commentsRouter.go index 72180ba..f3479f1 100644 --- a/routers/commentsRouter.go +++ b/routers/commentsRouter.go @@ -7,7 +7,7 @@ import ( func init() { - beego.GlobalControllerRouter["oc-scheduler/controllers:VersionController"] = append(beego.GlobalControllerRouter["oc-scheduler/controllers:VersionController"], + beego.GlobalControllerRouter["oc-peers/controllers:PeerController"] = append(beego.GlobalControllerRouter["oc-peers/controllers:PeerController"], beego.ControllerComments{ Method: "GetAll", Router: `/`, @@ -16,16 +16,16 @@ func init() { Filters: nil, Params: nil}) - beego.GlobalControllerRouter["oc-scheduler/controllers:WorkflowExecutionController"] = append(beego.GlobalControllerRouter["oc-scheduler/controllers:WorkflowExecutionController"], + beego.GlobalControllerRouter["oc-peers/controllers:PeerController"] = append(beego.GlobalControllerRouter["oc-peers/controllers:PeerController"], beego.ControllerComments{ - Method: "GetAll", - Router: `/`, - AllowHTTPMethods: []string{"get"}, + Method: "Put", + Router: `/:id`, + AllowHTTPMethods: []string{"put"}, MethodParams: param.Make(), Filters: nil, Params: nil}) - beego.GlobalControllerRouter["oc-scheduler/controllers:WorkflowExecutionController"] = append(beego.GlobalControllerRouter["oc-scheduler/controllers:WorkflowExecutionController"], + beego.GlobalControllerRouter["oc-peers/controllers:PeerController"] = append(beego.GlobalControllerRouter["oc-peers/controllers:PeerController"], beego.ControllerComments{ Method: "Get", Router: `/:id`, @@ -34,10 +34,28 @@ func init() { Filters: nil, Params: nil}) - beego.GlobalControllerRouter["oc-scheduler/controllers:WorkflowExecutionController"] = append(beego.GlobalControllerRouter["oc-scheduler/controllers:WorkflowExecutionController"], + beego.GlobalControllerRouter["oc-peers/controllers:PeerController"] = append(beego.GlobalControllerRouter["oc-peers/controllers:PeerController"], beego.ControllerComments{ Method: "Search", - Router: `/search/:start_date/:end_date`, + Router: `/search/:search`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + + beego.GlobalControllerRouter["oc-peers/controllers:StatusController"] = append(beego.GlobalControllerRouter["oc-peers/controllers:StatusController"], + beego.ControllerComments{ + Method: "Get", + Router: `/`, + AllowHTTPMethods: []string{"post"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + + beego.GlobalControllerRouter["oc-peers/controllers:VersionController"] = append(beego.GlobalControllerRouter["oc-peers/controllers:VersionController"], + beego.ControllerComments{ + Method: "GetAll", + Router: `/`, AllowHTTPMethods: []string{"get"}, MethodParams: param.Make(), Filters: nil, diff --git a/routers/router.go b/routers/router.go index d9f63d8..18be1c4 100644 --- a/routers/router.go +++ b/routers/router.go @@ -8,16 +8,21 @@ package routers import ( - "oc-scheduler/controllers" + "oc-peers/controllers" beego "github.com/beego/beego/v2/server/web" ) func init() { ns := beego.NewNamespace("/oc/", - beego.NSNamespace("/workflow_execution", + beego.NSNamespace("/peer/status", beego.NSInclude( - &controllers.WorkflowExecutionController{}, + &controllers.StatusController{}, + ), + ), + beego.NSNamespace("/peer", + beego.NSInclude( + &controllers.PeerController{}, ), ), beego.NSNamespace("/version", diff --git a/tests/default_test.go b/tests/default_test.go index 11b6219..0ea9568 100644 --- a/tests/default_test.go +++ b/tests/default_test.go @@ -3,19 +3,19 @@ package test import ( "net/http" "net/http/httptest" - "testing" - "runtime" + _ "oc-peers/routers" "path/filepath" - _ "oc-scheduler/routers" + "runtime" + "testing" - beego "github.com/beego/beego/v2/server/web" "github.com/beego/beego/v2/core/logs" + beego "github.com/beego/beego/v2/server/web" . "github.com/smartystreets/goconvey/convey" ) func init() { _, file, _, _ := runtime.Caller(0) - apppath, _ := filepath.Abs(filepath.Dir(filepath.Join(file, ".." + string(filepath.Separator)))) + apppath, _ := filepath.Abs(filepath.Dir(filepath.Join(file, ".."+string(filepath.Separator)))) beego.TestBeegoInit(apppath) } @@ -28,12 +28,11 @@ func TestGet(t *testing.T) { logs.Info("testing", "TestGet", "Code[%d]\n%s", w.Code, w.Body.String()) Convey("Subject: Test Station Endpoint\n", t, func() { - Convey("Status Code Should Be 200", func() { - So(w.Code, ShouldEqual, 200) - }) - Convey("The Result Should Not Be Empty", func() { - So(w.Body.Len(), ShouldBeGreaterThan, 0) - }) + Convey("Status Code Should Be 200", func() { + So(w.Code, ShouldEqual, 200) + }) + Convey("The Result Should Not Be Empty", func() { + So(w.Body.Len(), ShouldBeGreaterThan, 0) + }) }) } -