From 153e5768275fb8b5118d210abf35bfdeb63542e4 Mon Sep 17 00:00:00 2001 From: ycc Date: Wed, 18 Oct 2023 11:01:41 +0200 Subject: [PATCH] compose upgrade --- Dockerfile | 8 ++++--- README.md | 14 +++++++++++- controllers/schedule.go | 2 +- models/computing.go | 28 +++++++++++++++-------- models/workflow.go | 3 ++- scripts/local_imgs/Thumbs.db | Bin 0 -> 19456 bytes scripts/local_imgs/Thumbs.db:encryptable | 0 scripts/populate_models.sh | 2 +- 8 files changed, 40 insertions(+), 17 deletions(-) create mode 100644 scripts/local_imgs/Thumbs.db create mode 100644 scripts/local_imgs/Thumbs.db:encryptable diff --git a/Dockerfile b/Dockerfile index c76708d..332e735 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,7 +12,11 @@ EXPOSE 49618 WORKDIR /go/src/oc-catalog ####################################################### -RUN go get github.com/beego/bee/v2 + +COPY go.mod . +COPY go.sum . + +RUN go get github.com/beego/bee/v2 && go install github.com/beego/bee/v2@master # Manually download swagger during build RUN ["/bin/bash", "-c", \ @@ -21,8 +25,6 @@ RUN ["/bin/bash", "-c", \ curl -sL https://github.com/beego/swagger/archive/v3.tar.gz | tar xvvvz --overwrite -C swagger --strip-components=1"] -COPY go.mod . -COPY go.sum . RUN go mod download -x # COPY . . diff --git a/README.md b/README.md index ccfb89a..781d0cf 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,17 @@ # OC Catalog -OpenCloud Catalog API +## OpenCloud Catalog API +Uses the Beego framework + +To install the Beego bee command : + + go install github.com/beego/bee/v2@master + +To build and run : + + go mod tidy + bee run -downdoc=true -gendoc=true ## Full deploy @@ -11,6 +21,8 @@ Deploy with docker: and populate DB (or other scripts) with: `docker exec -it oc-catalog_oc-catalog_1 ./scripts/populate_models.sh ./scripts/demo.json` +or out of docker `./scripts/populate_models.sh ./scripts/demo.json` + ## Dev Start DB with `docker-compose up -d` and run the API with `bee run -downdoc=true -gendoc=true` diff --git a/controllers/schedule.go b/controllers/schedule.go index 545323c..28efc05 100644 --- a/controllers/schedule.go +++ b/controllers/schedule.go @@ -94,7 +94,7 @@ func (u *ScheduleController) CheckSchedule(cron string, duration uint, startDate // @Param startDate query time.Time true "Start date" // @Param stopDate query time.Time true "End date" // @Success 200 {object} []models.ScheduleDB -// @Success 201 Too much elements within the range of dates +// @Success 201 Too many elements within the range of dates // @Failure 403 Authentication issue // @Failure 400 Other error. Check the output // // @Security jwtAPIToken diff --git a/models/computing.go b/models/computing.go index 5169077..fb0aac2 100644 --- a/models/computing.go +++ b/models/computing.go @@ -27,22 +27,30 @@ type RepositoryModel struct { } type ComputingNEWModel struct { - Description string `json:"description" required:"true"` + Description string `json:"description,omitempty" required:"true"` Name string `json:"name,omitempty" required:"true" validate:"required" description:"Name of the computing"` - ShortDescription string `json:"short_description" required:"true" validate:"required"` - Logo string `json:"logo" required:"true" validate:"required"` + ShortDescription string `json:"short_description,omitempty" required:"true" validate:"required"` + Logo string `json:"logo,omitempty" required:"true" validate:"required"` Type string `json:"type,omitempty" required:"true"` - Owner string `json:"owner"` - License string `json:"license"` - Price uint `json:"price"` + Owner string `json:"owner,omitempty"` + License string `json:"license,omitempty"` + Price uint `json:"price,omitempty"` - ExecutionRequirements ExecutionRequirementsModel `json:"execution_requirements"` + ExecutionRequirements ExecutionRequirementsModel `json:"execution_requirements,omitempty"` - Dinputs []string - Doutputs []string + Dinputs []string `json:"dinputs,omitempty"` + Doutputs []string `json:"doutputs,omitempty"` - Repository RepositoryModel `json:"repository"` + Image string `json:"image,omitempty"` + Command string `json:"command,omitempty"` + Arguments []string `json:"arguments,omitempty"` + Environment []string `json:"environment,omitempty"` + Ports []string `json:"ports,omitempty"` + + CustomDeployment string `json:"custom_deployment,omitempty"` + + Repository RepositoryModel `json:"repository,omitempty"` } type ComputingModel struct { diff --git a/models/workflow.go b/models/workflow.go index 526ee2b..5a39887 100644 --- a/models/workflow.go +++ b/models/workflow.go @@ -506,7 +506,8 @@ func ParseMxGraph(username, workflowName, xmlData string) (err error, mxissues [ } if currentWorkflow.Schedules.IsBooked { - return errors.New("Can't modify a booked workflow"), nil + //well, let's allow that + //return errors.New("Can't modify a booked workflow"), nil } var xmlModel MxGraphModel diff --git a/scripts/local_imgs/Thumbs.db b/scripts/local_imgs/Thumbs.db new file mode 100644 index 0000000000000000000000000000000000000000..cf5a03d727f93456863e486cad73bb04049744e4 GIT binary patch literal 19456 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