initial commit
4
.dockerignore
Normal file
@ -0,0 +1,4 @@
|
||||
Dockerfile
|
||||
swagger
|
||||
docker-compose.*
|
||||
routers/commentsRouter*
|
34
.gitignore
vendored
@ -1,23 +1,15 @@
|
||||
# ---> Go
|
||||
# If you prefer the allow list template instead of the deny list, see community template:
|
||||
# https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore
|
||||
#
|
||||
# Binaries for programs and plugins
|
||||
*.exe
|
||||
*.exe~
|
||||
*.dll
|
||||
*.so
|
||||
*.dylib
|
||||
lastupdate.tmp
|
||||
oc-catalog
|
||||
swagger
|
||||
routers/commentsRouter*
|
||||
.vscode
|
||||
main
|
||||
selfapi_bak
|
||||
|
||||
# Test binary, built with `go test -c`
|
||||
*.test
|
||||
|
||||
# Output of the go coverage tool, specifically when used with LiteIDE
|
||||
*.out
|
||||
|
||||
# Dependency directories (remove the comment below to include it)
|
||||
# vendor/
|
||||
|
||||
# Go workspace file
|
||||
go.work
|
||||
# Scripts should contain isolated data models to populate. Just one file will be used as demo ref
|
||||
scripts/*
|
||||
!scripts/populate_models.sh
|
||||
!scripts/demo*.json
|
||||
!scripts/local_imgs
|
||||
|
||||
!scripts/generate_selfapi.sh
|
59
Dockerfile
Normal file
@ -0,0 +1,59 @@
|
||||
FROM golang as builder
|
||||
|
||||
LABEL maintainer="Valentin KIVACHUK BURDA"
|
||||
|
||||
ENV DOCKER_ENVIRONMENT=true
|
||||
ENV CGO_ENABLED=0
|
||||
ENV GOOS=linux
|
||||
ENV GO111MODULE=on
|
||||
|
||||
EXPOSE 49618
|
||||
|
||||
WORKDIR /go/src/oc-catalog
|
||||
|
||||
#######################################################
|
||||
RUN go get github.com/beego/bee/v2
|
||||
|
||||
# Manually download swagger during build
|
||||
RUN ["/bin/bash", "-c", \
|
||||
"set -eo pipefail; \
|
||||
mkdir -p swagger; \
|
||||
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 . .
|
||||
COPY main.go go.mod go.sum ./
|
||||
|
||||
COPY controllers controllers
|
||||
COPY models models
|
||||
COPY routers routers
|
||||
COPY selfapi selfapi
|
||||
COPY services services
|
||||
COPY conf conf
|
||||
COPY scripts scripts
|
||||
|
||||
# RUN go build -a -tags netgo -ldflags '-w -extldflags "-static"' -installsuffix cgo .
|
||||
|
||||
RUN bee generate docs
|
||||
|
||||
# COPY . .
|
||||
|
||||
|
||||
# FROM golang
|
||||
|
||||
# WORKDIR /go/src/oc-catalog
|
||||
|
||||
# COPY --from=builder /go/src/oc-catalog .
|
||||
|
||||
ENV DOCKER_ENVIRONMENT=true
|
||||
|
||||
RUN go build .
|
||||
|
||||
# UglyFix: Generate comments from swagger
|
||||
RUN timeout 10 bee run -runargs test || exit 0
|
||||
|
||||
CMD [ "bee", "run", "-gendoc=true" ]
|
25
README.md
@ -1,2 +1,25 @@
|
||||
# oc-catalog
|
||||
# OC Catalog
|
||||
|
||||
OpenCloud Catalog API
|
||||
|
||||
|
||||
## Full deploy
|
||||
|
||||
Deploy with docker:
|
||||
`docker-compose -f docker-compose.yml -f docker-compose.backend.yml up --build`
|
||||
|
||||
and populate DB (or other scripts) with:
|
||||
`docker exec -it oc-catalog_oc-catalog_1 ./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`
|
||||
|
||||
|
||||
## Multinode
|
||||
|
||||
Deploy
|
||||
`docker-compose -f docker-compose.yml -f docker-compose.backend.yml -f docker-compose.multi.yml up --build`
|
||||
|
||||
Populate
|
||||
`./scripts/multinode.sh ./scripts/demo.json`
|
17
conf/app.conf
Normal file
@ -0,0 +1,17 @@
|
||||
appname = oc-catalog
|
||||
httpport = 49618
|
||||
runmode = dev
|
||||
autorender = false
|
||||
copyrequestbody = true
|
||||
|
||||
EnableDocs = true
|
||||
SessionOn = true
|
||||
|
||||
DCNAME = "DC_myDC"
|
||||
DBPOINT = "demo_06042021"
|
||||
|
||||
[mongodb]
|
||||
url = mongodb://127.0.0.1:27017/beego-demo
|
||||
|
||||
[mongodb_docker]
|
||||
url = mongodb://mongo:27017/beego-demo
|
77
controllers/computing.go
Normal file
@ -0,0 +1,77 @@
|
||||
package controllers
|
||||
|
||||
import (
|
||||
"cloud.o-forge.io/core/oc-catalog/models"
|
||||
|
||||
beego "github.com/beego/beego/v2/server/web"
|
||||
)
|
||||
|
||||
// All operations related to the rType computing
|
||||
type ComputingController struct {
|
||||
beego.Controller
|
||||
}
|
||||
|
||||
// @Title Get computing by ID
|
||||
// @Description Find a computing resource based on ID
|
||||
// @Param ID path string true "The ID of the resource"
|
||||
// @Success 200 {object} models.ComputingModel
|
||||
// @Failure 403 ID is empty
|
||||
// @router /:ID [get]
|
||||
func (o *ComputingController) GetOneComputing(ID string) {
|
||||
if ID != "" {
|
||||
ob, err := models.GetOneComputing(ID)
|
||||
if err != nil {
|
||||
o.Data["json"] = err.Error()
|
||||
} else {
|
||||
o.Data["json"] = ob
|
||||
}
|
||||
}
|
||||
o.ServeJSON()
|
||||
}
|
||||
|
||||
// @Title Add computing
|
||||
// @Description Submit a computing object
|
||||
// @Param body body models.ComputingNEWModel true "The object content"
|
||||
// @Success 200 {string} ID
|
||||
// @Failure 403 Missing body or fields
|
||||
// @router / [post]
|
||||
func (o *ComputingController) PostComputing(body models.ComputingNEWModel) {
|
||||
err := validate.Struct(body)
|
||||
// validationErrors := err.(validator.ValidationErrors)
|
||||
|
||||
if err != nil {
|
||||
o.Data["json"] = err.Error()
|
||||
o.Ctx.Output.Status = 403
|
||||
o.ServeJSON()
|
||||
return
|
||||
}
|
||||
|
||||
ID, err := models.PostOneComputing(body)
|
||||
if err != nil {
|
||||
o.Ctx.Output.SetStatus(500)
|
||||
return
|
||||
}
|
||||
|
||||
o.Data["json"] = map[string]string{"ID": ID}
|
||||
o.ServeJSON()
|
||||
}
|
||||
|
||||
// @Title Get multiple computing by IDs
|
||||
// @Description Return Computing objects if found in the DB. Not found IDs will be ignored
|
||||
// @Param IDs path []string true "List of computing IDs"
|
||||
// @Success 200 {object} []models.ComputingModel
|
||||
// @Failure 403 IDs are empty
|
||||
// @router /multi/:IDs [get]
|
||||
func (o *ComputingController) GetMultipleComputing(IDs []string) {
|
||||
if len(IDs) != 0 {
|
||||
ob, err := models.GetMultipleComputing(IDs)
|
||||
if err != nil {
|
||||
o.Ctx.Output.SetStatus(500)
|
||||
} else {
|
||||
o.Data["json"] = ob
|
||||
}
|
||||
} else {
|
||||
o.Ctx.Output.SetStatus(403)
|
||||
}
|
||||
o.ServeJSON()
|
||||
}
|
85
controllers/data.go
Normal file
@ -0,0 +1,85 @@
|
||||
package controllers
|
||||
|
||||
import (
|
||||
"cloud.o-forge.io/core/oc-catalog/models"
|
||||
|
||||
beego "github.com/beego/beego/v2/server/web"
|
||||
"github.com/go-playground/validator/v10"
|
||||
)
|
||||
|
||||
// All operations related to the rType data
|
||||
type DataController struct {
|
||||
beego.Controller
|
||||
}
|
||||
|
||||
var validate *validator.Validate
|
||||
|
||||
func init() {
|
||||
validate = validator.New()
|
||||
}
|
||||
|
||||
// @Title Get data by ID
|
||||
// @Description Find rType data based on ID
|
||||
// @Param ID path string true "The ID of the data resource"
|
||||
// @Success 200 {object} models.DataModel
|
||||
// @Failure 403 ID is empty
|
||||
// @router /:ID [get]
|
||||
func (o *DataController) GetOneData(ID string) {
|
||||
if ID != "" {
|
||||
ob, err := models.GetOneData(ID)
|
||||
if err != nil {
|
||||
o.Ctx.Output.SetStatus(500)
|
||||
} else {
|
||||
o.Data["json"] = ob
|
||||
}
|
||||
} else {
|
||||
o.Ctx.Output.SetStatus(403)
|
||||
}
|
||||
o.ServeJSON()
|
||||
}
|
||||
|
||||
// @Title Get multiple data by IDs
|
||||
// @Description Return Data object if found in the DB. Not found IDs will be ignored
|
||||
// @Param IDs path []string true "List of data IDs"
|
||||
// @Success 200 {object} []models.DataModel
|
||||
// @Failure 403 IDs are empty
|
||||
// @router /multi/:IDs [get]
|
||||
func (o *DataController) GetMultipleData(IDs []string) {
|
||||
if len(IDs) != 0 {
|
||||
ob, err := models.GetMultipleData(IDs)
|
||||
if err != nil {
|
||||
o.Ctx.Output.SetStatus(500)
|
||||
} else {
|
||||
o.Data["json"] = ob
|
||||
}
|
||||
} else {
|
||||
o.Ctx.Output.SetStatus(403)
|
||||
}
|
||||
o.ServeJSON()
|
||||
}
|
||||
|
||||
// @Title Create Data
|
||||
// @Description Submit data object
|
||||
// @Param body body models.DataNEWModel true "The object content"
|
||||
// @Success 200 {string} ID
|
||||
// @Failure 403 Missing body or fields
|
||||
// @router / [post]
|
||||
func (o *DataController) PostData(body models.DataNEWModel) {
|
||||
err := validate.Struct(body)
|
||||
// validationErrors := err.(validator.ValidationErrors)
|
||||
|
||||
if err != nil {
|
||||
o.Ctx.Output.Status = 403
|
||||
o.ServeJSON()
|
||||
return
|
||||
}
|
||||
|
||||
ID, err := models.PostOneData(body)
|
||||
if err != nil {
|
||||
o.Ctx.Output.SetStatus(500)
|
||||
return
|
||||
}
|
||||
|
||||
o.Data["json"] = map[string]string{"ID": ID}
|
||||
o.ServeJSON()
|
||||
}
|
82
controllers/datacenter.go
Normal file
@ -0,0 +1,82 @@
|
||||
package controllers
|
||||
|
||||
import (
|
||||
"cloud.o-forge.io/core/oc-catalog/models"
|
||||
|
||||
beego "github.com/beego/beego/v2/server/web"
|
||||
"github.com/go-playground/validator/v10"
|
||||
)
|
||||
|
||||
// DatacenterController operations about datacenters
|
||||
type DatacenterController struct {
|
||||
beego.Controller
|
||||
}
|
||||
|
||||
func init() {
|
||||
validate = validator.New()
|
||||
}
|
||||
|
||||
// @Title Get multiple datacenters by IDs
|
||||
// @Description Return Datacenter objects if found in the DB. Not found IDs will be ignored
|
||||
// @Param IDs path []string true "List of datacenter IDs"
|
||||
// @Success 200 {object} []models.ComputingModel
|
||||
// @Failure 403 IDs are empty
|
||||
// @router /multi/:IDs [get]
|
||||
func (o *DatacenterController) GetMultipleDatacenter(IDs []string) {
|
||||
if len(IDs) != 0 {
|
||||
ob, err := models.GetMultipleDatacenter(IDs)
|
||||
if err != nil {
|
||||
o.Ctx.Output.SetStatus(500)
|
||||
} else {
|
||||
o.Data["json"] = ob
|
||||
}
|
||||
} else {
|
||||
o.Ctx.Output.SetStatus(403)
|
||||
}
|
||||
o.ServeJSON()
|
||||
}
|
||||
|
||||
// @Title GetOneDatacenter
|
||||
// @Description find datacenter by ID
|
||||
// @Param ID path string true "the ID you want to get"
|
||||
// @Success 200 {object} models.DatacenterModel
|
||||
// @Failure 403 ID is empty
|
||||
// @router /:ID [get]
|
||||
func (o *DatacenterController) GetOneDatacenter(ID string) {
|
||||
if ID != "" {
|
||||
ob, err := models.GetOneDatacenter(ID)
|
||||
if err != nil {
|
||||
o.Data["json"] = err.Error()
|
||||
} else {
|
||||
o.Data["json"] = ob
|
||||
}
|
||||
}
|
||||
o.ServeJSON()
|
||||
}
|
||||
|
||||
// @Title Create Datacenter
|
||||
// @Description submit Datacenter object
|
||||
// @Param body body models.DatacenterNEWModel true "The object content"
|
||||
// @Success 200 {string} models.DatacenterModel
|
||||
// @Failure 403 Missing body or fields
|
||||
// @router / [post]
|
||||
func (o *DatacenterController) PostDatacenter(body models.DatacenterNEWModel) {
|
||||
err := validate.Struct(body)
|
||||
// validationErrors := err.(validator.ValidationErrors)
|
||||
|
||||
if err != nil {
|
||||
o.Data["json"] = err.Error()
|
||||
o.Ctx.Output.Status = 403
|
||||
o.ServeJSON()
|
||||
return
|
||||
}
|
||||
|
||||
ID, err := models.PostOneDatacenter(body)
|
||||
if err != nil {
|
||||
o.Ctx.Output.SetStatus(500)
|
||||
return
|
||||
}
|
||||
|
||||
o.Data["json"] = map[string]string{"ID": ID}
|
||||
o.ServeJSON()
|
||||
}
|
163
controllers/schedule.go
Normal file
@ -0,0 +1,163 @@
|
||||
package controllers
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"cloud.o-forge.io/core/oc-catalog/models"
|
||||
"github.com/beego/beego/v2/core/logs"
|
||||
beego "github.com/beego/beego/v2/server/web"
|
||||
)
|
||||
|
||||
type ScheduleController struct {
|
||||
beego.Controller
|
||||
}
|
||||
|
||||
// @Title Create schedule
|
||||
// @Description Create schedule for a workflow. It will return some future executions just as information
|
||||
// @Param dcName query string true "Name of the node (oc-catalog) from where the workflow comes."
|
||||
// @Param workflowName query string true "Workflow Name"
|
||||
// @Param cron query string true "Cron syntax with year. If no year is specified, will use the current"
|
||||
// @Param duration query uint true "Duration in seconds"
|
||||
// @Param startDate query time.Time true "RFC3339 time for startDate"
|
||||
// @Param stopDate query time.Time true "RFC3339 time for stopDate"
|
||||
// @Param requirements body models.ExecutionRequirementsModel true "The object content"
|
||||
// @Success 200 {object} models.ScheduleInfo
|
||||
// @Failure 403 Authentication issue
|
||||
// @Failure 400 workflowName not found or empty
|
||||
// // @Security jwtAPIToken
|
||||
// @router /book [post]
|
||||
func (u *ScheduleController) CreateSchedule(dcName, workflowName, cron string, duration uint, startDate, stopDate time.Time, requirements models.ExecutionRequirementsModel) {
|
||||
// token := u.Ctx.Input.GetData("jwtAPIToken").(string)
|
||||
|
||||
//FIXME: Passing a date as "2021-07-15 00:00:00 0000 UTC" break the controller but return 200. Should return 4xx
|
||||
|
||||
username := "asd"
|
||||
|
||||
nextIters, err := models.CreateScheduleWorkflow(dcName, username, workflowName, cron, duration, startDate, stopDate, requirements)
|
||||
if err != nil {
|
||||
u.CustomAbort(400, err.Error())
|
||||
}
|
||||
|
||||
u.Data["json"] = nextIters
|
||||
u.ServeJSON()
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
//TODO: This node corresponds to a unique DC, which it owns. We must restructure the code in order to
|
||||
// allow a unique DC. And maybe discuss more this point
|
||||
|
||||
// @Title Check if schedule can be created in this DC
|
||||
// @Description Check for availability of this DC
|
||||
// @Param cron query string true "Cron syntax"
|
||||
// @Param duration query uint true "Duration in seconds"
|
||||
// @Param startDate query time.Time true "RFC3339 time for startDate"
|
||||
// @Param stopDate query time.Time true "RFC3339 time for stopDate"
|
||||
// @Param requirements body models.ExecutionRequirementsModel true "The object content"
|
||||
// @Success 200 The schedule can be created
|
||||
// @Failure 403 Authentication issue
|
||||
// @Failure 400 Other error. Check the output
|
||||
// // @Security jwtAPIToken
|
||||
// @router /check [post]
|
||||
func (u *ScheduleController) CheckSchedule(cron string, duration uint, startDate, stopDate time.Time, requirements models.ExecutionRequirementsModel) {
|
||||
// token := u.Ctx.Input.GetData("jwtAPIToken").(string)
|
||||
|
||||
// username := "asd"
|
||||
|
||||
if cron == "" {
|
||||
u.CustomAbort(400, "Tasks cronString must not be empty")
|
||||
}
|
||||
|
||||
// Check Dates
|
||||
if startDate.After(stopDate) || startDate.Equal(stopDate) {
|
||||
u.CustomAbort(400, "startDate must be before stopDate")
|
||||
}
|
||||
|
||||
if startDate.Before(time.Now().UTC()) {
|
||||
u.CustomAbort(400, "Current server time ("+time.Now().UTC().String()+") is after the startDate ("+startDate.String()+")")
|
||||
}
|
||||
|
||||
err := models.CheckSchedule(cron, duration, startDate, stopDate, requirements)
|
||||
if err != nil {
|
||||
logs.Warning(err)
|
||||
u.CustomAbort(400, err.Error())
|
||||
}
|
||||
|
||||
// u.Data["json"] = nextIters
|
||||
// u.ServeJSON()
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// @Title Get schedules
|
||||
// @Description Get a list of next startDates schedules (inclusive). If timezone is not specified, will assume UTC
|
||||
// @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
|
||||
// @Failure 403 Authentication issue
|
||||
// @Failure 400 Other error. Check the output
|
||||
// // @Security jwtAPIToken
|
||||
// @router / [get]
|
||||
func (u *ScheduleController) GetSchedules(startDate time.Time, stopDate time.Time) {
|
||||
// token := u.Ctx.Input.GetData("jwtAPIToken").(string)
|
||||
|
||||
// username := "asd"
|
||||
|
||||
data, maxLimit, err := models.GetSchedules(startDate, stopDate)
|
||||
if err != nil {
|
||||
logs.Warning(err)
|
||||
u.CustomAbort(400, err.Error())
|
||||
}
|
||||
|
||||
if maxLimit {
|
||||
u.Ctx.Output.Status = 201
|
||||
}
|
||||
|
||||
u.Data["json"] = data
|
||||
u.ServeJSON()
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// @Title Get next schedule
|
||||
// @Description Give a date, get the next date where there are at least on schedule. If no hours specified, will assume 00:00
|
||||
// @Param baseDate query time.Time true "Base date"
|
||||
// @Success 200 {object} *time.Time
|
||||
// @Failure 403 Authentication issue
|
||||
// @Failure 400 Other error. Check the output
|
||||
// // @Security jwtAPIToken
|
||||
// @router /next [get]
|
||||
func (u *ScheduleController) GetNextSchedules(baseDate time.Time) {
|
||||
// token := u.Ctx.Input.GetData("jwtAPIToken").(string)
|
||||
|
||||
// username := "asd"
|
||||
|
||||
futureDate := models.GetFarSchedules(baseDate, true)
|
||||
|
||||
u.Data["json"] = futureDate
|
||||
u.ServeJSON()
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// @Title Get previous schedule
|
||||
// @Description Give a date, get the previous date where there are at least on schedule. If no hours specified, will assume 00:00
|
||||
// @Param baseDate query time.Time true "Base date"
|
||||
// @Success 200 {object} *time.Time
|
||||
// @Failure 403 Authentication issue
|
||||
// @Failure 400 Other error. Check the output
|
||||
// // @Security jwtAPIToken
|
||||
// @router /previous [get]
|
||||
func (u *ScheduleController) GetPreviousSchedules(baseDate time.Time) {
|
||||
// token := u.Ctx.Input.GetData("jwtAPIToken").(string)
|
||||
|
||||
// username := "asd"
|
||||
|
||||
futureDate := models.GetFarSchedules(baseDate, false)
|
||||
|
||||
u.Data["json"] = futureDate
|
||||
u.ServeJSON()
|
||||
|
||||
return
|
||||
}
|
31
controllers/search.go
Normal file
@ -0,0 +1,31 @@
|
||||
package controllers
|
||||
|
||||
import (
|
||||
"cloud.o-forge.io/core/oc-catalog/models"
|
||||
|
||||
beego "github.com/beego/beego/v2/server/web"
|
||||
)
|
||||
|
||||
type SearchController struct {
|
||||
beego.Controller
|
||||
}
|
||||
|
||||
// TODO: Search by word is very very inneficent for not small databases
|
||||
// @Title Search by word
|
||||
// @Description find resources by word
|
||||
// @Param word query string true "Word to search across all resources"
|
||||
// @Success 200 {object} models.SearchResult
|
||||
// @Failure 503 Internal error
|
||||
// @router /byWord [get]
|
||||
func (o *SearchController) FindByWord(word string) {
|
||||
if word != "" {
|
||||
ob, err := models.FindByWord(word)
|
||||
if err != nil {
|
||||
o.Data["json"] = err.Error()
|
||||
o.Ctx.Output.Status = 503
|
||||
} else {
|
||||
o.Data["json"] = ob
|
||||
}
|
||||
}
|
||||
o.ServeJSON()
|
||||
}
|
77
controllers/storage.go
Normal file
@ -0,0 +1,77 @@
|
||||
package controllers
|
||||
|
||||
import (
|
||||
"cloud.o-forge.io/core/oc-catalog/models"
|
||||
|
||||
beego "github.com/beego/beego/v2/server/web"
|
||||
)
|
||||
|
||||
// StorageController operations about storage
|
||||
type StorageController struct {
|
||||
beego.Controller
|
||||
}
|
||||
|
||||
// @Title Get
|
||||
// @Description find storage by ID
|
||||
// @Param ID path string true "the ID you want to get"
|
||||
// @Success 200 {object} models.StorageModel
|
||||
// @Failure 403 ID is empty
|
||||
// @router /:ID [get]
|
||||
func (o *StorageController) GetOneStorage(ID string) {
|
||||
if ID != "" {
|
||||
ob, err := models.GetOneStorage(ID)
|
||||
if err != nil {
|
||||
o.Data["json"] = err.Error()
|
||||
} else {
|
||||
o.Data["json"] = ob
|
||||
}
|
||||
}
|
||||
o.ServeJSON()
|
||||
}
|
||||
|
||||
// @Title Get multiple storages by IDs
|
||||
// @Description Return Storage objects if found in the DB. Not found IDs will be ignored
|
||||
// @Param IDs path []string true "List of storage IDs"
|
||||
// @Success 200 {object} []models.ComputingModel
|
||||
// @Failure 403 IDs are empty
|
||||
// @router /multi/:IDs [get]
|
||||
func (o *StorageController) GetMultipleStorage(IDs []string) {
|
||||
if len(IDs) != 0 {
|
||||
ob, err := models.GetMultipleStorage(IDs)
|
||||
if err != nil {
|
||||
o.Ctx.Output.SetStatus(500)
|
||||
} else {
|
||||
o.Data["json"] = ob
|
||||
}
|
||||
} else {
|
||||
o.Ctx.Output.SetStatus(403)
|
||||
}
|
||||
o.ServeJSON()
|
||||
}
|
||||
|
||||
// @Title Create Storage
|
||||
// @Description submit storage object
|
||||
// @Param body body models.StorageNEWModel true "The object content"
|
||||
// @Success 200 {string} models.StorageModel
|
||||
// @Failure 403 Missing body or fields
|
||||
// @router / [post]
|
||||
func (o *StorageController) PostStorage(body models.StorageNEWModel) {
|
||||
err := validate.Struct(body)
|
||||
// validationErrors := err.(validator.ValidationErrors)
|
||||
|
||||
if err != nil {
|
||||
o.Data["json"] = err.Error()
|
||||
o.Ctx.Output.Status = 403
|
||||
o.ServeJSON()
|
||||
return
|
||||
}
|
||||
|
||||
ID, err := models.PostOneStorage(body)
|
||||
if err != nil {
|
||||
o.Ctx.Output.SetStatus(500)
|
||||
return
|
||||
}
|
||||
|
||||
o.Data["json"] = map[string]string{"ID": ID}
|
||||
o.ServeJSON()
|
||||
}
|
68
controllers/tokens.go
Normal file
@ -0,0 +1,68 @@
|
||||
package controllers
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"time"
|
||||
|
||||
"github.com/beego/beego/v2/core/logs"
|
||||
"github.com/dgrijalva/jwt-go"
|
||||
)
|
||||
|
||||
const mySuperSecretKey = "jdnfksdmfksd"
|
||||
|
||||
func CreateToken(userId string) (string, error) {
|
||||
var err error
|
||||
//Creating Access Token
|
||||
// os.Setenv("ACCESS_SECRET", "jdnfksdmfksd") //this should be in an env file
|
||||
atClaims := jwt.MapClaims{}
|
||||
atClaims["authorized"] = true
|
||||
atClaims["user_id"] = userId
|
||||
atClaims["exp"] = time.Now().UTC().Add(time.Hour * 15).Unix()
|
||||
at := jwt.NewWithClaims(jwt.SigningMethodHS256, atClaims)
|
||||
token, err := at.SignedString([]byte(mySuperSecretKey))
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return token, nil
|
||||
}
|
||||
|
||||
func IsValidToken(jwtToken string) (*jwt.Token, error) {
|
||||
token, err := jwt.Parse(jwtToken, func(token *jwt.Token) (interface{}, error) {
|
||||
//TODO: Validate expected algorithm
|
||||
return []byte(mySuperSecretKey), nil
|
||||
})
|
||||
|
||||
var message string
|
||||
|
||||
if err == nil && token.Valid {
|
||||
return token, nil
|
||||
} else if ve, ok := err.(*jwt.ValidationError); ok {
|
||||
if ve.Errors&jwt.ValidationErrorMalformed != 0 {
|
||||
message = "Token " + jwtToken + " is not even a token"
|
||||
} else if ve.Errors&(jwt.ValidationErrorExpired|jwt.ValidationErrorNotValidYet) != 0 {
|
||||
message = "Token is either expired or not active yet"
|
||||
} else {
|
||||
message = "Couldn't handle this token: " + err.Error()
|
||||
}
|
||||
}
|
||||
|
||||
logs.Debug(message)
|
||||
return nil, errors.New(message)
|
||||
}
|
||||
|
||||
func GetUsernameFromToken(token string) (string, error) {
|
||||
|
||||
tokenObj, err := IsValidToken(token)
|
||||
if err != nil {
|
||||
logs.Debug(err)
|
||||
return "", err
|
||||
}
|
||||
|
||||
if claims, ok := tokenObj.Claims.(jwt.MapClaims); ok {
|
||||
return claims["user_id"].(string), nil
|
||||
}
|
||||
|
||||
logs.Debug("Unknow JWT error")
|
||||
return "", errors.New("Unknow JWT error")
|
||||
|
||||
}
|
54
controllers/user.go
Normal file
@ -0,0 +1,54 @@
|
||||
package controllers
|
||||
|
||||
import (
|
||||
"cloud.o-forge.io/core/oc-catalog/models"
|
||||
beego "github.com/beego/beego/v2/server/web"
|
||||
)
|
||||
|
||||
type UserController struct {
|
||||
beego.Controller
|
||||
}
|
||||
|
||||
// @Title Login
|
||||
// @Description Logs user into the system
|
||||
// @Param username query string true "The username for login"
|
||||
// @Param password query string true "The password for login"
|
||||
// @Success 200 {string} login success
|
||||
// @Failure 403 user not exist
|
||||
// @router /login [get]
|
||||
func (u *UserController) Login() {
|
||||
username := u.GetString("username")
|
||||
password := u.GetString("password")
|
||||
|
||||
if models.Login(username, password) {
|
||||
token, err := CreateToken(username)
|
||||
|
||||
if err != nil {
|
||||
u.Data["json"] = err.Error()
|
||||
u.Ctx.Output.Status = 503
|
||||
u.ServeJSON()
|
||||
return
|
||||
}
|
||||
|
||||
u.Ctx.SetCookie("token", token)
|
||||
u.Ctx.Output.Header("Authorization", token) //FIXME: Some more generic way to use the name of the header
|
||||
u.Data["json"] = "login success"
|
||||
u.ServeJSON()
|
||||
return
|
||||
|
||||
}
|
||||
u.Ctx.Output.Status = 403
|
||||
u.Data["json"] = "user not exist"
|
||||
u.ServeJSON()
|
||||
|
||||
}
|
||||
|
||||
// @Title logout
|
||||
// @Description Logs out current logged in user session
|
||||
// @Success 200 {string} logout success
|
||||
// // @Security mySecurityPathNameApiKey
|
||||
// @router /logout [get]
|
||||
func (u *UserController) Logout() {
|
||||
u.Data["json"] = "logout success"
|
||||
u.ServeJSON()
|
||||
}
|
337
controllers/workflow.go
Normal file
@ -0,0 +1,337 @@
|
||||
package controllers
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"cloud.o-forge.io/core/oc-catalog/models"
|
||||
"github.com/beego/beego/v2/core/logs"
|
||||
beego "github.com/beego/beego/v2/server/web"
|
||||
"github.com/vk496/cron"
|
||||
)
|
||||
|
||||
type WorkflowController struct {
|
||||
beego.Controller
|
||||
}
|
||||
|
||||
// @Title Create a new workflow
|
||||
// @Description Create a name for the new workflow
|
||||
// @Param workflowName query string true "Name of the workflow"
|
||||
// @Success 200 {string} Workflow created succeful
|
||||
// @Failure 403 Authentication issue
|
||||
// @Failure 400 {string} Other error
|
||||
// // @Security jwtAPIToken
|
||||
// @router / [post]
|
||||
func (u *WorkflowController) CreateWorkflow(workflowName string) {
|
||||
// token := u.Ctx.Input.GetData("jwtAPIToken").(string)
|
||||
|
||||
// //TODO: Implement as swagger security definition (api key?)
|
||||
// username, err := GetUsernameFromToken(token)
|
||||
// if err != nil {
|
||||
// u.Data["json"] = "No valid token"
|
||||
// u.Ctx.Output.Status = 403
|
||||
// u.ServeJSON()
|
||||
// return
|
||||
// }
|
||||
|
||||
username := "asd"
|
||||
|
||||
if err := models.CreateWorkflow(username, workflowName); err != nil {
|
||||
u.Data["json"] = err.Error()
|
||||
u.Ctx.Output.Status = 400
|
||||
u.ServeJSON()
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// @Title List workflows
|
||||
// @Description List available workflows
|
||||
// @Success 200 []string List of workflows
|
||||
// @Failure 403 Authentication issue
|
||||
// @Failure 400 {string} Other error
|
||||
// // @Security jwtAPIToken
|
||||
// @router / [get]
|
||||
func (u *WorkflowController) ListWorkflows() {
|
||||
// token := u.Ctx.Input.GetData("jwtAPIToken").(string)
|
||||
|
||||
username := "asd"
|
||||
|
||||
w := models.GetWorkspace(username)
|
||||
|
||||
if w == nil {
|
||||
// No username
|
||||
u.Data["json"] = "Workspace doesn't exist"
|
||||
u.Ctx.Output.Status = 400
|
||||
u.ServeJSON()
|
||||
}
|
||||
|
||||
u.Data["json"] = w.GetWorkflows()
|
||||
u.ServeJSON()
|
||||
}
|
||||
|
||||
// @Title Get Workflow
|
||||
// @Description Get a workflow by name
|
||||
// @Param workflowName path string true "Workflow Name"
|
||||
// @Success 200 {object} models.Workflow
|
||||
// @Failure 403 Authentication issue
|
||||
// @Failure 400 {string} Other error
|
||||
// // @Security jwtAPIToken
|
||||
// @router /:workflowName [get]
|
||||
func (u *WorkflowController) GetWorkflow(workflowName string) {
|
||||
// token := u.Ctx.Input.GetData("jwtAPIToken").(string)
|
||||
|
||||
username := "asd"
|
||||
|
||||
proj, err := models.GetWorkflow(username, workflowName)
|
||||
if err != nil {
|
||||
u.SetData(err.Error())
|
||||
u.Ctx.Output.Status = 400
|
||||
u.ServeJSON()
|
||||
return
|
||||
}
|
||||
|
||||
u.Data["json"] = proj
|
||||
u.ServeJSON()
|
||||
}
|
||||
|
||||
// @Title Add new object to a Workflow
|
||||
// @Description Create a Rtype object from already added resources to the workspace
|
||||
// @Param workflowName path string true "workflow Name"
|
||||
// @Param rID query string true "rID of already existing item in Workspace"
|
||||
// @Success 200 {string} ID of the new object (rObjID)
|
||||
// @Failure 403 Authentication issue
|
||||
// @Failure 400 {string} Other error
|
||||
// // @Security jwtAPIToken
|
||||
// @router /:workflowName/add [post]
|
||||
func (u *WorkflowController) AddElementWorkflow(workflowName, rID string) {
|
||||
username := "asd"
|
||||
|
||||
rObjID, err := models.CreateObjectInWorkflow(username, workflowName, rID)
|
||||
if err != nil {
|
||||
logs.Debug(err.Error())
|
||||
u.Data["json"] = err.Error()
|
||||
u.Ctx.Output.Status = 400
|
||||
u.ServeJSON()
|
||||
return
|
||||
}
|
||||
|
||||
u.Data["json"] = rObjID
|
||||
u.ServeJSON()
|
||||
return
|
||||
}
|
||||
|
||||
// @Title Parse mxGraph
|
||||
// @Description If we use this aproach to transofrm mxgraph representation in our representation, we should not use other API calls for modify the project structure or we'll have inconsistencies.
|
||||
// @Param workflowName path string true "Workflow Name"
|
||||
// @Param xmlData body string true "Xml representation of the workflow"
|
||||
// @Success 200 The xmlgraph consumed correctly
|
||||
// @Success 201 The xmlgraph consumed with issues
|
||||
// @Failure 403 Authentication issue
|
||||
// @Failure 400 {string} Other error
|
||||
// @router /:workflowName/mxGraphParser [post]
|
||||
func (u *WorkflowController) MxGraphParser(workflowName, xmlData string) {
|
||||
username := "asd"
|
||||
err, mxissues := models.ParseMxGraph(username, workflowName, xmlData)
|
||||
if err != nil {
|
||||
logs.Debug(err.Error())
|
||||
u.CustomAbort(400, err.Error())
|
||||
}
|
||||
|
||||
if len(mxissues) > 0 {
|
||||
strErrors := make([]string, len(mxissues))
|
||||
|
||||
for i, err := range mxissues {
|
||||
strErrors[i] = err.Error()
|
||||
}
|
||||
|
||||
u.Data["json"] = strErrors
|
||||
u.Ctx.Output.Status = 201
|
||||
u.ServeJSON()
|
||||
return
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// @Title Get mxGraph last status
|
||||
// @Description Obtain the last mxgraph XML status from the workflow
|
||||
// @Param workflowName path string true "Workflow Name"
|
||||
// @Success 200 The xmlgraph
|
||||
// @Success 201 Empty workflow
|
||||
// @Failure 403 Authentication issue
|
||||
// @Failure 400 {string} Other error
|
||||
// @router /:workflowName/mxGraphParser [get]
|
||||
func (u *WorkflowController) MxGraphParserConsume(workflowName string) {
|
||||
username := "asd"
|
||||
xmlData, err := models.GetMxGraph(username, workflowName)
|
||||
if err != nil {
|
||||
logs.Debug(err.Error())
|
||||
u.Data["json"] = err.Error()
|
||||
u.Ctx.Output.Status = 400
|
||||
u.ServeJSON()
|
||||
return
|
||||
}
|
||||
|
||||
if xmlData == nil {
|
||||
u.Ctx.Output.Status = 201
|
||||
} else {
|
||||
u.Ctx.Output.Status = 200
|
||||
u.Ctx.Output.Body([]byte(*xmlData))
|
||||
u.ServeXML()
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// @Title Create a realtionship between two Robjects
|
||||
// @Description Create a Rtype object from already added resources to the workspace
|
||||
// @Param workflowName path string true "Workflow Name"
|
||||
// @Param rObjIDsource query string true "Robject source. Usually Data"
|
||||
// @Param isInput query bool true "If the operation is for input (true) linkage or output (false)"
|
||||
// @Param rObjIDtarger query string true "Robject where will be written the association"
|
||||
// @Success 200 {string} ID of the new object (rObjID)
|
||||
// @Failure 403 Authentication issue
|
||||
// @Failure 400 {string} Other error
|
||||
// // @Security jwtAPIToken
|
||||
// @router /:workflowName/link [post]
|
||||
func (u *WorkflowController) LinkElementsWorkflow(workflowName, rObjIDsource, rObjIDtarger string, isInput bool) {
|
||||
username := "asd"
|
||||
|
||||
err := models.LinkObjectsInWorkspace(username, workflowName, rObjIDsource, isInput, rObjIDtarger)
|
||||
if err != nil {
|
||||
logs.Debug(err.Error())
|
||||
u.Data["json"] = err.Error()
|
||||
u.Ctx.Output.Status = 400
|
||||
u.ServeJSON()
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// @Title Get Schedule
|
||||
// @Description Obtain the desired schedule of this workflow
|
||||
// @Param workflowName path string true "Workflow Name"
|
||||
// @Success 200 {object} models.ScheduleTime
|
||||
// @Failure 403 Authentication issue
|
||||
// @Failure 400 Workflow doesn't exist
|
||||
// @Failure 401 Other error
|
||||
// @router /:workflowName/schedule [get]
|
||||
func (u *WorkflowController) GetWorkflowSchedule(workflowName string) {
|
||||
username := "asd"
|
||||
sched, err := models.GetWorkflowSchedule(username, workflowName)
|
||||
|
||||
// Some error
|
||||
if err != nil {
|
||||
u.CustomAbort(401, err.Error())
|
||||
}
|
||||
|
||||
// No workflow
|
||||
if sched == nil {
|
||||
u.Ctx.Output.Status = 400
|
||||
return
|
||||
}
|
||||
|
||||
u.Ctx.Output.Status = 200
|
||||
u.Data["json"] = sched
|
||||
u.ServeJSON()
|
||||
}
|
||||
|
||||
// @Title Set Schedule
|
||||
// @Description Set desired schedule by the user. No other effects a part of saving the user input
|
||||
// @Param workflowName path string true "Workflow Name"
|
||||
// @Param isService query bool true "True: Service, False: Task"
|
||||
// @Param startDate query time.Time true "RFC3339 time for startDate"
|
||||
// @Param stopDate query time.Time true "RFC3339 time for stopDate"
|
||||
// @Param events query string false "List of events separated by comma"
|
||||
// @Param cronString query string false "Cron string"
|
||||
// @Param duration query uint false "Duration in seconds"
|
||||
// @Success 200 {object} models.ScheduleInfo
|
||||
// @Failure 403 Authentication issue
|
||||
// @Failure 400 Workflow doesn't exist
|
||||
// @Failure 401 Other error
|
||||
// @Failure 402 Bad user input
|
||||
// @router /:workflowName/schedule [put]
|
||||
func (u *WorkflowController) SetWorkflowSchedule(workflowName, cronString, events string, isService bool, startDate, stopDate time.Time, duration uint) {
|
||||
username := "asd"
|
||||
|
||||
// Check Dates
|
||||
if startDate.After(stopDate) || startDate.Equal(stopDate) {
|
||||
u.CustomAbort(402, "startDate must be before stopDate")
|
||||
}
|
||||
|
||||
if startDate.Before(time.Now().UTC()) {
|
||||
u.CustomAbort(402, "Current server time ("+time.Now().UTC().String()+") is after the startDate ("+startDate.String()+")")
|
||||
}
|
||||
|
||||
// Tasks must have cron and duration
|
||||
if !isService {
|
||||
if cronString == "" {
|
||||
u.CustomAbort(402, "Tasks cronString must not be empty")
|
||||
}
|
||||
|
||||
if duration == 0 {
|
||||
u.CustomAbort(402, "Tasks duration musn't be 0")
|
||||
}
|
||||
|
||||
_, err := cron.Parse(cronString)
|
||||
// Check cron
|
||||
if err != nil {
|
||||
u.CustomAbort(402, "Bad cron message: "+err.Error())
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
schedInfo, err := models.SetWorkflowSchedule(username, workflowName, cronString, events, isService, startDate, stopDate, duration)
|
||||
|
||||
// Some error
|
||||
if err != nil {
|
||||
u.CustomAbort(401, err.Error())
|
||||
}
|
||||
|
||||
// No workflow
|
||||
if schedInfo == nil {
|
||||
u.CustomAbort(400, "")
|
||||
}
|
||||
|
||||
u.Ctx.Output.Status = 200
|
||||
u.Data["json"] = schedInfo
|
||||
u.ServeJSON()
|
||||
}
|
||||
|
||||
// @Title Check Schedule
|
||||
// @Description Check if we can schedule the project in other DCs. Must set a desired schedule first!
|
||||
// @Param workflowName path string true "Workflow Name"
|
||||
// @Success 200 {object} []models.DCstatus
|
||||
// @Failure 403 Authentication issue
|
||||
// @Failure 401 Other error
|
||||
// @router /:workflowName/schedule/check [get]
|
||||
func (u *WorkflowController) CheckWorkflowSchedule(workflowName string) {
|
||||
username := "asd"
|
||||
|
||||
data, err := models.CheckAndBookWorkflowSchedule(username, workflowName, false)
|
||||
if err != nil {
|
||||
u.CustomAbort(401, err.Error())
|
||||
}
|
||||
|
||||
u.Ctx.Output.Status = 200
|
||||
u.Data["json"] = data
|
||||
u.ServeJSON()
|
||||
return
|
||||
}
|
||||
|
||||
// @Title Book Schedule
|
||||
// @Description Book a schedule in all DCs of the workflow. Must set a desired schedule first!
|
||||
// @Param workflowName path string true "Workflow Name"
|
||||
// @Success 200 {object} []models.DCstatus
|
||||
// @Failure 403 Authentication issue
|
||||
// @Failure 401 Other error. Check output
|
||||
// @router /:workflowName/schedule/book [post]
|
||||
func (u *WorkflowController) BookWorkflowSchedule(workflowName string) {
|
||||
username := "asd"
|
||||
|
||||
data, err := models.CheckAndBookWorkflowSchedule(username, workflowName, true)
|
||||
if err != nil {
|
||||
u.CustomAbort(401, err.Error())
|
||||
}
|
||||
|
||||
u.Ctx.Output.Status = 200
|
||||
u.Data["json"] = data
|
||||
u.ServeJSON()
|
||||
return
|
||||
}
|
151
controllers/workspace.go
Normal file
@ -0,0 +1,151 @@
|
||||
package controllers
|
||||
|
||||
import (
|
||||
"cloud.o-forge.io/core/oc-catalog/models"
|
||||
beego "github.com/beego/beego/v2/server/web"
|
||||
)
|
||||
|
||||
type WorkspaceController struct {
|
||||
beego.Controller
|
||||
}
|
||||
|
||||
// @Title Add model to workspace
|
||||
// @Description Insert a resource in the workspace
|
||||
// @Param id query string true "ID of a resource"
|
||||
// @Param rtype query string true "Type of resource"
|
||||
// @Success 200 {string} login success
|
||||
// @Failure 403 Authentication issue
|
||||
// @Failure 400 {string} Other error
|
||||
// // @Security jwtAPIToken
|
||||
// @router / [post]
|
||||
func (u *WorkspaceController) AddModel(id, rtype string) {
|
||||
// token := u.Ctx.Input.GetData("jwtAPIToken").(string)
|
||||
|
||||
// //TODO: Implement as swagger security definition (api key?)
|
||||
// username, err := GetUsernameFromToken(token)
|
||||
// if err != nil {
|
||||
// u.Data["json"] = "No valid token"
|
||||
// u.Ctx.Output.Status = 403
|
||||
// u.ServeJSON()
|
||||
// return
|
||||
// }
|
||||
|
||||
var err error
|
||||
username := "asd"
|
||||
|
||||
w := models.GetWorkspace(username)
|
||||
|
||||
if w == nil {
|
||||
w, err = models.NewWorkspace(username)
|
||||
if err != nil {
|
||||
u.Data["json"] = err.Error()
|
||||
u.Ctx.Output.Status = 400
|
||||
u.ServeJSON()
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// w.NewResource(id, rtype)
|
||||
|
||||
if err := models.AddResource(username, id, rtype); err != nil {
|
||||
u.Data["json"] = err.Error()
|
||||
u.Ctx.Output.Status = 400
|
||||
u.ServeJSON()
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// @Title Get workspace
|
||||
// @Description Get workspace elements based on user_id token
|
||||
// @Success 200 {object} models.Workspace
|
||||
// @Failure 403 Authentication issue
|
||||
// // @Security jwtAPIToken
|
||||
// @router /list [get]
|
||||
func (u *WorkspaceController) ListWorkspace() {
|
||||
// token := u.Ctx.Input.GetData("jwtAPIToken").(string)
|
||||
|
||||
// //TODO: Implement as swagger security definition (api key?)
|
||||
// username, err := GetUsernameFromToken(token)
|
||||
// if err != nil {
|
||||
// u.Data["json"] = "No valid token"
|
||||
// u.Ctx.Output.Status = 403
|
||||
// u.ServeJSON()
|
||||
// return
|
||||
// }
|
||||
|
||||
username := "asd"
|
||||
|
||||
ws := models.GetWorkspace(username)
|
||||
|
||||
// if ws == nil {
|
||||
// u.Ctx.Output.Status = 503
|
||||
// return
|
||||
// }
|
||||
|
||||
u.Data["json"] = ws
|
||||
u.ServeJSON()
|
||||
|
||||
}
|
||||
|
||||
// @Title Get full workspace
|
||||
// @Description Get full workspace elements based on user_id token
|
||||
// @Success 200 {object} models.WorkspaceModel
|
||||
// @Failure 403 Authentication issue
|
||||
// // @Security jwtAPIToken
|
||||
// @router /list_model [get]
|
||||
func (u *WorkspaceController) ListWorkspaceModel() {
|
||||
// token := u.Ctx.Input.GetData("jwtAPIToken").(string)
|
||||
|
||||
// //TODO: Implement as swagger security definition (api key?)
|
||||
// username, err := GetUsernameFromToken(token)
|
||||
// if err != nil {
|
||||
// u.Data["json"] = "No valid token"
|
||||
// u.Ctx.Output.Status = 403
|
||||
// u.ServeJSON()
|
||||
// return
|
||||
// }
|
||||
|
||||
username := "asd"
|
||||
|
||||
val, err := models.ListFullWorkspace(username)
|
||||
|
||||
if err != nil {
|
||||
u.Ctx.Output.Status = 503
|
||||
return
|
||||
}
|
||||
|
||||
u.Data["json"] = val
|
||||
u.ServeJSON()
|
||||
|
||||
}
|
||||
|
||||
// @Title Delete element from user workspace
|
||||
// @Description Remove a resource from the workspace
|
||||
// @Param id query string true "ID of a resource"
|
||||
// @Param rtype query string true "Type of resource"
|
||||
// @Success 200 {string} Removed succeful
|
||||
// @Failure 403 Authentication issue
|
||||
// @Failure 400 {string} Other error
|
||||
// // @Security jwtAPIToken
|
||||
// @router / [delete]
|
||||
func (u *WorkspaceController) DeleteElement(id, rtype string) {
|
||||
// token := u.Ctx.Input.GetData("jwtAPIToken").(string)
|
||||
|
||||
// //TODO: Implement as swagger security definition (api key?)
|
||||
// username, err := GetUsernameFromToken(token)
|
||||
// if err != nil {
|
||||
// u.Data["json"] = "No valid token"
|
||||
// u.Ctx.Output.Status = 403
|
||||
// u.ServeJSON()
|
||||
// return
|
||||
// }
|
||||
|
||||
username := "asd"
|
||||
|
||||
if err := models.RemoveResource(username, id, rtype); err != nil {
|
||||
u.Data["json"] = err.Error()
|
||||
u.Ctx.Output.Status = 400
|
||||
u.ServeJSON()
|
||||
return
|
||||
}
|
||||
}
|
15
docker-compose.backend.yml
Normal file
@ -0,0 +1,15 @@
|
||||
version: '3.4'
|
||||
|
||||
services:
|
||||
oc-catalog:
|
||||
build: .
|
||||
container_name: oc-catalog
|
||||
restart: always
|
||||
environment:
|
||||
- DOCKER_DCNAME=DC_myDC
|
||||
depends_on:
|
||||
- mongo
|
||||
networks:
|
||||
- catalog
|
||||
ports:
|
||||
- 49618:49618
|
27
docker-compose.multi.yml
Normal file
@ -0,0 +1,27 @@
|
||||
version: '3.4'
|
||||
|
||||
services:
|
||||
dc1:
|
||||
build: .
|
||||
restart: always
|
||||
container_name: dc1
|
||||
environment:
|
||||
- DOCKER_DCNAME=DC_superDC1
|
||||
depends_on:
|
||||
- mongo
|
||||
networks:
|
||||
- catalog
|
||||
ports:
|
||||
- 49619:49618
|
||||
dc2:
|
||||
build: .
|
||||
restart: always
|
||||
container_name: dc2
|
||||
environment:
|
||||
- DOCKER_DCNAME=DC_superDC2
|
||||
depends_on:
|
||||
- mongo
|
||||
networks:
|
||||
- catalog
|
||||
ports:
|
||||
- 49620:49618
|
30
docker-compose.yml
Normal file
@ -0,0 +1,30 @@
|
||||
version: '3.4'
|
||||
|
||||
services:
|
||||
mongo:
|
||||
image: 'mongo:latest'
|
||||
networks:
|
||||
- catalog
|
||||
ports:
|
||||
- 27017:27017
|
||||
container_name: mongo
|
||||
volumes:
|
||||
- oc-catalog-data:/data/db
|
||||
- oc-catalog-data:/data/configdb
|
||||
|
||||
mongo-express:
|
||||
image: "mongo-express:latest"
|
||||
restart: always
|
||||
depends_on:
|
||||
- mongo
|
||||
networks:
|
||||
- catalog
|
||||
ports:
|
||||
- 8081:8081
|
||||
|
||||
volumes:
|
||||
oc-catalog-data:
|
||||
|
||||
networks:
|
||||
catalog:
|
||||
name: catalog
|
32
go.mod
Normal file
@ -0,0 +1,32 @@
|
||||
module cloud.o-forge.io/core/oc-catalog
|
||||
|
||||
go 1.15
|
||||
|
||||
require github.com/beego/beego/v2 v2.0.1
|
||||
|
||||
require (
|
||||
github.com/antihax/optional v1.0.0
|
||||
github.com/aws/aws-sdk-go v1.36.29 // indirect
|
||||
github.com/beego/bee/v2 v2.0.2
|
||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible
|
||||
github.com/go-playground/validator/v10 v10.4.1
|
||||
github.com/golang/snappy v0.0.2 // indirect
|
||||
github.com/klauspost/compress v1.11.7 // indirect
|
||||
github.com/leodido/go-urn v1.2.1 // indirect
|
||||
github.com/mitchellh/mapstructure v1.4.1 // indirect
|
||||
github.com/prometheus/client_golang v1.9.0 // indirect
|
||||
github.com/prometheus/procfs v0.3.0 // indirect
|
||||
github.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18 // indirect
|
||||
github.com/vk496/cron v1.2.0
|
||||
go.mongodb.org/mongo-driver v1.4.5
|
||||
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad // indirect
|
||||
golang.org/x/mod v0.4.1 // indirect
|
||||
golang.org/x/net v0.0.0-20210119194325-5f4716e94777 // indirect
|
||||
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45
|
||||
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a // indirect
|
||||
golang.org/x/text v0.3.5 // indirect
|
||||
golang.org/x/tools v0.1.0 // indirect
|
||||
google.golang.org/protobuf v1.25.0 // indirect
|
||||
gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b // indirect
|
||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||
)
|
747
go.sum
Normal file
@ -0,0 +1,747 @@
|
||||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
|
||||
cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
|
||||
cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
|
||||
cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
|
||||
cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
|
||||
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
|
||||
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
|
||||
cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=
|
||||
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
|
||||
cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
|
||||
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
|
||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
|
||||
github.com/Knetic/govaluate v3.0.0+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
|
||||
github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
|
||||
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
|
||||
github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
|
||||
github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
|
||||
github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g=
|
||||
github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c=
|
||||
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
||||
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
||||
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
|
||||
github.com/alicebob/gopher-json v0.0.0-20180125190556-5a6b3ba71ee6/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc=
|
||||
github.com/alicebob/miniredis v2.5.0+incompatible/go.mod h1:8HZjEj4yU0dwhYHky+DxYx+6BMjkBbe5ONFIF1MXffk=
|
||||
github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg=
|
||||
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
|
||||
github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
|
||||
github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
|
||||
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
|
||||
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
|
||||
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
|
||||
github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A=
|
||||
github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU=
|
||||
github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
|
||||
github.com/aws/aws-sdk-go v1.34.28/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48=
|
||||
github.com/aws/aws-sdk-go v1.36.29 h1:lM1G3AF1+7vzFm0n7hfH8r2+750BTo+6Lo6FtPB7kzk=
|
||||
github.com/aws/aws-sdk-go v1.36.29/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro=
|
||||
github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g=
|
||||
github.com/beego/bee/v2 v2.0.2 h1:xWARyIqdnnbNMDBDUdb6Gvr9S/yGXC6Ni43kKdS1/eg=
|
||||
github.com/beego/bee/v2 v2.0.2/go.mod h1:rfZa899qLAF8SYBRvE7mWNPZTU7/qysOBhaCLmZrMX4=
|
||||
github.com/beego/beego/v2 v2.0.1 h1:07a7Z0Ok5vbqyqh+q53sDPl9LdhKh0ZDy3gbyGrhFnE=
|
||||
github.com/beego/beego/v2 v2.0.1/go.mod h1:8zyHi1FnWO1mZLwTn62aKRIZF/aIKvkCBB2JYs+eqQI=
|
||||
github.com/beego/goyaml2 v0.0.0-20130207012346-5545475820dd/go.mod h1:1b+Y/CofkYwXMUU0OhQqGvsY2Bvgr4j6jfT699wyZKQ=
|
||||
github.com/beego/x2j v0.0.0-20131220205130-a0352aadc542/go.mod h1:kSeGC/p1AbBiEp5kat81+DSQrZenVBZXklMLaELspWU=
|
||||
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
||||
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
|
||||
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
|
||||
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
||||
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
|
||||
github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=
|
||||
github.com/bradfitz/gomemcache v0.0.0-20180710155616-bc664df96737/go.mod h1:PmM6Mmwb0LSuEubjR8N7PtNe1KxZLtOUHtbeikc5h60=
|
||||
github.com/casbin/casbin v1.7.0/go.mod h1:c67qKN6Oum3UF5Q1+BByfFxkwKvhwW57ITjqwtzR1KE=
|
||||
github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ=
|
||||
github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
|
||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||
github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
|
||||
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
|
||||
github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
|
||||
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||
github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE=
|
||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||
github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80=
|
||||
github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
|
||||
github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
|
||||
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
|
||||
github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
|
||||
github.com/coreos/etcd v3.3.25+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
|
||||
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
||||
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
||||
github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
||||
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
||||
github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
||||
github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
|
||||
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
|
||||
github.com/cosiner/argv v0.1.0/go.mod h1:EusR6TucWKX+zFgtdUsKT2Cvg45K5rtpCcWz4hK06d8=
|
||||
github.com/couchbase/go-couchbase v0.0.0-20200519150804-63f3cdb75e0d/go.mod h1:TWI8EKQMs5u5jLKW/tsb9VwauIrMIxQG1r5fMsswK5U=
|
||||
github.com/couchbase/gomemcached v0.0.0-20200526233749-ec430f949808/go.mod h1:srVSlQLB8iXBVXHgnqemxUXqN6FCvClgCMPCsjBDR7c=
|
||||
github.com/couchbase/goutils v0.0.0-20180530154633-e865a1461c8a/go.mod h1:BQwMFlJzDjFDG3DJUdU0KORxn88UlsOULuxLExMh3Hs=
|
||||
github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
||||
github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
|
||||
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||
github.com/cupcake/rdb v0.0.0-20161107195141-43ba34106c76/go.mod h1:vYwsqCOLxGiisLwp9rITslkFNpZD5rz43tf41QFkTWY=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
|
||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
||||
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
|
||||
github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
|
||||
github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
|
||||
github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=
|
||||
github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
|
||||
github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
|
||||
github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
|
||||
github.com/elastic/go-elasticsearch/v6 v6.8.5/go.mod h1:UwaDJsD3rWLM5rKNFzv9hgox93HoX8utj1kxD9aFUcI=
|
||||
github.com/elazarl/go-bindata-assetfs v1.0.0 h1:G/bYguwHIzWq9ZoyUQqrjTmJbbYn3j3CKKpKinvZLFk=
|
||||
github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4=
|
||||
github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g=
|
||||
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
||||
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
||||
github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4/go.mod h1:T9YF2M40nIgbVgp3rreNmTged+9HrbNTIQf1PsaIiTA=
|
||||
github.com/flosch/pongo2 v0.0.0-20200529170236-5abacdfa4915/go.mod h1:fB4mx6dzqFinCxIf3a7Mf5yLk+18Bia9mPAnuejcvDA=
|
||||
github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4=
|
||||
github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20=
|
||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
|
||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
||||
github.com/glendc/gopher-json v0.0.0-20170414221815-dc4743023d0c/go.mod h1:Gja1A+xZ9BoviGJNA2E9vFkPjjsl+CoJxSXiQM1UXtw=
|
||||
github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98=
|
||||
github.com/go-delve/delve v1.5.0/go.mod h1:c6b3a1Gry6x8a4LGCe/CWzrocrfaHvkUxCj3k4bvSUQ=
|
||||
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
|
||||
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
||||
github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
||||
github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o=
|
||||
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
|
||||
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
|
||||
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
|
||||
github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A=
|
||||
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
|
||||
github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q=
|
||||
github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
|
||||
github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no=
|
||||
github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
|
||||
github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE=
|
||||
github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4=
|
||||
github.com/go-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
|
||||
github.com/go-redis/redis/v7 v7.4.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg=
|
||||
github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
|
||||
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
|
||||
github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
|
||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||
github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0=
|
||||
github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY=
|
||||
github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg=
|
||||
github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI=
|
||||
github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI=
|
||||
github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs=
|
||||
github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI=
|
||||
github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI=
|
||||
github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk=
|
||||
github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28=
|
||||
github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo=
|
||||
github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk=
|
||||
github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw=
|
||||
github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360=
|
||||
github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg=
|
||||
github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE=
|
||||
github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8=
|
||||
github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc=
|
||||
github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc=
|
||||
github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4=
|
||||
github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4=
|
||||
github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ=
|
||||
github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0=
|
||||
github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw=
|
||||
github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s=
|
||||
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||
github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
|
||||
github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
|
||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||
github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||
github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
|
||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
|
||||
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
|
||||
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
|
||||
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
|
||||
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
|
||||
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
|
||||
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
||||
github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM=
|
||||
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
||||
github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||
github.com/golang/snappy v0.0.2 h1:aeE13tS0IiQgFjYdoL8qN3K1N2bXXtI6Vi51/y7BpMw=
|
||||
github.com/golang/snappy v0.0.2/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||
github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4=
|
||||
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM=
|
||||
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-dap v0.2.0/go.mod h1:5q8aYQFnHOAZEMP+6vmq25HKYAEwE+LF5yh7JKrrhSQ=
|
||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
|
||||
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
||||
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
||||
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
||||
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
|
||||
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
|
||||
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
||||
github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
|
||||
github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
||||
github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
||||
github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
|
||||
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
|
||||
github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
|
||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
|
||||
github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
|
||||
github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE=
|
||||
github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
|
||||
github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
|
||||
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
||||
github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
|
||||
github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
|
||||
github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
|
||||
github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
|
||||
github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
|
||||
github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
|
||||
github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
|
||||
github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
|
||||
github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
|
||||
github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
|
||||
github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
|
||||
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||
github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=
|
||||
github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
|
||||
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
|
||||
github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
|
||||
github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
|
||||
github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
|
||||
github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
|
||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
||||
github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg=
|
||||
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
|
||||
github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
|
||||
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
|
||||
github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
|
||||
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
|
||||
github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8=
|
||||
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
|
||||
github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=
|
||||
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
|
||||
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
|
||||
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
|
||||
github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
||||
github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
||||
github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
||||
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
|
||||
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
|
||||
github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q=
|
||||
github.com/juju/errors v0.0.0-20190930114154-d42613fe1ab9/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q=
|
||||
github.com/juju/loggo v0.0.0-20180524022052-584905176618/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U=
|
||||
github.com/juju/testing v0.0.0-20180920084828-472a3e8b2073/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA=
|
||||
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
||||
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
|
||||
github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4=
|
||||
github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA=
|
||||
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
|
||||
github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
|
||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||
github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
|
||||
github.com/klauspost/compress v1.11.7 h1:0hzRabrMN4tSTvMfnL3SCv1ZGeAP23ynzodBgaHeMeg=
|
||||
github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
|
||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
|
||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||
github.com/ledisdb/ledisdb v0.0.0-20200510135210-d35789ec47e6/go.mod h1:n931TsDuKuq+uX4v1fulaMbA/7ZLLhjc85h7chZGBCQ=
|
||||
github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
|
||||
github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w=
|
||||
github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY=
|
||||
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
||||
github.com/lib/pq v1.7.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
|
||||
github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM=
|
||||
github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4=
|
||||
github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ=
|
||||
github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
||||
github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE=
|
||||
github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0=
|
||||
github.com/mattn/go-colorable v0.0.0-20170327083344-ded68f7a9561/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
|
||||
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
|
||||
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
||||
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
||||
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
||||
github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
|
||||
github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw=
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
||||
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
|
||||
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
|
||||
github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||
github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
|
||||
github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=
|
||||
github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
|
||||
github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
||||
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
||||
github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
|
||||
github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=
|
||||
github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
|
||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
||||
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
||||
github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
|
||||
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
||||
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
||||
github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg=
|
||||
github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU=
|
||||
github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k=
|
||||
github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w=
|
||||
github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
|
||||
github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
|
||||
github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
|
||||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
|
||||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
|
||||
github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs=
|
||||
github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA=
|
||||
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
|
||||
github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
|
||||
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||
github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||
github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg=
|
||||
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
||||
github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
||||
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
|
||||
github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk=
|
||||
github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis=
|
||||
github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74=
|
||||
github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
|
||||
github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
|
||||
github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
|
||||
github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA=
|
||||
github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
|
||||
github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4=
|
||||
github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4=
|
||||
github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM=
|
||||
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
|
||||
github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
|
||||
github.com/pelletier/go-toml v1.0.1/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
||||
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
||||
github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE=
|
||||
github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc=
|
||||
github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac=
|
||||
github.com/peterh/liner v0.0.0-20170317030525-88609521dc4b/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc=
|
||||
github.com/peterh/liner v1.0.1-0.20171122030339-3681c2a91233/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc=
|
||||
github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc=
|
||||
github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
|
||||
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
|
||||
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
||||
github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs=
|
||||
github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
|
||||
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
|
||||
github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og=
|
||||
github.com/prometheus/client_golang v1.7.0/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
|
||||
github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
|
||||
github.com/prometheus/client_golang v1.9.0 h1:Rrch9mh17XcxvEu9D9DEpb4isxjGBtcevQjKvxPRQIU=
|
||||
github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU=
|
||||
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
||||
github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
||||
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||
github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||
github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=
|
||||
github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||
github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
|
||||
github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
|
||||
github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
|
||||
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
|
||||
github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA=
|
||||
github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
|
||||
github.com/prometheus/common v0.15.0 h1:4fgOnadei3EZvgRwxJ7RMpG1k1pOZth5Pc13tyspaKM=
|
||||
github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s=
|
||||
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||
github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||
github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
|
||||
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
|
||||
github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
|
||||
github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
|
||||
github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
|
||||
github.com/prometheus/procfs v0.3.0 h1:Uehi/mxLK0eiUc0H0++5tpMGTexB8wZ598MIgU8VpDM=
|
||||
github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
|
||||
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
|
||||
github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
|
||||
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
|
||||
github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||
github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
|
||||
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
|
||||
github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E=
|
||||
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
|
||||
github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644/go.mod h1:nkxAfR/5quYxwPZhyDxgasBMnRtBZd0FCEpawpjMUFg=
|
||||
github.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18 h1:DAYUYH5869yV94zvCES9F51oYtN5oGlwjxJJz7ZCnik=
|
||||
github.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18/go.mod h1:nkxAfR/5quYxwPZhyDxgasBMnRtBZd0FCEpawpjMUFg=
|
||||
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
|
||||
github.com/siddontang/go v0.0.0-20170517070808-cb568a3e5cc0/go.mod h1:3yhqj7WBBfRhbBlzyOC3gUxftwsU0u8gqevxwIHQpMw=
|
||||
github.com/siddontang/goredis v0.0.0-20150324035039-760763f78400/go.mod h1:DDcKzU3qCuvj/tPnimWSsZZzvk9qvkvrIL5naVBPh5s=
|
||||
github.com/siddontang/rdb v0.0.0-20150307021120-fc89ed2e418d/go.mod h1:AMEsy7v5z92TR1JKMkLLoaOQk++LVnOKL3ScbJ8GNGA=
|
||||
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
||||
github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
||||
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
|
||||
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
||||
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
|
||||
github.com/smartwalle/pongo2render v1.0.1/go.mod h1:MGnTzND7nEMz7g194kjlnw8lx/V5JJlb1hr5kDXEO0I=
|
||||
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
||||
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
|
||||
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
|
||||
github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY=
|
||||
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
|
||||
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
|
||||
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
|
||||
github.com/spf13/cobra v0.0.0-20170417170307-b6cb39589372/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
|
||||
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
|
||||
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
|
||||
github.com/spf13/pflag v0.0.0-20170417173400-9e4c21054fa1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||
github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||
github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
|
||||
github.com/ssdb/gossdb v0.0.0-20180723034631-88f6b59b84ec/go.mod h1:QBvMkMya+gXctz3kmljlUCu/yB3GZ6oee+dUozsezQE=
|
||||
github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
|
||||
github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
|
||||
github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||
github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
|
||||
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
|
||||
github.com/syndtr/goleveldb v0.0.0-20160425020131-cfa635847112/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0=
|
||||
github.com/syndtr/goleveldb v0.0.0-20181127023241-353a9fca669c/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0=
|
||||
github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4=
|
||||
github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
|
||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
||||
github.com/ugorji/go v0.0.0-20171122102828-84cb69a8af83/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ=
|
||||
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
|
||||
github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
|
||||
github.com/vk496/cron v1.2.0 h1:fDxb4qNi6Rmxh3h9snW1sKJ0nHgjpg3fYc0Oq+igbvk=
|
||||
github.com/vk496/cron v1.2.0/go.mod h1:f8lpm+SIXbjvujp8Dix4S2B+GGva/q0yrRPQ8hwTtOc=
|
||||
github.com/wendal/errors v0.0.0-20130201093226-f66c77a7882b/go.mod h1:Q12BUT7DqIlHRmgv3RskH+UCM/4eqVMgI0EMmlSpAXc=
|
||||
github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c h1:u40Z8hqBAAQyv+vATcGgV0YCnDjqSL7/q/JyPhhJSPk=
|
||||
github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I=
|
||||
github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc h1:n+nNi93yXLkJvKwXNP9d55HC7lGK4H/SRcwB5IaUZLo=
|
||||
github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y=
|
||||
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
|
||||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
github.com/yuin/gopher-lua v0.0.0-20171031051903-609c9cd26973/go.mod h1:aEV29XrmTYFr3CiRxZeGHpkvbwq+prZduBqMaascyCU=
|
||||
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
|
||||
go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
|
||||
go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg=
|
||||
go.etcd.io/etcd v3.3.25+incompatible/go.mod h1:yaeTdrJi5lOmYerz05bd8+V7KubZs8YSFZfzsF9A6aI=
|
||||
go.mongodb.org/mongo-driver v1.4.5 h1:TLtO+iD8krabXxvY1F1qpBOHgOxhLWR7XsT7kQeRmMY=
|
||||
go.mongodb.org/mongo-driver v1.4.5/go.mod h1:WcMNYLx/IlOxLe6JRJiv2uXuCz6zBLndR4SoGjYphSc=
|
||||
go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
|
||||
go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
|
||||
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
|
||||
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
|
||||
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||
go.starlark.net v0.0.0-20190702223751-32f345186213/go.mod h1:c1/X6cHgvdXj6pUlmWKMkuqRnW4K8x2vwt6JAaaircg=
|
||||
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
||||
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
||||
go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
|
||||
go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
|
||||
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
|
||||
go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
|
||||
go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
|
||||
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
|
||||
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
|
||||
go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
|
||||
go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc=
|
||||
golang.org/x/arch v0.0.0-20190927153633-4e8777c89be4/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=
|
||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
|
||||
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad h1:DN0cp81fZ3njFcrLCytUHRSUkqBjfTo4Tx9RJTWs0EY=
|
||||
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
|
||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
||||
golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
|
||||
golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
|
||||
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
||||
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
||||
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||
golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||
golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||
golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
||||
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
|
||||
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
|
||||
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
|
||||
golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
|
||||
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
|
||||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.4.1 h1:Kvvh58BN8Y9/lBi7hTekvtMpm07eUZ0ck5pRHpsMWrY=
|
||||
golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
||||
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||
golang.org/x/net v0.0.0-20210119194325-5f4716e94777 h1:003p0dJM77cxMSyCPFphvZf/Y5/NXf5fzg6ufd1/Oew=
|
||||
golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0=
|
||||
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a h1:DcqTD9SDLc+1P/r1EmRBwnVsrOwW+kk2vWf9n+1sGhs=
|
||||
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4 h1:myAQVi0cGEoqQVR5POX+8RR2mrocKqNN1hmeMqhX27k=
|
||||
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.5 h1:i6eZZ+zk0SOf0xgBpEpPD18qWcJda6q1sxt3S0kzyUQ=
|
||||
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||
golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||
golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||
golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20191127201027-ecd32218bd7f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||
golang.org/x/tools v0.0.0-20201211185031-d93e913c1a58/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||
golang.org/x/tools v0.1.0 h1:po9/4sTYwZU9lPhi1tOrb4hCv3qrhiQ77LZfGa2OjwY=
|
||||
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
|
||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
|
||||
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
|
||||
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
|
||||
google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
|
||||
google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
|
||||
google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
|
||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||
google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||
google.golang.org/appengine v1.6.1 h1:QzqyMA1tlu6CgqCDUtU9V+ZKhLFT2dkJuANu5QaxI3I=
|
||||
google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
|
||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||
google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||
google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||
google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||
google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s=
|
||||
google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
||||
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
||||
google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
|
||||
google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
||||
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
|
||||
google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
|
||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||
google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM=
|
||||
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
|
||||
google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
|
||||
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
|
||||
google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
|
||||
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
|
||||
google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
|
||||
google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
||||
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
|
||||
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
|
||||
google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||
google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c=
|
||||
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
|
||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b h1:QRR6H1YWRnHb4Y/HeNFCTJLFVxaq6wH4YuVdsUOr75U=
|
||||
gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
|
||||
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
||||
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
||||
gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o=
|
||||
gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
||||
gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
|
||||
gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
|
||||
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
|
||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
|
||||
gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
|
||||
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
|
||||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
|
||||
honnef.co/go/tools v0.0.1-2020.1.5/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
|
||||
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
|
||||
rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
|
||||
sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
|
||||
sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU=
|
31
main.go
Normal file
@ -0,0 +1,31 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"os"
|
||||
|
||||
"cloud.o-forge.io/core/oc-catalog/routers"
|
||||
"cloud.o-forge.io/core/oc-catalog/services"
|
||||
|
||||
beego "github.com/beego/beego/v2/server/web"
|
||||
)
|
||||
|
||||
func main() {
|
||||
|
||||
// If we have any parameter, we run the beego directly
|
||||
if len(os.Args) > 1 {
|
||||
beego.Run()
|
||||
}
|
||||
|
||||
routers.Init()
|
||||
services.Init()
|
||||
|
||||
if beego.BConfig.RunMode == "dev" {
|
||||
// beego.BConfig.WebConfig.DirectoryIndex = true
|
||||
beego.BConfig.WebConfig.StaticDir["/swagger"] = "swagger"
|
||||
}
|
||||
beego.Run()
|
||||
|
||||
defer func() {
|
||||
services.MongoDisconnect()
|
||||
}()
|
||||
}
|
164
models/computing.go
Normal file
@ -0,0 +1,164 @@
|
||||
package models
|
||||
|
||||
import (
|
||||
"cloud.o-forge.io/core/oc-catalog/models/rtype"
|
||||
"cloud.o-forge.io/core/oc-catalog/services"
|
||||
"github.com/beego/beego/v2/core/logs"
|
||||
"go.mongodb.org/mongo-driver/bson/primitive"
|
||||
)
|
||||
|
||||
type ExecutionRequirementsModel struct {
|
||||
CPUs uint `json:"cpus" required:"true"`
|
||||
GPUs uint `json:"gpus" description:"Amount of GPUs needed"`
|
||||
RAM uint `json:"ram" required:"true" description:"Units in MB"`
|
||||
|
||||
// We should check closely how to deal with storage, since they are independent models
|
||||
// but also part of a DataCenter
|
||||
// Storage uint `json:"storage" description:"Units in MB"`
|
||||
|
||||
Parallel bool `json:"parallel"`
|
||||
ScalingModel uint `json:"scaling_model"`
|
||||
DiskIO string `json:"disk_io"`
|
||||
}
|
||||
|
||||
type RepositoryModel struct {
|
||||
Credentials string `json:"credentials"`
|
||||
Url string `json:"url"`
|
||||
}
|
||||
|
||||
type ComputingNEWModel struct {
|
||||
Description string `json:"description" 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"`
|
||||
|
||||
Type string `json:"type,omitempty" required:"true"`
|
||||
Owner string `json:"owner"`
|
||||
License string `json:"license"`
|
||||
Price uint `json:"price"`
|
||||
|
||||
ExecutionRequirements ExecutionRequirementsModel `json:"execution_requirements"`
|
||||
|
||||
Dinputs []string
|
||||
Doutputs []string
|
||||
|
||||
Repository RepositoryModel `json:"repository"`
|
||||
}
|
||||
|
||||
type ComputingModel struct {
|
||||
ID string `json:"ID" bson:"_id" required:"true" example:"5099803df3f4948bd2f98391"`
|
||||
ComputingNEWModel `bson:",inline"`
|
||||
}
|
||||
|
||||
func (model ComputingModel) getRtype() rtype.Rtype {
|
||||
return rtype.COMPUTING
|
||||
}
|
||||
|
||||
func (model ComputingModel) getName() string {
|
||||
return model.Name
|
||||
}
|
||||
|
||||
// A user can have multiple workload project with the same model. We must distinguish what is
|
||||
// the model and what is the user object
|
||||
|
||||
type ComputingObject struct {
|
||||
ReferenceID primitive.ObjectID `json:"referenceID" description:"Computing model ID"`
|
||||
|
||||
Inputs []string `json:"inputs"`
|
||||
Outputs []string `json:"outputs"`
|
||||
|
||||
DataCenterID string `json:"datacenterID" description:"Datacenter where the computing will be executed"`
|
||||
}
|
||||
|
||||
func (obj ComputingObject) getHost() *string {
|
||||
return nil // Host is DC only attribute
|
||||
}
|
||||
|
||||
func (obj *ComputingObject) setReference(rID primitive.ObjectID) {
|
||||
obj.ReferenceID = rID
|
||||
}
|
||||
|
||||
func (obj ComputingObject) getReference() primitive.ObjectID {
|
||||
return obj.ReferenceID
|
||||
}
|
||||
|
||||
func (obj ComputingObject) getRtype() rtype.Rtype {
|
||||
return rtype.COMPUTING
|
||||
}
|
||||
|
||||
func (obj ComputingObject) getModel() (ret ResourceModel, err error) {
|
||||
var ret2 ComputingModel
|
||||
res := services.MngoCollComputing.FindOne(services.MngoCtx,
|
||||
primitive.M{"_id": obj.ReferenceID},
|
||||
)
|
||||
|
||||
if err = res.Err(); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
err = res.Decode(&ret2)
|
||||
return ret2, err
|
||||
}
|
||||
|
||||
func (obj ComputingObject) getName() (name *string) {
|
||||
|
||||
aa, err := obj.getModel()
|
||||
|
||||
if err != nil {
|
||||
logs.Warn(err)
|
||||
return
|
||||
}
|
||||
|
||||
name2 := aa.getName()
|
||||
|
||||
return &name2
|
||||
}
|
||||
|
||||
func (obj ComputingObject) isLinked(rObjID string) LinkingState {
|
||||
if contains(obj.Inputs, rObjID) {
|
||||
return INPUT
|
||||
}
|
||||
|
||||
if contains(obj.Outputs, rObjID) {
|
||||
return OUTPUT
|
||||
}
|
||||
|
||||
return NO_LINK
|
||||
}
|
||||
|
||||
func (obj *ComputingObject) addLink(direction LinkingState, rID string) {
|
||||
switch direction {
|
||||
case INPUT:
|
||||
obj.Inputs = append(obj.Inputs, rID)
|
||||
case OUTPUT:
|
||||
obj.Outputs = append(obj.Outputs, rID)
|
||||
}
|
||||
}
|
||||
|
||||
func GetOneComputing(ID string) (object *ComputingModel, err error) {
|
||||
obj, err := getOneResourceByID(ID, rtype.COMPUTING)
|
||||
|
||||
if err != nil {
|
||||
return object, err
|
||||
}
|
||||
|
||||
object = obj.(*ComputingModel)
|
||||
|
||||
return object, err
|
||||
}
|
||||
|
||||
func GetMultipleComputing(IDs []string) (object *[]ComputingModel, err error) {
|
||||
objArray, err := getMultipleResourceByIDs(IDs, rtype.COMPUTING)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
object = objArray.(*[]ComputingModel)
|
||||
|
||||
return object, err
|
||||
}
|
||||
|
||||
func PostOneComputing(obj ComputingNEWModel) (ID string, err error) {
|
||||
return postOneResource(obj, rtype.COMPUTING)
|
||||
}
|
125
models/data.go
Normal file
@ -0,0 +1,125 @@
|
||||
package models
|
||||
|
||||
import (
|
||||
"cloud.o-forge.io/core/oc-catalog/models/rtype"
|
||||
"cloud.o-forge.io/core/oc-catalog/services"
|
||||
"github.com/beego/beego/v2/core/logs"
|
||||
"go.mongodb.org/mongo-driver/bson/primitive"
|
||||
)
|
||||
|
||||
// TODO: Define better the different types of Data model with model herarchy
|
||||
// TODO: review why swagger are not using the metadata when we do herarchy
|
||||
type DataNEWModel struct {
|
||||
Name string `json:"name,omitempty" required:"true" validate:"required" description:"Name of the data"`
|
||||
ShortDescription string `json:"short_description" required:"true" validate:"required"`
|
||||
Logo string `json:"logo" required:"true" validate:"required"`
|
||||
Description string `json:"description" required:"true" validate:"required"`
|
||||
|
||||
Type string `json:"type,omitempty" required:"true" validate:"required" description:"Define type of data" example:"file"`
|
||||
Example string `json:"example" required:"true" validate:"required" description:"base64 encoded data"`
|
||||
Location string `json:"location" required:"true" validate:"required"`
|
||||
Dtype string `json:"dtype"`
|
||||
Protocol []string `json:"protocol"` //TODO Enum type
|
||||
}
|
||||
|
||||
type DataModel struct {
|
||||
ID string `json:"ID" bson:"_id" required:"true" validate:"required"`
|
||||
DataNEWModel `bson:",inline"`
|
||||
}
|
||||
|
||||
func (obj DataModel) getRtype() rtype.Rtype {
|
||||
return rtype.DATA
|
||||
}
|
||||
|
||||
func (model DataModel) getName() string {
|
||||
return model.Name
|
||||
}
|
||||
|
||||
type DataIO struct {
|
||||
Counter uint `description:"Incremental number starting from 0"`
|
||||
}
|
||||
|
||||
type DataObject struct {
|
||||
ReferenceID primitive.ObjectID `json:"referenceID" description:"Data model ID"`
|
||||
}
|
||||
|
||||
func (obj DataObject) getHost() *string {
|
||||
return nil // Host is DC only attribute
|
||||
}
|
||||
|
||||
func (obj DataObject) getModel() (ret ResourceModel, err error) {
|
||||
var ret2 DataModel
|
||||
res := services.MngoCollData.FindOne(services.MngoCtx,
|
||||
primitive.M{"_id": obj.ReferenceID},
|
||||
)
|
||||
|
||||
if err = res.Err(); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
err = res.Decode(&ret2)
|
||||
return ret2, err
|
||||
}
|
||||
|
||||
func (obj *DataObject) setReference(rID primitive.ObjectID) {
|
||||
obj.ReferenceID = rID
|
||||
}
|
||||
|
||||
func (obj DataObject) getReference() primitive.ObjectID {
|
||||
return obj.ReferenceID
|
||||
}
|
||||
|
||||
func (obj DataObject) getRtype() rtype.Rtype {
|
||||
return rtype.DATA
|
||||
}
|
||||
|
||||
func (obj DataObject) getName() (name *string) {
|
||||
|
||||
res := services.MngoCollData.FindOne(services.MngoCtx, primitive.M{"_id": obj.ReferenceID})
|
||||
|
||||
if res.Err() != nil {
|
||||
logs.Error(res)
|
||||
return
|
||||
}
|
||||
|
||||
var ret DataModel
|
||||
res.Decode(&ret)
|
||||
|
||||
return &ret.Name
|
||||
}
|
||||
|
||||
func (obj DataObject) isLinked(rID string) LinkingState {
|
||||
return NO_LINK
|
||||
}
|
||||
|
||||
func (obj *DataObject) addLink(direction LinkingState, rObjID string) {
|
||||
|
||||
}
|
||||
|
||||
func PostOneData(obj DataNEWModel) (string, error) {
|
||||
return postOneResource(obj, rtype.DATA)
|
||||
}
|
||||
|
||||
func GetMultipleData(IDs []string) (object *[]DataModel, err error) {
|
||||
objArray, err := getMultipleResourceByIDs(IDs, rtype.DATA)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
object = objArray.(*[]DataModel)
|
||||
|
||||
return object, err
|
||||
}
|
||||
|
||||
func GetOneData(ID string) (object *DataModel, err error) {
|
||||
obj, err := getOneResourceByID(ID, rtype.DATA)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
object = obj.(*DataModel)
|
||||
|
||||
return object, err
|
||||
}
|
212
models/datacenter.go
Normal file
@ -0,0 +1,212 @@
|
||||
package models
|
||||
|
||||
import (
|
||||
"net"
|
||||
"time"
|
||||
|
||||
"cloud.o-forge.io/core/oc-catalog/models/rtype"
|
||||
"cloud.o-forge.io/core/oc-catalog/services"
|
||||
"github.com/beego/beego/v2/core/logs"
|
||||
"go.mongodb.org/mongo-driver/bson/primitive"
|
||||
)
|
||||
|
||||
type DatacenterCpuModel struct {
|
||||
Cores uint `json:"cores" required:"true"` //TODO: validate
|
||||
Architecture string `json:"architecture"` //TOOD: enum
|
||||
Shared bool `json:"shared"`
|
||||
MinimumMemory uint `json:"minimum_memory"`
|
||||
Platform string `json:"platform"`
|
||||
}
|
||||
|
||||
type DatacenterMemoryModel struct {
|
||||
Size uint `json:"size" description:"Units in MB"`
|
||||
Ecc bool `json:"ecc"`
|
||||
}
|
||||
|
||||
type DatacenterGpuModel struct {
|
||||
CudaCores uint `json:"cuda_cores"`
|
||||
Model string `json:"model"`
|
||||
Memory uint `json:"memory" description:"Units in MB"`
|
||||
TensorCores uint `json:"tensor_cores"`
|
||||
}
|
||||
|
||||
type DatacenterNEWModel struct {
|
||||
Name string `json:"name" required:"true"`
|
||||
Type string `json:"type,omitempty" required:"true"`
|
||||
Acronym string `json:"acronym" required:"true" description:"id of the DC"`
|
||||
Hosts []string `json:"hosts" required:"true" description:"list of host:port"`
|
||||
Description string `json:"description" required:"true"`
|
||||
ShortDescription string `json:"short_description" required:"true" validate:"required"`
|
||||
Logo string `json:"logo" required:"true" validate:"required"`
|
||||
|
||||
CPU DatacenterCpuModel `json:"cpu" required:"true"`
|
||||
RAM DatacenterMemoryModel `json:"ram" required:"true"`
|
||||
GPU []DatacenterGpuModel `json:"gpu" required:"true"`
|
||||
|
||||
Owner string `json:"owner" `
|
||||
BookingPrice int `json:"bookingPrice" `
|
||||
}
|
||||
|
||||
type DatacenterModel struct {
|
||||
ID string `json:"ID" bson:"_id" required:"true"`
|
||||
DatacenterNEWModel `bson:",inline"`
|
||||
}
|
||||
|
||||
func GetDatacenterFromAcronym(DC_name string) (retObj *DatacenterModel) {
|
||||
// TODO: This call should get the data from the peers, since it could be a different
|
||||
// host in the future
|
||||
res := services.MngoCollDatacenter.FindOne(services.MngoCtx, primitive.M{"acronym": DC_name})
|
||||
|
||||
if res.Err() != nil {
|
||||
logs.Error(res)
|
||||
return
|
||||
}
|
||||
|
||||
var ret DatacenterModel
|
||||
res.Decode(&ret)
|
||||
|
||||
return &ret
|
||||
}
|
||||
|
||||
func (obj DatacenterModel) GetTotalCPUs() uint {
|
||||
return obj.CPU.Cores
|
||||
}
|
||||
|
||||
func (obj DatacenterModel) GetTotalGPUs() uint {
|
||||
return uint(len(obj.GPU))
|
||||
}
|
||||
|
||||
func (obj DatacenterModel) GetTotalRAM() uint {
|
||||
return obj.RAM.Size
|
||||
}
|
||||
|
||||
func (obj DatacenterModel) getRtype() rtype.Rtype {
|
||||
return rtype.DATACENTER
|
||||
}
|
||||
|
||||
func (model DatacenterModel) getName() string {
|
||||
return model.Name
|
||||
}
|
||||
|
||||
type DatacenterObject struct {
|
||||
ReferenceID primitive.ObjectID `json:"referenceID" description:"Data model ID"`
|
||||
}
|
||||
|
||||
func (obj *DatacenterObject) setReference(rID primitive.ObjectID) {
|
||||
obj.ReferenceID = rID
|
||||
}
|
||||
|
||||
func (obj DatacenterObject) getModel() (ret ResourceModel, err error) {
|
||||
var ret2 DatacenterModel
|
||||
res := services.MngoCollDatacenter.FindOne(services.MngoCtx,
|
||||
primitive.M{"_id": obj.ReferenceID},
|
||||
)
|
||||
|
||||
if err = res.Err(); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
err = res.Decode(&ret2)
|
||||
return ret2, err
|
||||
}
|
||||
|
||||
func (obj DatacenterObject) getReference() primitive.ObjectID {
|
||||
return obj.ReferenceID
|
||||
}
|
||||
|
||||
// Return a reachable host. If no one is reachable, return the first entry
|
||||
func (obj DatacenterObject) getHost() (host *string) {
|
||||
res := services.MngoCollDatacenter.FindOne(services.MngoCtx, primitive.M{"_id": obj.ReferenceID})
|
||||
|
||||
if res.Err() != nil {
|
||||
logs.Error(res)
|
||||
return nil
|
||||
}
|
||||
|
||||
var ret DatacenterModel
|
||||
|
||||
err := res.Decode(&ret)
|
||||
if err != nil {
|
||||
logs.Error(res)
|
||||
return nil
|
||||
}
|
||||
|
||||
host = GetHost(ret.Hosts)
|
||||
return
|
||||
}
|
||||
|
||||
func GetHost(hosts []string) (host *string) {
|
||||
// Return the first one if we can't reach any server
|
||||
host = &hosts[0]
|
||||
|
||||
for _, singleHost := range hosts {
|
||||
conn, err := net.DialTimeout("tcp", singleHost, time.Duration(3)*time.Second) //FIXME: longer wait for connection in the future?
|
||||
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
|
||||
if conn != nil {
|
||||
//bingo
|
||||
host = &singleHost
|
||||
conn.Close()
|
||||
return
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (obj DatacenterObject) getRtype() rtype.Rtype {
|
||||
return rtype.DATACENTER
|
||||
}
|
||||
|
||||
func (obj DatacenterObject) getName() (name *string) {
|
||||
|
||||
res := services.MngoCollDatacenter.FindOne(services.MngoCtx, primitive.M{"_id": obj.ReferenceID})
|
||||
|
||||
if res.Err() != nil {
|
||||
logs.Error(res)
|
||||
return
|
||||
}
|
||||
|
||||
var ret DatacenterModel
|
||||
res.Decode(&ret)
|
||||
|
||||
return &ret.Name
|
||||
}
|
||||
|
||||
func (obj DatacenterObject) isLinked(rID string) LinkingState {
|
||||
return NO_LINK
|
||||
}
|
||||
|
||||
func (obj *DatacenterObject) addLink(direction LinkingState, rObjID string) {
|
||||
|
||||
}
|
||||
|
||||
func PostOneDatacenter(obj DatacenterNEWModel) (string, error) {
|
||||
return postOneResource(obj, rtype.DATACENTER)
|
||||
}
|
||||
|
||||
func GetMultipleDatacenter(IDs []string) (object *[]DatacenterModel, err error) {
|
||||
objArray, err := getMultipleResourceByIDs(IDs, rtype.DATACENTER)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
object = objArray.(*[]DatacenterModel)
|
||||
|
||||
return object, err
|
||||
}
|
||||
|
||||
func GetOneDatacenter(ID string) (object *DatacenterModel, err error) {
|
||||
obj, err := getOneResourceByID(ID, rtype.DATACENTER)
|
||||
|
||||
if err != nil {
|
||||
return object, err
|
||||
}
|
||||
|
||||
object = obj.(*DatacenterModel) //TODO: fix a possible segfault in this model and the others
|
||||
|
||||
return object, err
|
||||
}
|
118
models/generic.go
Normal file
@ -0,0 +1,118 @@
|
||||
package models
|
||||
|
||||
import (
|
||||
"errors"
|
||||
|
||||
"cloud.o-forge.io/core/oc-catalog/models/rtype"
|
||||
"cloud.o-forge.io/core/oc-catalog/services"
|
||||
"github.com/beego/beego/v2/core/logs"
|
||||
"go.mongodb.org/mongo-driver/bson"
|
||||
"go.mongodb.org/mongo-driver/bson/primitive"
|
||||
"go.mongodb.org/mongo-driver/mongo/options"
|
||||
)
|
||||
|
||||
func getObjIDFromString(id string) interface{} {
|
||||
objectID, err := primitive.ObjectIDFromHex(id)
|
||||
if err == nil {
|
||||
return objectID
|
||||
}
|
||||
|
||||
return id
|
||||
}
|
||||
|
||||
func getMultipleObjIDFromArray(ids []string) []interface{} {
|
||||
|
||||
var ret []interface{}
|
||||
|
||||
for _, val := range ids {
|
||||
ret = append(ret, getObjIDFromString(val))
|
||||
}
|
||||
|
||||
return ret
|
||||
|
||||
}
|
||||
|
||||
func getOneResourceByID(ID string, rType rtype.Rtype) (obj interface{}, err error) {
|
||||
|
||||
targetDBCollection := rType.MongoCollection()
|
||||
var retObj interface{}
|
||||
|
||||
// asd := rType.
|
||||
switch rType {
|
||||
case rtype.DATA:
|
||||
retObj = &DataModel{}
|
||||
case rtype.COMPUTING:
|
||||
retObj = &ComputingModel{}
|
||||
case rtype.STORAGE:
|
||||
retObj = &StorageModel{}
|
||||
case rtype.DATACENTER:
|
||||
retObj = &DatacenterModel{}
|
||||
default:
|
||||
message := "Rtype " + rType.String() + " is not implemented"
|
||||
logs.Error(message)
|
||||
return nil, errors.New(message)
|
||||
}
|
||||
|
||||
filter := bson.M{"_id": getObjIDFromString(ID)}
|
||||
|
||||
res := targetDBCollection.FindOne(services.MngoCtx, filter)
|
||||
res.Decode(retObj)
|
||||
|
||||
if res.Err() != nil {
|
||||
logs.Warn("Couldn't find resource: " + res.Err().Error())
|
||||
}
|
||||
|
||||
return retObj, res.Err()
|
||||
}
|
||||
|
||||
func getMultipleResourceByIDs(IDs []string, rType rtype.Rtype) (interface{}, error) {
|
||||
|
||||
targetDBCollection := rType.MongoCollection()
|
||||
var retObj interface{}
|
||||
|
||||
// asd := rType.
|
||||
switch rType {
|
||||
case rtype.DATA:
|
||||
retObj = &[]DataModel{}
|
||||
case rtype.COMPUTING:
|
||||
retObj = &[]ComputingModel{}
|
||||
case rtype.STORAGE:
|
||||
retObj = &[]StorageModel{}
|
||||
case rtype.DATACENTER:
|
||||
retObj = &[]DatacenterModel{}
|
||||
default:
|
||||
message := "Rtype " + rType.String() + " is not implemented"
|
||||
logs.Error(message)
|
||||
return nil, errors.New(message)
|
||||
}
|
||||
|
||||
filter := bson.M{"_id": bson.M{"$in": getMultipleObjIDFromArray(IDs)}}
|
||||
|
||||
//FIXME: Limit of find
|
||||
res, err := targetDBCollection.Find(services.MngoCtx,
|
||||
filter,
|
||||
options.Find().SetLimit(100),
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
logs.Warn("Couldn't find multiple data: " + err.Error())
|
||||
return nil, err
|
||||
}
|
||||
res.All(services.MngoCtx, retObj)
|
||||
|
||||
return retObj, res.Err()
|
||||
}
|
||||
|
||||
func postOneResource(retObj interface{}, rType rtype.Rtype) (ID string, err error) {
|
||||
|
||||
targetDBCollection := rType.MongoCollection()
|
||||
|
||||
result, err := targetDBCollection.InsertOne(services.MngoCtx, retObj)
|
||||
if err != nil {
|
||||
logs.Warn("Couldn't insert resource: " + err.Error())
|
||||
return "", err
|
||||
}
|
||||
|
||||
return result.InsertedID.(primitive.ObjectID).Hex(), nil
|
||||
|
||||
}
|
35
models/mxgraph.go
Normal file
@ -0,0 +1,35 @@
|
||||
package models
|
||||
|
||||
import (
|
||||
"encoding/xml"
|
||||
)
|
||||
|
||||
type MxGraphModel struct {
|
||||
XMLName xml.Name `xml:"mxGraphModel"`
|
||||
|
||||
Root struct {
|
||||
XMLName xml.Name `xml:"root"`
|
||||
MxCell []MxCell `xml:"mxCell"`
|
||||
}
|
||||
}
|
||||
|
||||
type MxCell struct {
|
||||
XMLName xml.Name `xml:"mxCell"`
|
||||
ID string `xml:"id,attr"`
|
||||
Parent *string `xml:"parent,attr"`
|
||||
RID *string `xml:"rID,attr"`
|
||||
Source *string `xml:"source,attr"`
|
||||
Target *string `xml:"target,attr"`
|
||||
}
|
||||
|
||||
type mxissue struct {
|
||||
msg string
|
||||
}
|
||||
|
||||
func (m *mxissue) Error() string {
|
||||
return m.msg
|
||||
}
|
||||
|
||||
func newMxIssue(message string) error {
|
||||
return &mxissue{message}
|
||||
}
|
73
models/rtype/rtype.go
Normal file
@ -0,0 +1,73 @@
|
||||
package rtype
|
||||
|
||||
import (
|
||||
"cloud.o-forge.io/core/oc-catalog/services"
|
||||
"github.com/beego/beego/v2/core/logs"
|
||||
"go.mongodb.org/mongo-driver/mongo"
|
||||
)
|
||||
|
||||
//http://www.inanzzz.com/index.php/post/wqbs/a-basic-usage-of-int-and-string-enum-types-in-golang
|
||||
|
||||
type Rtype int
|
||||
|
||||
const (
|
||||
INVALID Rtype = iota
|
||||
DATA
|
||||
COMPUTING
|
||||
STORAGE
|
||||
DATACENTER
|
||||
)
|
||||
|
||||
var extensions = [...]string{
|
||||
"INVALID",
|
||||
"data",
|
||||
"computing",
|
||||
"storage",
|
||||
"datacenter",
|
||||
}
|
||||
|
||||
func IsValidRtype(input string) bool {
|
||||
for _, v := range extensions {
|
||||
if v == input {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
func NewRtype(rType string) Rtype {
|
||||
switch rType {
|
||||
case DATA.String():
|
||||
return DATA
|
||||
case COMPUTING.String():
|
||||
return COMPUTING
|
||||
case STORAGE.String():
|
||||
return STORAGE
|
||||
case DATACENTER.String():
|
||||
return DATACENTER
|
||||
default:
|
||||
return INVALID
|
||||
}
|
||||
}
|
||||
|
||||
func (e Rtype) String() string {
|
||||
return extensions[e]
|
||||
}
|
||||
|
||||
func (e Rtype) MongoCollection() *mongo.Collection {
|
||||
switch e {
|
||||
case DATA:
|
||||
return services.MngoCollData
|
||||
case COMPUTING:
|
||||
return services.MngoCollComputing
|
||||
case STORAGE:
|
||||
return services.MngoCollStorage
|
||||
case DATACENTER:
|
||||
return services.MngoCollDatacenter
|
||||
default:
|
||||
message := "Rtype " + e.String() + " is not implemented. Returning a nil"
|
||||
logs.Error(message)
|
||||
return nil
|
||||
}
|
||||
}
|
322
models/schedule.go
Normal file
@ -0,0 +1,322 @@
|
||||
package models
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"time"
|
||||
|
||||
"cloud.o-forge.io/core/oc-catalog/services"
|
||||
"github.com/beego/beego/v2/core/logs"
|
||||
"github.com/vk496/cron"
|
||||
"go.mongodb.org/mongo-driver/bson/primitive"
|
||||
"go.mongodb.org/mongo-driver/mongo"
|
||||
"go.mongodb.org/mongo-driver/mongo/options"
|
||||
)
|
||||
|
||||
const MAX_DATES uint = 1000 // Max number of dates to retrieve
|
||||
const MAX_SCHEDULES int = 200
|
||||
|
||||
type ScheduleDB struct {
|
||||
StartDate time.Time
|
||||
StopDate time.Time
|
||||
Workflow string
|
||||
ResourceQty ExecutionRequirementsModel
|
||||
}
|
||||
|
||||
type ScheduleInfo struct {
|
||||
Total int
|
||||
NextExecutions [5]string
|
||||
}
|
||||
|
||||
type WorkflowSchedule struct {
|
||||
IsService bool `description:"Service: true, Task: false"`
|
||||
StartDate time.Time
|
||||
StopDate time.Time
|
||||
Cron string `json:"cron"`
|
||||
Duration uint `json:"duration" description:"Durantion in seconds" example:"7200"`
|
||||
Events string `json:"events"`
|
||||
IsBooked bool `json:"isBooked"`
|
||||
}
|
||||
|
||||
func timeBetween(base, t1, t2 time.Time) bool {
|
||||
if t2.Before(t1) {
|
||||
return false
|
||||
}
|
||||
|
||||
if (t1.Before(base) || t1.Equal(base)) && (t2.After(base) || t2.Equal(base)) {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
func CheckSchedule(cronString string, duration uint, cronFirstDate, cronLastDate time.Time, desiredToSchedule ExecutionRequirementsModel) (err error) {
|
||||
// ########################################
|
||||
// TODO: Redesign the whole flow for all possible cases. Meanwhile, use it like this
|
||||
// ########################################
|
||||
//
|
||||
// Here we have already a timeslot filled by other cron Task. So we must check if there
|
||||
// is still resources available
|
||||
|
||||
// However, we could have 3 possibilities here:
|
||||
//
|
||||
//
|
||||
// ## Task with start and stop Date in the DB ##
|
||||
//
|
||||
// startDate stopDate
|
||||
// .-----------------------------·
|
||||
// | |
|
||||
// ·-----------------------------·
|
||||
//
|
||||
//
|
||||
// New tasks that have conflicts with what we have in the DB
|
||||
//
|
||||
// CASE1 (beggining):
|
||||
// .--------·
|
||||
// |########W|
|
||||
// ·--------·
|
||||
//
|
||||
// CASE2 (end):
|
||||
// .--------·
|
||||
// |########|
|
||||
// ·--------·
|
||||
//
|
||||
// CASE3 (middle):
|
||||
// .--------·
|
||||
// |########|
|
||||
// ·--------·
|
||||
//
|
||||
// CASE4 (multiple):
|
||||
// .-----· .-· .-----· .----------------·
|
||||
// |#####| |#| |#####| |################|
|
||||
// ·-----· ·-· ·-----· ·----------------·
|
||||
//
|
||||
//
|
||||
// The first 3 cases are trivial. But in the 4th case, we must get the sum of the resources
|
||||
// The same could happen in the opposite, where cases are DB entries
|
||||
|
||||
cron, err := cron.Parse(cronString)
|
||||
if err != nil {
|
||||
return errors.New("Bad cron message: " + err.Error())
|
||||
}
|
||||
|
||||
dcModel := GetDatacenterFromAcronym(services.DC_NAME)
|
||||
if dcModel == nil {
|
||||
return errors.New("The DC " + services.DC_NAME + " doesn't have any DC model with that acronym")
|
||||
}
|
||||
|
||||
if desiredToSchedule.CPUs > dcModel.GetTotalCPUs() {
|
||||
return errors.New("Requested more CPUs than DC have")
|
||||
}
|
||||
if desiredToSchedule.GPUs > dcModel.GetTotalGPUs() {
|
||||
return errors.New("Requested more GPUs than DC have")
|
||||
}
|
||||
if desiredToSchedule.RAM > dcModel.GetTotalRAM() {
|
||||
return errors.New("Requested more RAM than DC have")
|
||||
}
|
||||
|
||||
var lastMongoDBdate ScheduleDB
|
||||
dberr := services.MngoCollSchedule.FindOne(services.MngoCtx,
|
||||
primitive.M{},
|
||||
options.FindOne().SetSort(primitive.D{{"stopdate", -1}}),
|
||||
).Decode(&lastMongoDBdate)
|
||||
|
||||
if dberr != nil {
|
||||
if dberr == mongo.ErrNoDocuments {
|
||||
// The database is empty. We can book without problems
|
||||
return
|
||||
}
|
||||
return dberr
|
||||
}
|
||||
|
||||
// for cursor.Next(services.MngoCtx) {
|
||||
// var item Workspace
|
||||
// if err = cursor.Decode(&item); err != nil {
|
||||
// logs.Error(err)
|
||||
// close(ch)
|
||||
// }
|
||||
// }
|
||||
// var cronScheduleStart, cronScheduleStop time.Time
|
||||
|
||||
// cronScheduleStart = cron.Next(cronFirstDate) // Get the first execution
|
||||
|
||||
for cronScheduleStart := cron.Next(cronFirstDate); !cronScheduleStart.IsZero() && cronScheduleStart.Before(lastMongoDBdate.StopDate); cronScheduleStart = cron.Next(cronScheduleStart) {
|
||||
cronScheduleStop := cronScheduleStart.Add(time.Second * time.Duration(duration))
|
||||
if cronScheduleStop.After(cronLastDate) || cronScheduleStart.Before(cronFirstDate) {
|
||||
// We skip values that are in the middle of the limits
|
||||
continue
|
||||
}
|
||||
// ###########################
|
||||
|
||||
cursor, err := services.MngoCollSchedule.Find(services.MngoCtx,
|
||||
primitive.M{"$or": primitive.A{
|
||||
primitive.M{"startdate": primitive.M{
|
||||
"$gte": cronScheduleStart,
|
||||
"$lte": cronScheduleStop,
|
||||
}},
|
||||
primitive.M{"stopdate": primitive.M{
|
||||
"$gte": cronScheduleStart,
|
||||
"$lte": cronScheduleStop,
|
||||
}},
|
||||
primitive.M{"$and": primitive.A{
|
||||
primitive.M{"startdate": primitive.M{
|
||||
"$lte": cronScheduleStart,
|
||||
}},
|
||||
primitive.M{"stopdate": primitive.M{
|
||||
"$gte": cronScheduleStop,
|
||||
}},
|
||||
}},
|
||||
}},
|
||||
// options.Find().SetSort(primitive.D{{"startdate", 1}}),
|
||||
)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var items []ScheduleDB
|
||||
cursor.All(services.MngoCtx, &items)
|
||||
|
||||
if len(items) == 0 {
|
||||
// A empty time slot. Available
|
||||
continue
|
||||
}
|
||||
|
||||
// There is some workflows booked here. We must check if there is remaining resources
|
||||
var alreadScheduled ExecutionRequirementsModel
|
||||
|
||||
for _, scheduled := range items {
|
||||
alreadScheduled.CPUs += scheduled.ResourceQty.CPUs
|
||||
alreadScheduled.GPUs += scheduled.ResourceQty.GPUs
|
||||
alreadScheduled.RAM += scheduled.ResourceQty.RAM
|
||||
}
|
||||
|
||||
if alreadScheduled.CPUs+desiredToSchedule.CPUs > dcModel.GetTotalCPUs() {
|
||||
return errors.New("Not enough CPU capacity from date " + cronScheduleStart.UTC().String() + " to " + cronScheduleStop.UTC().String())
|
||||
}
|
||||
|
||||
if alreadScheduled.GPUs+desiredToSchedule.GPUs > dcModel.GetTotalGPUs() {
|
||||
return errors.New("Not enough GPU capacity from date " + cronScheduleStart.UTC().String() + " to " + cronScheduleStop.UTC().String())
|
||||
}
|
||||
|
||||
if alreadScheduled.RAM+desiredToSchedule.RAM > dcModel.GetTotalRAM() {
|
||||
return errors.New("Not enough RAM capacity from date " + cronScheduleStart.UTC().String() + " to " + cronScheduleStop.UTC().String())
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func CreateScheduleWorkflow(dcName, userID, workflowName, cronString string, duration uint, startDate, stopDate time.Time, requirements ExecutionRequirementsModel) (ret ScheduleInfo, err error) {
|
||||
|
||||
//TODO: Check that dcName is correct
|
||||
|
||||
err = CheckSchedule(cronString, duration, startDate, stopDate, requirements)
|
||||
if err != nil {
|
||||
return ret, err
|
||||
}
|
||||
|
||||
// Already checked possible errors
|
||||
myCron, _ := cron.Parse(cronString)
|
||||
|
||||
scheduledTimeStart := myCron.Next(time.Now().UTC()) // Get the first execution
|
||||
|
||||
counter := 0
|
||||
|
||||
var uploadSchedule []interface{}
|
||||
|
||||
for !scheduledTimeStart.IsZero() && counter < MAX_SCHEDULES {
|
||||
scheduledTimeStop := scheduledTimeStart.Add(time.Second * time.Duration(duration))
|
||||
if scheduledTimeStop.After(stopDate) || scheduledTimeStart.Before(startDate) {
|
||||
// We skip values that are in the middle of the limits
|
||||
scheduledTimeStart = myCron.Next(scheduledTimeStart)
|
||||
counter++
|
||||
continue
|
||||
}
|
||||
|
||||
uploadSchedule = append(uploadSchedule, ScheduleDB{
|
||||
StartDate: scheduledTimeStart,
|
||||
StopDate: scheduledTimeStop,
|
||||
Workflow: dcName + "." + userID + "." + workflowName,
|
||||
ResourceQty: requirements, //stub
|
||||
})
|
||||
|
||||
scheduledTimeStart = myCron.Next(scheduledTimeStart)
|
||||
counter++
|
||||
}
|
||||
|
||||
//FIXME: Consider doing something with the inserting result
|
||||
_, err = services.MngoCollSchedule.InsertMany(services.MngoCtx, uploadSchedule)
|
||||
if err != nil {
|
||||
logs.Error(err)
|
||||
}
|
||||
|
||||
ret.Total = len(uploadSchedule)
|
||||
for i := 0; i < 5 && len(uploadSchedule) > i; i++ {
|
||||
elem := uploadSchedule[i].(ScheduleDB)
|
||||
ret.NextExecutions[i] = elem.StartDate.String()
|
||||
}
|
||||
|
||||
return
|
||||
|
||||
}
|
||||
|
||||
func GetFarSchedules(baseDate time.Time, isNext bool) *time.Time {
|
||||
|
||||
operator := "$gt"
|
||||
if !isNext {
|
||||
// Previous to this date
|
||||
operator = "$lt"
|
||||
}
|
||||
|
||||
var res *ScheduleDB
|
||||
dberr := services.MngoCollSchedule.FindOne(services.MngoCtx,
|
||||
primitive.M{"startdate": primitive.M{
|
||||
operator: baseDate,
|
||||
}},
|
||||
options.FindOne().SetSort(primitive.D{{"startdate", 1}})).Decode(&res)
|
||||
|
||||
if dberr != nil {
|
||||
logs.Error(dberr)
|
||||
return nil
|
||||
}
|
||||
|
||||
return &res.StartDate
|
||||
}
|
||||
|
||||
func GetSchedules(startDate, stopDate time.Time) (data []ScheduleDB, maxLimit bool, err error) {
|
||||
|
||||
if startDate.After(stopDate) {
|
||||
return nil, false, errors.New("stopDate must be after startDate")
|
||||
}
|
||||
|
||||
// Range of 35 days as max
|
||||
if startDate.Add(24 * time.Hour * time.Duration(35)).Before(stopDate) {
|
||||
return nil, false, errors.New("Must be less than 35 days between startDate and stopDate")
|
||||
}
|
||||
|
||||
//FIXME: Discuss if we should check old schedules
|
||||
// if startDate.Before(time.Now().UTC()) {
|
||||
// return nil, false, errors.New("TimeServer is " + time.Now().UTC().String() + " but your startDate is " + startDate.String())
|
||||
// }
|
||||
|
||||
firstDateCur, err := services.MngoCollSchedule.Find(services.MngoCtx,
|
||||
primitive.M{"startdate": primitive.M{
|
||||
"$gte": startDate,
|
||||
"$lte": stopDate,
|
||||
}},
|
||||
options.Find().SetLimit(int64(MAX_DATES)),
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
firstDateCur.All(services.MngoCtx, &data)
|
||||
|
||||
if len(data) == int(MAX_DATES) {
|
||||
maxLimit = true
|
||||
}
|
||||
|
||||
return
|
||||
|
||||
}
|
101
models/search.go
Normal file
@ -0,0 +1,101 @@
|
||||
package models
|
||||
|
||||
import (
|
||||
"strings"
|
||||
|
||||
"cloud.o-forge.io/core/oc-catalog/services"
|
||||
"github.com/beego/beego/v2/core/logs"
|
||||
|
||||
"go.mongodb.org/mongo-driver/bson"
|
||||
"go.mongodb.org/mongo-driver/mongo"
|
||||
"go.mongodb.org/mongo-driver/mongo/options"
|
||||
)
|
||||
|
||||
type SearchResult struct {
|
||||
Computing []ComputingModel `json:"computing" required:"true"`
|
||||
Datacenter []DatacenterModel `json:"datacenter"`
|
||||
Storage []StorageModel `json:"storage"`
|
||||
Data []DataModel `json:"data"`
|
||||
}
|
||||
|
||||
func FindByWord(word string) (object *SearchResult, err error) {
|
||||
|
||||
returnObject := SearchResult{}
|
||||
opts := options.Find()
|
||||
opts.SetLimit(100) //FIXME: Decide if limit and how
|
||||
|
||||
var cursor *mongo.Cursor
|
||||
if strings.TrimSpace(word) == "*" {
|
||||
word = ""
|
||||
} else {
|
||||
word = `(?i).*` + word + `.*`
|
||||
}
|
||||
// filter := bson.M{"$text": bson.M{"$search": word}}
|
||||
|
||||
if cursor, err = services.MngoCollComputing.Find(
|
||||
services.MngoCtx,
|
||||
bson.M{"$or": []bson.M{
|
||||
{"description": bson.M{"$regex": word}},
|
||||
{"owner": bson.M{"$regex": word}},
|
||||
{"license": bson.M{"$regex": word}},
|
||||
}},
|
||||
opts,
|
||||
); err != nil {
|
||||
logs.Error(err)
|
||||
return nil, err
|
||||
}
|
||||
if err = cursor.All(services.MngoCtx, &returnObject.Computing); err != nil {
|
||||
logs.Error(err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if cursor, err = services.MngoCollDatacenter.Find(
|
||||
services.MngoCtx,
|
||||
bson.M{"$or": []bson.M{
|
||||
{"name": bson.M{"$regex": word}},
|
||||
{"description": bson.M{"$regex": word}},
|
||||
{"owner": bson.M{"$regex": word}},
|
||||
}}, opts,
|
||||
); err != nil {
|
||||
logs.Error(err)
|
||||
return nil, err
|
||||
}
|
||||
if err = cursor.All(services.MngoCtx, &returnObject.Datacenter); err != nil {
|
||||
logs.Error(err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if cursor, err = services.MngoCollStorage.Find(
|
||||
services.MngoCtx,
|
||||
bson.M{"$or": []bson.M{
|
||||
{"name": bson.M{"$regex": word}},
|
||||
{"description": bson.M{"$regex": word}},
|
||||
}},
|
||||
opts,
|
||||
); err != nil {
|
||||
logs.Error(err)
|
||||
return nil, err
|
||||
}
|
||||
if err = cursor.All(services.MngoCtx, &returnObject.Storage); err != nil {
|
||||
logs.Error(err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if cursor, err = services.MngoCollData.Find(
|
||||
services.MngoCtx,
|
||||
bson.M{"$or": []bson.M{
|
||||
{"description": bson.M{"$regex": word}},
|
||||
{"example": bson.M{"$regex": word}},
|
||||
}},
|
||||
opts,
|
||||
); err != nil {
|
||||
logs.Error(err)
|
||||
return nil, err
|
||||
}
|
||||
if err = cursor.All(services.MngoCtx, &returnObject.Data); err != nil {
|
||||
logs.Error(err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &returnObject, nil
|
||||
}
|
138
models/storage.go
Normal file
@ -0,0 +1,138 @@
|
||||
package models
|
||||
|
||||
import (
|
||||
"cloud.o-forge.io/core/oc-catalog/models/rtype"
|
||||
"cloud.o-forge.io/core/oc-catalog/services"
|
||||
"github.com/beego/beego/v2/core/logs"
|
||||
"go.mongodb.org/mongo-driver/bson/primitive"
|
||||
)
|
||||
|
||||
type StorageNEWModel struct {
|
||||
Name string `json:"name" required:"true"`
|
||||
Description string `json:"description" required:"true"`
|
||||
ShortDescription string `json:"short_description" required:"true" validate:"required"`
|
||||
Logo string `json:"logo" required:"true" validate:"required"`
|
||||
Type string `json:"type,omitempty" required:"true"`
|
||||
|
||||
DCacronym string `json:"DCacronym" required:"true" description:"Unique ID of the DC where it is the storage"`
|
||||
|
||||
Size uint `json:"size" required:"true"`
|
||||
Encryption bool `json:"encryption" `
|
||||
Redundancy string `json:"redundancy" `
|
||||
Throughput string `json:"throughput" `
|
||||
BookingPrice uint `json:"bookingPrice" `
|
||||
}
|
||||
|
||||
type StorageModel struct {
|
||||
ID string `json:"ID" bson:"_id" required:"true"`
|
||||
StorageNEWModel `bson:",inline"`
|
||||
}
|
||||
|
||||
func (obj StorageModel) getRtype() rtype.Rtype {
|
||||
return rtype.STORAGE
|
||||
}
|
||||
|
||||
func (model StorageModel) getName() string {
|
||||
return model.Name
|
||||
}
|
||||
|
||||
type StorageObject struct {
|
||||
ReferenceID primitive.ObjectID `json:"referenceID" description:"Storage model ID"`
|
||||
|
||||
Inputs []string `json:"inputs" `
|
||||
Outputs []string `json:"outputs" `
|
||||
}
|
||||
|
||||
func (obj StorageObject) getHost() *string {
|
||||
return nil // Host is DC only attribute
|
||||
}
|
||||
|
||||
func (obj StorageObject) getModel() (ret ResourceModel, err error) {
|
||||
var ret2 StorageModel
|
||||
res := services.MngoCollStorage.FindOne(services.MngoCtx,
|
||||
primitive.M{"_id": obj.ReferenceID},
|
||||
)
|
||||
|
||||
if err = res.Err(); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
err = res.Decode(&ret2)
|
||||
return ret2, err
|
||||
}
|
||||
|
||||
func (obj *StorageObject) setReference(rID primitive.ObjectID) {
|
||||
obj.ReferenceID = rID
|
||||
}
|
||||
|
||||
func (obj StorageObject) getReference() primitive.ObjectID {
|
||||
return obj.ReferenceID
|
||||
}
|
||||
|
||||
func (obj StorageObject) getRtype() rtype.Rtype {
|
||||
return rtype.STORAGE
|
||||
}
|
||||
|
||||
func (obj StorageObject) getName() (name *string) {
|
||||
|
||||
res := services.MngoCollStorage.FindOne(services.MngoCtx, primitive.M{"_id": obj.ReferenceID})
|
||||
|
||||
if res.Err() != nil {
|
||||
logs.Error(res)
|
||||
return
|
||||
}
|
||||
|
||||
var ret StorageModel
|
||||
res.Decode(&ret)
|
||||
|
||||
return &ret.Name
|
||||
}
|
||||
|
||||
func (obj StorageObject) isLinked(rObjID string) LinkingState {
|
||||
if contains(obj.Inputs, rObjID) {
|
||||
return INPUT
|
||||
}
|
||||
|
||||
if contains(obj.Outputs, rObjID) {
|
||||
return OUTPUT
|
||||
}
|
||||
|
||||
return NO_LINK
|
||||
}
|
||||
|
||||
func (obj *StorageObject) addLink(direction LinkingState, rObjID string) {
|
||||
switch direction {
|
||||
case INPUT:
|
||||
obj.Inputs = append(obj.Inputs, rObjID)
|
||||
case OUTPUT:
|
||||
obj.Outputs = append(obj.Outputs, rObjID)
|
||||
}
|
||||
}
|
||||
|
||||
func PostOneStorage(obj StorageNEWModel) (string, error) {
|
||||
return postOneResource(obj, rtype.STORAGE)
|
||||
}
|
||||
|
||||
func GetOneStorage(ID string) (object *StorageModel, err error) {
|
||||
obj, err := getOneResourceByID(ID, rtype.STORAGE)
|
||||
|
||||
if err != nil {
|
||||
return object, err
|
||||
}
|
||||
|
||||
object = obj.(*StorageModel)
|
||||
|
||||
return object, err
|
||||
}
|
||||
|
||||
func GetMultipleStorage(IDs []string) (object *[]StorageModel, err error) {
|
||||
objArray, err := getMultipleResourceByIDs(IDs, rtype.STORAGE)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
object = objArray.(*[]StorageModel)
|
||||
|
||||
return object, err
|
||||
}
|
12
models/user.go
Normal file
@ -0,0 +1,12 @@
|
||||
package models
|
||||
|
||||
type UserModel struct {
|
||||
ID string `json:"id,omitempty",bson:"_id"`
|
||||
Username string `json:"username,omitempty"`
|
||||
Password string `json:"password,omitempty"`
|
||||
Email string `json:"email,omitempty"`
|
||||
}
|
||||
|
||||
func Login(username, password string) bool {
|
||||
return true
|
||||
}
|
997
models/workflow.go
Normal file
@ -0,0 +1,997 @@
|
||||
package models
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/xml"
|
||||
"errors"
|
||||
"sort"
|
||||
"time"
|
||||
|
||||
"cloud.o-forge.io/core/oc-catalog/models/rtype"
|
||||
swagger "cloud.o-forge.io/core/oc-catalog/selfapi"
|
||||
"cloud.o-forge.io/core/oc-catalog/services"
|
||||
"github.com/beego/beego/v2/core/logs"
|
||||
"github.com/vk496/cron"
|
||||
"go.mongodb.org/mongo-driver/bson/primitive"
|
||||
)
|
||||
|
||||
type LinkingState uint
|
||||
|
||||
// When we check the schedule of a workflow, we report with this
|
||||
type DCstatus struct {
|
||||
DCname string
|
||||
DCobjID string //FIXME: Probably should be model ID
|
||||
IsReachable bool
|
||||
|
||||
IsAvailable bool
|
||||
Booked *ScheduleInfo
|
||||
|
||||
ErrorMessage string
|
||||
}
|
||||
|
||||
const (
|
||||
NO_LINK LinkingState = iota
|
||||
INPUT
|
||||
OUTPUT
|
||||
)
|
||||
|
||||
func boolToLinkingState(boolState bool) LinkingState {
|
||||
switch boolState {
|
||||
case true:
|
||||
return INPUT
|
||||
case false:
|
||||
return OUTPUT
|
||||
default:
|
||||
return NO_LINK
|
||||
}
|
||||
}
|
||||
|
||||
const SchedulesDB = "schedules"
|
||||
|
||||
type Workflow struct {
|
||||
// The key of the map is the ID of the object itself
|
||||
Data map[string]DataObject `json:"data"`
|
||||
Computing map[string]ComputingObject `json:"computing"`
|
||||
Storage map[string]StorageObject `json:"storage"`
|
||||
Datacenter map[string]DatacenterObject `json:"datacenter"` //TODO: Decide if there should be multiple objects of a datacenter
|
||||
|
||||
Schedules WorkflowSchedule `json:"schedules"`
|
||||
|
||||
MxgraphXML string `description:"State of the mxgraph"`
|
||||
}
|
||||
|
||||
type ResourceObject interface {
|
||||
getHost() *string
|
||||
getName() *string
|
||||
getModel() (ResourceModel, error)
|
||||
getRtype() rtype.Rtype
|
||||
setReference(rObjID primitive.ObjectID)
|
||||
getReference() primitive.ObjectID
|
||||
isLinked(rObjID string) LinkingState
|
||||
addLink(direction LinkingState, rObjID string)
|
||||
}
|
||||
|
||||
// Get a sum of all execution requirements attached to a DC obj
|
||||
func (w Workflow) GetExecutionRequirements(dcIDobj string) (ret ExecutionRequirementsModel, err error) {
|
||||
|
||||
// Find the id of the DC obj
|
||||
|
||||
if _, ok := w.Datacenter[dcIDobj]; !ok {
|
||||
return ExecutionRequirementsModel{}, errors.New("DC obj" + dcIDobj + " doesn't exist in the Workflow")
|
||||
}
|
||||
|
||||
// Get all elements that are attached to the DC
|
||||
|
||||
for _, computingObj := range w.Computing {
|
||||
if computingObj.DataCenterID == dcIDobj {
|
||||
mymodel, err := computingObj.getModel()
|
||||
if err != nil {
|
||||
return ExecutionRequirementsModel{}, err
|
||||
}
|
||||
|
||||
compModel := mymodel.(ComputingModel)
|
||||
|
||||
//TODO a generic way to concatenate execution requirements
|
||||
ret.CPUs += compModel.ExecutionRequirements.CPUs
|
||||
ret.GPUs += compModel.ExecutionRequirements.GPUs
|
||||
ret.RAM += compModel.ExecutionRequirements.RAM
|
||||
}
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func (w *Workflow) GetResource(rObjID *string) (retObj ResourceObject) {
|
||||
|
||||
if rObjID == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
if storVal, ok := w.Data[*rObjID]; ok {
|
||||
retObj = &storVal
|
||||
return
|
||||
}
|
||||
|
||||
if storVal, ok := w.Computing[*rObjID]; ok {
|
||||
retObj = &storVal
|
||||
return
|
||||
}
|
||||
|
||||
if storVal, ok := w.Storage[*rObjID]; ok {
|
||||
retObj = &storVal
|
||||
return
|
||||
}
|
||||
|
||||
if storVal, ok := w.Datacenter[*rObjID]; ok {
|
||||
retObj = &storVal
|
||||
return
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (w *Workflow) GetResourceMapByRtype(rt rtype.Rtype) interface{} {
|
||||
switch rt {
|
||||
case rtype.DATA:
|
||||
return w.Data
|
||||
case rtype.COMPUTING:
|
||||
return w.Computing
|
||||
case rtype.STORAGE:
|
||||
return w.Storage
|
||||
case rtype.DATACENTER:
|
||||
return w.Datacenter
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
func (w *Workflow) CreateResourceObject(rt rtype.Rtype) ResourceObject {
|
||||
var res ResourceObject
|
||||
switch rt {
|
||||
case rtype.DATA:
|
||||
res = &DataObject{}
|
||||
case rtype.COMPUTING:
|
||||
res = &ComputingObject{}
|
||||
case rtype.STORAGE:
|
||||
res = &StorageObject{}
|
||||
case rtype.DATACENTER:
|
||||
res = &DatacenterObject{}
|
||||
default:
|
||||
res = nil
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
func (w *Workflow) AddObj(robj ResourceObject) *primitive.ObjectID {
|
||||
outputID := primitive.NewObjectID()
|
||||
w.UpdateObj(robj, outputID.Hex())
|
||||
|
||||
return &outputID
|
||||
}
|
||||
|
||||
func (w *Workflow) UpdateDB(userID, workflowName string) error {
|
||||
|
||||
_, err := services.MngoCollWorkspace.UpdateOne(services.MngoCtx,
|
||||
primitive.M{"_id": userID},
|
||||
primitive.M{"$set": primitive.M{WorkflowDB + "." + workflowName: w}},
|
||||
)
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
func (w *Workflow) UpdateObj(robj ResourceObject, objID string) {
|
||||
switch robj.getRtype() {
|
||||
case rtype.DATA:
|
||||
var target DataObject
|
||||
if w.Data == nil {
|
||||
//init
|
||||
w.Data = make(map[string]DataObject)
|
||||
}
|
||||
target = *robj.(*DataObject)
|
||||
w.Data[objID] = target
|
||||
|
||||
case rtype.COMPUTING:
|
||||
var target ComputingObject
|
||||
if w.Computing == nil {
|
||||
//init
|
||||
w.Computing = make(map[string]ComputingObject)
|
||||
}
|
||||
target = *robj.(*ComputingObject)
|
||||
w.Computing[objID] = target
|
||||
|
||||
case rtype.STORAGE:
|
||||
var target StorageObject
|
||||
if w.Storage == nil {
|
||||
//init
|
||||
w.Storage = make(map[string]StorageObject)
|
||||
}
|
||||
target = *robj.(*StorageObject)
|
||||
w.Storage[objID] = target
|
||||
case rtype.DATACENTER:
|
||||
var target DatacenterObject
|
||||
if w.Datacenter == nil {
|
||||
//init
|
||||
w.Datacenter = make(map[string]DatacenterObject)
|
||||
}
|
||||
target = *robj.(*DatacenterObject)
|
||||
w.Datacenter[objID] = target
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func GetWorkflow(userID, workflowName string) (workflow *Workflow, err error) {
|
||||
|
||||
userWorkspace := GetWorkspace(userID)
|
||||
|
||||
if userWorkspace != nil {
|
||||
if theWorkflow, ok := userWorkspace.Workflows[workflowName]; ok {
|
||||
return &theWorkflow, nil
|
||||
}
|
||||
logs.Debug("No workflow name")
|
||||
return nil, errors.New("No workflow name")
|
||||
}
|
||||
|
||||
logs.Debug("No workspace")
|
||||
return nil, errors.New("No workspace")
|
||||
}
|
||||
|
||||
func CreateWorkflow(userID, workflowName string) (err error) {
|
||||
|
||||
//TODO: Maybe operate directly in the DB instead retriving the full object?
|
||||
userWorkspace := GetWorkspace(userID)
|
||||
|
||||
// Exist in the DB
|
||||
if userWorkspace != nil {
|
||||
|
||||
if _, ok := userWorkspace.Workflows[workflowName]; ok {
|
||||
message := "Workspace workflow " + workflowName +
|
||||
" is already created for user " + userID
|
||||
logs.Debug(message)
|
||||
return errors.New(message)
|
||||
}
|
||||
|
||||
userWP := &Workflow{}
|
||||
|
||||
// New element
|
||||
addElem := primitive.M{WorkflowDB + "." + workflowName: userWP}
|
||||
|
||||
// If user doesn't have workflows, we must init at least one
|
||||
if userWorkspace.Workflows == nil {
|
||||
addElem = primitive.M{WorkflowDB: map[string]*Workflow{
|
||||
workflowName: userWP,
|
||||
}}
|
||||
}
|
||||
|
||||
_, err := services.MngoCollWorkspace.UpdateOne(services.MngoCtx,
|
||||
primitive.M{"_id": userID},
|
||||
primitive.M{"$set": addElem},
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
message := "Internal error when updating in DB"
|
||||
logs.Debug(message + "; " + err.Error())
|
||||
return errors.New(message)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
return errors.New("Can't create a workflow without a workspace")
|
||||
}
|
||||
|
||||
func CreateObjectInWorkflow(userID, workflowName, rID string) (rObjID2 *string, err error) {
|
||||
|
||||
userWorkspace := GetWorkspace(userID)
|
||||
|
||||
if userWorkspace == nil {
|
||||
return nil, errors.New("No workspace for user " + userID)
|
||||
}
|
||||
|
||||
if _, ok := userWorkspace.Workflows[workflowName]; !ok {
|
||||
return nil, errors.New("Workspace workflow " + workflowName + " doesn't exist for user " + userID)
|
||||
}
|
||||
|
||||
rIDObj, err := primitive.ObjectIDFromHex(rID)
|
||||
|
||||
if err != nil {
|
||||
return nil, errors.New("ID " + rID + " is not valid")
|
||||
}
|
||||
|
||||
//TODO: We are replacing the entire array instead of pushing
|
||||
// a new element. Probably will have problems with multithread/async
|
||||
// operations and consistency in the future
|
||||
|
||||
for rtyp, resource := range userWorkspace.GetResources() {
|
||||
if contains(resource, rID) {
|
||||
wWorkflow := userWorkspace.Workflows[workflowName]
|
||||
|
||||
newObj := wWorkflow.CreateResourceObject(rtyp)
|
||||
newObj.setReference(rIDObj)
|
||||
|
||||
outputID := wWorkflow.AddObj(newObj)
|
||||
|
||||
_, err := services.MngoCollWorkspace.UpdateOne(services.MngoCtx,
|
||||
primitive.M{"_id": userID},
|
||||
primitive.M{"$set": primitive.M{WorkflowDB + "." + workflowName + "." + rtyp.String(): wWorkflow.GetResourceMapByRtype(rtyp)}},
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
return nil, errors.New("Internal error when updating in DB: " + err.Error())
|
||||
}
|
||||
|
||||
outStr := outputID.Hex()
|
||||
|
||||
return &outStr, nil
|
||||
}
|
||||
}
|
||||
|
||||
return nil, errors.New("rID " + rID + " doesn't exist in the user workspace")
|
||||
}
|
||||
|
||||
func LinkObjectsInWorkspace(userID, workflowName, rObjIDsource string, isInput bool, rObjIDtarger string) (err error) {
|
||||
userWorkspace := GetWorkspace(userID)
|
||||
|
||||
if userWorkspace == nil {
|
||||
return errors.New("No workspace for user " + userID)
|
||||
}
|
||||
|
||||
if _, ok := userWorkspace.Workflows[workflowName]; !ok {
|
||||
return errors.New("Workspace workflow " + workflowName + " doesn't exist for user " + userID)
|
||||
}
|
||||
|
||||
// Check rObjIDsource
|
||||
if _, ok := userWorkspace.Workflows[workflowName].Data[rObjIDsource]; !ok {
|
||||
return errors.New("rObjIDsource must be of type DATA for now")
|
||||
}
|
||||
|
||||
// Check rObjIDtarger
|
||||
|
||||
wWorkflow := userWorkspace.Workflows[workflowName]
|
||||
|
||||
resObjTarget := wWorkflow.GetResource(&rObjIDtarger)
|
||||
|
||||
if resObjTarget == nil {
|
||||
return errors.New("rObjIDtarger doesn't exist")
|
||||
} else if resObjTarget.getRtype() == rtype.DATA {
|
||||
return errors.New("rObjIDtarger of type Data doesn't have inputs/outputs")
|
||||
}
|
||||
|
||||
if resObjTarget.isLinked(rObjIDsource) != NO_LINK {
|
||||
return errors.New("rObjIDsource already exists in the inputs or outputs")
|
||||
}
|
||||
|
||||
resObjTarget.addLink(boolToLinkingState(isInput), rObjIDsource)
|
||||
|
||||
_, err = services.MngoCollWorkspace.UpdateOne(services.MngoCtx,
|
||||
primitive.M{"_id": userID},
|
||||
primitive.M{"$set": primitive.M{
|
||||
WorkflowDB + "." +
|
||||
workflowName + "." +
|
||||
resObjTarget.getRtype().String() + "." +
|
||||
rObjIDtarger: resObjTarget}},
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
return errors.New("Internal error when updating in DB: " + err.Error())
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func GetWorkflowSchedule(username, workflowName string) (Currentschedule *WorkflowSchedule, err error) {
|
||||
|
||||
userWorkspace := GetWorkspace(username)
|
||||
|
||||
if userWorkspace == nil {
|
||||
return nil, errors.New("No workspace for user " + username)
|
||||
}
|
||||
|
||||
if workflow, ok := userWorkspace.Workflows[workflowName]; ok {
|
||||
Currentschedule = &workflow.Schedules
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func SetWorkflowSchedule(username, workflowName, cronString, events string, isService bool, startDate, stopDate time.Time, duration uint) (NextSchedules *ScheduleInfo, err error) {
|
||||
|
||||
userWorkspace := GetWorkspace(username)
|
||||
|
||||
if userWorkspace == nil {
|
||||
return nil, errors.New("No workspace for user " + username)
|
||||
}
|
||||
|
||||
// Check if workflow exist
|
||||
if _, ok := userWorkspace.Workflows[workflowName]; !ok {
|
||||
return
|
||||
}
|
||||
|
||||
// We mustn't modify a booked schedule
|
||||
if userWorkspace.Workflows[workflowName].Schedules.IsBooked {
|
||||
return nil, errors.New("A booked schedule can't be modified")
|
||||
}
|
||||
|
||||
sch := WorkflowSchedule{}
|
||||
NextSchedules = &ScheduleInfo{}
|
||||
|
||||
sch.StartDate = startDate
|
||||
sch.StopDate = stopDate
|
||||
sch.IsService = isService
|
||||
|
||||
if isService { // Service
|
||||
NextSchedules.NextExecutions[0] = startDate.String()
|
||||
NextSchedules.Total = 1
|
||||
}
|
||||
|
||||
if !isService { // Task
|
||||
sch.Cron = cronString
|
||||
sch.Duration = duration
|
||||
sch.Events = events
|
||||
|
||||
// Obtain next executions
|
||||
counter := 0
|
||||
myCron, _ := cron.Parse(cronString) // NOTE: already checked in the controller
|
||||
scheduledStart := myCron.Next(startDate) // Get the first execution starting from startDate
|
||||
|
||||
for !scheduledStart.IsZero() && counter < MAX_SCHEDULES {
|
||||
scheduleStop := scheduledStart.Add(time.Second * time.Duration(duration))
|
||||
if scheduleStop.After(stopDate) || scheduledStart.Before(startDate) {
|
||||
// If a task is longer than last possible date, we ignore it
|
||||
scheduledStart = myCron.Next(scheduledStart)
|
||||
counter++
|
||||
continue
|
||||
}
|
||||
|
||||
if counter < len(NextSchedules.NextExecutions) {
|
||||
NextSchedules.NextExecutions[counter] = scheduledStart.String()
|
||||
}
|
||||
|
||||
scheduledStart = myCron.Next(scheduledStart)
|
||||
counter++
|
||||
}
|
||||
|
||||
NextSchedules.Total = counter
|
||||
|
||||
if NextSchedules.Total == 0 {
|
||||
return nil, errors.New("Current Task configuration will have 0 executions")
|
||||
}
|
||||
}
|
||||
|
||||
_, err = services.MngoCollWorkspace.UpdateOne(services.MngoCtx,
|
||||
primitive.M{"_id": username},
|
||||
primitive.M{"$set": primitive.M{
|
||||
WorkflowDB + "." +
|
||||
workflowName + "." +
|
||||
SchedulesDB: &sch}},
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
return nil, errors.New("Internal error when updating in DB: " + err.Error())
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func GetMxGraph(username, workflowName string) (xmlData *string, err error) {
|
||||
userWorkspace := GetWorkspace(username)
|
||||
|
||||
if userWorkspace == nil {
|
||||
return nil, errors.New("No workspace for user " + username)
|
||||
}
|
||||
|
||||
if _, ok := userWorkspace.Workflows[workflowName]; !ok {
|
||||
return nil, errors.New("Workspace workflow " + workflowName + " doesn't exist for user " + username)
|
||||
}
|
||||
|
||||
var data string = userWorkspace.Workflows[workflowName].MxgraphXML
|
||||
|
||||
if data == "" {
|
||||
xmlData = nil
|
||||
} else {
|
||||
xmlData = &data
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func ParseMxGraph(username, workflowName, xmlData string) (err error, mxissues []error) {
|
||||
|
||||
userWorkspace := GetWorkspace(username)
|
||||
|
||||
if userWorkspace == nil {
|
||||
return errors.New("No workspace for user " + username), nil
|
||||
}
|
||||
|
||||
currentWorkflow, ok := userWorkspace.Workflows[workflowName]
|
||||
if !ok {
|
||||
return errors.New("No workflow " + workflowName), nil
|
||||
}
|
||||
|
||||
if currentWorkflow.Schedules.IsBooked {
|
||||
return errors.New("Can't modify a booked workflow"), nil
|
||||
}
|
||||
|
||||
var xmlModel MxGraphModel
|
||||
|
||||
// logs.Debug(xmlData)
|
||||
err = xml.Unmarshal([]byte(xmlData), &xmlModel)
|
||||
if err != nil {
|
||||
return err, nil
|
||||
}
|
||||
|
||||
targetWorkspaceWorkflow, err, mxissues := userWorkspace.ConsumeMxGraphModel(xmlModel)
|
||||
if err != nil {
|
||||
return err, nil
|
||||
}
|
||||
|
||||
targetWorkspaceWorkflow.MxgraphXML = xmlData
|
||||
targetWorkspaceWorkflow.Schedules = currentWorkflow.Schedules //TODO: Probably we should move schudles outside the workflow
|
||||
|
||||
_, err = services.MngoCollWorkspace.UpdateOne(services.MngoCtx,
|
||||
primitive.M{"_id": username},
|
||||
primitive.M{"$set": primitive.M{
|
||||
WorkflowDB + "." +
|
||||
workflowName: targetWorkspaceWorkflow}},
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
return errors.New("Internal error when updating in DB: " + err.Error()), nil
|
||||
}
|
||||
|
||||
return nil, mxissues
|
||||
}
|
||||
|
||||
// FindInSlice takes a slice and looks for an element in it. If found it will
|
||||
// return it's key, otherwise it will return -1 and a bool of false.
|
||||
func FindInSlice(slice []string, val string) (int, bool) {
|
||||
for i, item := range slice {
|
||||
if item == val {
|
||||
return i, true
|
||||
}
|
||||
}
|
||||
return -1, false
|
||||
}
|
||||
|
||||
// At least one element exist in both slices
|
||||
// Return index1, index2 and if exist
|
||||
func FindSliceInSlice(slice1 []string, slice2 []string) (int, int, bool) {
|
||||
for i1, item1 := range slice1 {
|
||||
for i2, item2 := range slice2 {
|
||||
if item1 == item2 {
|
||||
return i1, i2, true
|
||||
}
|
||||
}
|
||||
}
|
||||
return -1, -1, false
|
||||
}
|
||||
|
||||
func (w Workspace) ConsumeMxGraphModel(xmlmodel MxGraphModel) (ret *Workflow, err error, issues []error) {
|
||||
|
||||
ret = &Workflow{}
|
||||
|
||||
// When we will iterate over the full array of cells, we first will register the resources
|
||||
// and after the linkage between them
|
||||
sort.Slice(xmlmodel.Root.MxCell, func(i, j int) bool {
|
||||
return xmlmodel.Root.MxCell[i].RID != nil
|
||||
})
|
||||
|
||||
for _, cell := range xmlmodel.Root.MxCell {
|
||||
|
||||
switch {
|
||||
case cell.RID != nil:
|
||||
// Case of a Resource
|
||||
rType := w.getRtype(*cell.RID)
|
||||
|
||||
if rType == rtype.INVALID {
|
||||
return nil,
|
||||
errors.New("Refering to a rID that is not in the workflow"),
|
||||
nil
|
||||
}
|
||||
|
||||
// Generate ObjectID for the reference ID
|
||||
rIDObj, err := primitive.ObjectIDFromHex(*cell.RID)
|
||||
if err != nil {
|
||||
return nil,
|
||||
errors.New("Bad ID format: " + *cell.RID),
|
||||
nil
|
||||
}
|
||||
|
||||
resObj := ret.CreateResourceObject(rType)
|
||||
resObj.setReference(rIDObj)
|
||||
|
||||
ret.UpdateObj(resObj, cell.ID)
|
||||
case cell.ID == "0" || cell.ID == "1":
|
||||
// ID 0 and 1 are special cases of mxeditor
|
||||
continue
|
||||
// issues = append(issues, errors.New("MxCell with ID "+cell.ID+" doesn't have a valid link"))
|
||||
|
||||
default:
|
||||
// Not root nor resource. Should be only links
|
||||
sourceObj := ret.GetResource(cell.Source)
|
||||
targetObj := ret.GetResource(cell.Target)
|
||||
|
||||
if sourceObj == nil || targetObj == nil {
|
||||
if sourceObj == nil && targetObj == nil {
|
||||
issues = append(issues, errors.New("Arrow "+cell.ID+" is alone"))
|
||||
} else if sourceObj == nil {
|
||||
issues = append(issues, errors.New("Arrow ("+cell.ID+") to "+*targetObj.getName()+" without parent"))
|
||||
} else {
|
||||
issues = append(issues, errors.New("Arrow "+cell.ID+" from "+*sourceObj.getName()+" without target"))
|
||||
}
|
||||
|
||||
// If is a invalid link, we can't save it in the DB
|
||||
continue
|
||||
}
|
||||
|
||||
if sourceObj.getRtype() == rtype.DATACENTER || targetObj.getRtype() == rtype.DATACENTER {
|
||||
var datacenter, datacenterLinked *string
|
||||
|
||||
if sourceObj.getRtype() == rtype.DATACENTER {
|
||||
datacenter = cell.Source
|
||||
datacenterLinked = cell.Target
|
||||
} else {
|
||||
datacenter = cell.Target
|
||||
datacenterLinked = cell.Source
|
||||
}
|
||||
|
||||
switch ret.GetResource(datacenterLinked).getRtype() {
|
||||
case rtype.COMPUTING:
|
||||
computingObj := ret.GetResource(datacenterLinked).(*ComputingObject)
|
||||
|
||||
// We should always get a ID because we already registered resources and discarded which doesn't correspond to existent models
|
||||
computingObj.DataCenterID = *datacenter
|
||||
ret.UpdateObj(computingObj, *datacenterLinked)
|
||||
}
|
||||
|
||||
} else {
|
||||
targetObj.addLink(INPUT, *cell.Source)
|
||||
ret.UpdateObj(targetObj, *cell.Target) // save back
|
||||
|
||||
// If we have a relationship of:
|
||||
// Source ----> Target
|
||||
//
|
||||
// The Source will be in the INPUTs of the Target.
|
||||
// But we also must make sure that the Target will be in the OUTPUTs of the Source
|
||||
|
||||
sourceObj.addLink(OUTPUT, *cell.Target)
|
||||
ret.UpdateObj(sourceObj, *cell.Source)
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
dcslist := make(map[string]bool)
|
||||
dataslist := make(map[string]bool)
|
||||
// datalist := make(map[string]bool)
|
||||
|
||||
for _, comp := range ret.Computing {
|
||||
if comp.DataCenterID == "" {
|
||||
issues = append(issues, errors.New("Computing "+*comp.getName()+" without a Datacenter"))
|
||||
} else {
|
||||
// If doesn't exist in the list, means is new element to register as used
|
||||
dcslist[comp.DataCenterID] = true
|
||||
|
||||
}
|
||||
|
||||
for _, dcin := range comp.Inputs {
|
||||
switch ret.GetResource(&dcin).getRtype() {
|
||||
case rtype.DATA:
|
||||
dataslist[dcin] = true
|
||||
}
|
||||
}
|
||||
|
||||
for _, dcout := range comp.Outputs {
|
||||
switch ret.GetResource(&dcout).getRtype() {
|
||||
case rtype.DATA:
|
||||
dataslist[dcout] = true
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
for _, va := range ret.Storage {
|
||||
if va.Inputs == nil && va.Outputs == nil {
|
||||
issues = append(issues, errors.New("Storage "+*va.getName()+" without compatible inputs and outputs"))
|
||||
}
|
||||
}
|
||||
|
||||
for dcID, va := range ret.Datacenter {
|
||||
// if rID doesn't exist in the list, it means that it's not used
|
||||
if _, ok := dcslist[dcID]; !ok {
|
||||
issues = append(issues, errors.New("DC "+*va.getName()+" not atached to any Computing"))
|
||||
}
|
||||
}
|
||||
|
||||
for dcID, va := range ret.Data {
|
||||
// if rID doesn't exist in the list, it means that it's not used
|
||||
if _, ok := dataslist[dcID]; !ok {
|
||||
issues = append(issues, errors.New("Data "+*va.getName()+" not atached to any Computing"))
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////
|
||||
// //
|
||||
// Starting from here, we check the type of resources //
|
||||
// //
|
||||
//////////////////////////////////////////////////////////
|
||||
|
||||
// FIXME: Avoid checking twice the same cases (cycles). Ex:
|
||||
//
|
||||
// Comp1 ----> Comp2
|
||||
//
|
||||
// In this case, we will check Comp1 outputs with Comp2
|
||||
// inputs AND Comp2 inputs with Comp1 outputs, since we are
|
||||
// iterating over all existent Computing models in the Graph
|
||||
|
||||
for _, comp := range ret.Computing {
|
||||
|
||||
compModel, err2 := comp.getModel()
|
||||
if err = err2; err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
currentCompModel := compModel.(ComputingModel)
|
||||
|
||||
// Come computings may not allow inputs or outputs
|
||||
if len(currentCompModel.Dinputs) == 0 && len(comp.Inputs) > 0 {
|
||||
issues = append(issues, errors.New("Computing "+compModel.getName()+" must not have any input"))
|
||||
continue
|
||||
}
|
||||
|
||||
if len(currentCompModel.Doutputs) == 0 && len(comp.Outputs) > 0 {
|
||||
issues = append(issues, errors.New("Computing "+compModel.getName()+" must not have any output"))
|
||||
continue
|
||||
}
|
||||
|
||||
//TODO: We should allow heterogenous inputs?
|
||||
for _, objIn := range comp.Inputs {
|
||||
resIn := ret.GetResource(&objIn)
|
||||
resInType := resIn.getRtype()
|
||||
switch resInType {
|
||||
case rtype.DATA:
|
||||
|
||||
dataModel, err2 := resIn.getModel()
|
||||
if err = err2; err != nil {
|
||||
return
|
||||
}
|
||||
myDataModel := dataModel.(DataModel)
|
||||
|
||||
if _, ok := FindInSlice(currentCompModel.Dinputs, myDataModel.Dtype); !ok {
|
||||
issues = append(issues, errors.New("Computing "+compModel.getName()+" can't handle inputs of type "+myDataModel.Dtype+" from Data "+dataModel.getName()))
|
||||
}
|
||||
|
||||
case rtype.COMPUTING:
|
||||
inCompModel, err2 := resIn.getModel()
|
||||
if err = err2; err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
myInComputingModel := inCompModel.(ComputingModel)
|
||||
|
||||
if _, _, ok := FindSliceInSlice(myInComputingModel.Doutputs, currentCompModel.Dinputs); !ok {
|
||||
issues = append(issues, errors.New("Computing "+compModel.getName()+" can't handle any input from "+inCompModel.getName()))
|
||||
}
|
||||
case rtype.STORAGE:
|
||||
// Storage can give use anything, so we always accept it's input for now
|
||||
continue
|
||||
|
||||
default:
|
||||
issues = append(issues, errors.New("Computing "+currentCompModel.getName()+" can't have any resource of type "+resInType.String()+" (behaviour not defined)"))
|
||||
}
|
||||
}
|
||||
|
||||
//TODO: We should allow heterogenous outputs?
|
||||
for _, objOut := range comp.Outputs {
|
||||
resOut := ret.GetResource(&objOut)
|
||||
resOutType := resOut.getRtype()
|
||||
switch resOutType {
|
||||
case rtype.COMPUTING:
|
||||
outCompModel, err2 := resOut.getModel()
|
||||
if err = err2; err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
myOutComputingModel := outCompModel.(ComputingModel)
|
||||
|
||||
if _, _, ok := FindSliceInSlice(currentCompModel.Doutputs, myOutComputingModel.Dinputs); !ok {
|
||||
issues = append(issues, errors.New("Computing "+compModel.getName()+" doesn't have output data compatible with "+outCompModel.getName()))
|
||||
}
|
||||
case rtype.STORAGE:
|
||||
// Storage can save anything, so we always accept store it for now
|
||||
continue
|
||||
|
||||
default:
|
||||
issues = append(issues, errors.New("Computing "+currentCompModel.getName()+" can't have any resource of type "+resOutType.String()+" (behaviour not defined)"))
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func sumExecutionReqs(exeqReq ...ExecutionRequirementsModel) (ret ExecutionRequirementsModel) {
|
||||
for _, v := range exeqReq {
|
||||
ret.CPUs += v.CPUs
|
||||
ret.GPUs += v.GPUs
|
||||
ret.RAM += v.RAM
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func CheckAndBookWorkflowSchedule(username, workflowName string, book bool) (myRet []DCstatus, err error) {
|
||||
|
||||
userWorkspace := GetWorkspace(username)
|
||||
|
||||
if userWorkspace == nil {
|
||||
return nil, errors.New("No workspace for user " + username)
|
||||
}
|
||||
|
||||
currentWorkflow, ok := userWorkspace.Workflows[workflowName]
|
||||
if !ok {
|
||||
return nil, errors.New("No workflow " + workflowName + " for user " + username)
|
||||
}
|
||||
|
||||
if currentWorkflow.Schedules.IsBooked {
|
||||
return nil, errors.New("Can't operate DCs for a already booked schedule")
|
||||
}
|
||||
|
||||
// dd := ¤tWorkflow
|
||||
|
||||
// We can have multiple DCobjs pointing to the same DCmodel. We must sum all req of the same DCmodel
|
||||
totalDCs := make(map[primitive.ObjectID]ExecutionRequirementsModel)
|
||||
|
||||
for dcIDobj, dcObj := range currentWorkflow.Datacenter {
|
||||
modelID := dcObj.getReference()
|
||||
|
||||
var totalsModel ExecutionRequirementsModel
|
||||
totalsModel, err = currentWorkflow.GetExecutionRequirements(dcIDobj)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
if _, ok := totalDCs[modelID]; ok {
|
||||
totalDCs[modelID] = sumExecutionReqs(totalDCs[modelID], totalsModel)
|
||||
} else {
|
||||
totalDCs[modelID] = totalsModel
|
||||
}
|
||||
}
|
||||
|
||||
myRet = make([]DCstatus, len(totalDCs))
|
||||
var i int
|
||||
i = -1
|
||||
for modelID, execReq := range totalDCs {
|
||||
i++
|
||||
var dcModel *DatacenterModel
|
||||
dcModel, err = GetOneDatacenter(modelID.Hex())
|
||||
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
myRet[i].DCname = dcModel.Name
|
||||
myRet[i].DCobjID = modelID.Hex()
|
||||
|
||||
// retrieve the host of the DC
|
||||
host := GetHost(dcModel.Hosts)
|
||||
if host == nil {
|
||||
myRet[i].ErrorMessage = "Datacenter " + myRet[i].DCname + " doesn't have a host property"
|
||||
continue
|
||||
}
|
||||
|
||||
cli := services.GetSelfAPI(*host)
|
||||
data, err := cli.ScheduleApi.ScheduleControllerCheckIfScheduleCanBeCreatedInThisDC(context.Background(),
|
||||
currentWorkflow.Schedules.Cron,
|
||||
int32(currentWorkflow.Schedules.Duration),
|
||||
currentWorkflow.Schedules.StartDate.Format(time.RFC3339),
|
||||
currentWorkflow.Schedules.StopDate.Format(time.RFC3339),
|
||||
swagger.ModelsExecutionRequirementsModel{
|
||||
Cpus: int32(execReq.CPUs),
|
||||
Gpus: int32(execReq.GPUs),
|
||||
Ram: int32(execReq.RAM),
|
||||
},
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
myRet[i].ErrorMessage = err.Error()
|
||||
swErr, ok := err.(swagger.GenericSwaggerError)
|
||||
if ok {
|
||||
myRet[i].IsReachable = true
|
||||
myRet[i].ErrorMessage += ": " + string(swErr.Body())
|
||||
}
|
||||
continue
|
||||
}
|
||||
|
||||
myRet[i].IsReachable = true
|
||||
|
||||
if data.StatusCode == 200 {
|
||||
myRet[i].IsAvailable = true
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// If we only check, we should exit here
|
||||
if !book {
|
||||
return
|
||||
}
|
||||
|
||||
for _, v := range myRet {
|
||||
if !v.IsAvailable {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
i = -1
|
||||
allBooked := true
|
||||
for modelID, execReq := range totalDCs {
|
||||
i++
|
||||
// _ = v
|
||||
var dcModel *DatacenterModel
|
||||
dcModel, err = GetOneDatacenter(modelID.Hex())
|
||||
|
||||
if err != nil {
|
||||
myRet[i].ErrorMessage = err.Error()
|
||||
continue
|
||||
}
|
||||
|
||||
cli := services.GetSelfAPI(*GetHost(dcModel.Hosts)) // If we are here, we already check that host exists and is reachable
|
||||
data, resp, err := cli.ScheduleApi.ScheduleControllerCreateSchedule(context.Background(),
|
||||
services.DC_NAME,
|
||||
workflowName,
|
||||
currentWorkflow.Schedules.Cron,
|
||||
int32(currentWorkflow.Schedules.Duration),
|
||||
currentWorkflow.Schedules.StartDate.Format(time.RFC3339),
|
||||
currentWorkflow.Schedules.StopDate.Format(time.RFC3339),
|
||||
swagger.ModelsExecutionRequirementsModel{
|
||||
Cpus: int32(execReq.CPUs),
|
||||
Gpus: int32(execReq.GPUs),
|
||||
Ram: int32(execReq.RAM),
|
||||
},
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
allBooked = false
|
||||
myRet[i].ErrorMessage = err.Error()
|
||||
swErr, ok := err.(swagger.GenericSwaggerError)
|
||||
if ok {
|
||||
myRet[i].IsReachable = true
|
||||
myRet[i].ErrorMessage += ": " + string(swErr.Body())
|
||||
}
|
||||
continue
|
||||
}
|
||||
|
||||
if resp.StatusCode == 200 {
|
||||
//FIXME: Maybe some better way of casting?
|
||||
|
||||
var nextExec [5]string
|
||||
for counter := 0; counter < 5; counter++ {
|
||||
nextExec[counter] = data.NextExecutions[counter]
|
||||
}
|
||||
|
||||
myRet[i].Booked = &ScheduleInfo{
|
||||
Total: int(data.Total),
|
||||
NextExecutions: nextExec,
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// If some DC fail, we must not mark the workflow as booked
|
||||
if !allBooked {
|
||||
return
|
||||
}
|
||||
|
||||
currentWorkflow.Schedules.IsBooked = true
|
||||
_, err = services.MngoCollWorkspace.UpdateOne(services.MngoCtx,
|
||||
primitive.M{"_id": username},
|
||||
primitive.M{"$set": primitive.M{
|
||||
WorkflowDB + "." +
|
||||
workflowName + "." +
|
||||
SchedulesDB: ¤tWorkflow.Schedules}},
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
logs.Critical("Internal error when updating in DB: " + err.Error())
|
||||
}
|
||||
|
||||
return myRet, nil
|
||||
}
|
418
models/workspace.go
Normal file
@ -0,0 +1,418 @@
|
||||
package models
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
|
||||
"cloud.o-forge.io/core/oc-catalog/models/rtype"
|
||||
"cloud.o-forge.io/core/oc-catalog/services"
|
||||
"github.com/beego/beego/v2/core/logs"
|
||||
"go.mongodb.org/mongo-driver/bson/primitive"
|
||||
"go.mongodb.org/mongo-driver/mongo"
|
||||
)
|
||||
|
||||
// Assure consistency by using a const which refers to the MongoDB entry name
|
||||
// Workspace.Projects
|
||||
const WorkflowDB = "workflows"
|
||||
|
||||
type Workspace struct {
|
||||
UserID string `bson:"_id" json:"user_id"`
|
||||
|
||||
Workflows map[string]Workflow //WorkflowDB
|
||||
|
||||
// ID: rtype
|
||||
Data []string `json:"data"`
|
||||
Computing []string `json:"computing"`
|
||||
Datacenter []string `json:"datacenter"`
|
||||
Storage []string `json:"storage"`
|
||||
}
|
||||
|
||||
type ResourceModel interface {
|
||||
getRtype() rtype.Rtype
|
||||
getName() string
|
||||
}
|
||||
|
||||
func (w Workspace) getRtype(rID string) (resModel rtype.Rtype) {
|
||||
|
||||
for _, compVal := range w.Computing {
|
||||
if compVal == rID {
|
||||
return rtype.COMPUTING
|
||||
}
|
||||
}
|
||||
|
||||
for _, datVal := range w.Data {
|
||||
if datVal == rID {
|
||||
return rtype.DATA
|
||||
}
|
||||
}
|
||||
|
||||
for _, storVal := range w.Storage {
|
||||
if storVal == rID {
|
||||
return rtype.STORAGE
|
||||
}
|
||||
}
|
||||
|
||||
for _, datcentVal := range w.Datacenter {
|
||||
if datcentVal == rID {
|
||||
return rtype.DATACENTER
|
||||
}
|
||||
}
|
||||
|
||||
return rtype.INVALID
|
||||
}
|
||||
|
||||
func (w *Workspace) GetResources() map[rtype.Rtype][]string {
|
||||
return map[rtype.Rtype][]string{
|
||||
rtype.DATA: w.Data,
|
||||
rtype.COMPUTING: w.Computing,
|
||||
rtype.STORAGE: w.Storage,
|
||||
rtype.DATACENTER: w.Datacenter,
|
||||
}
|
||||
}
|
||||
|
||||
func (w *Workspace) GetWorkflow(workflowName string) *Workflow {
|
||||
|
||||
var proj Workflow
|
||||
|
||||
proj = w.Workflows[workflowName]
|
||||
return &proj
|
||||
}
|
||||
|
||||
func (w *Workspace) GetWorkflows() []string {
|
||||
|
||||
if len(w.Workflows) == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
workflowNames := make([]string, len(w.Workflows))
|
||||
|
||||
i := 0
|
||||
for k := range w.Workflows {
|
||||
workflowNames[i] = k
|
||||
i++
|
||||
}
|
||||
|
||||
return workflowNames
|
||||
}
|
||||
|
||||
type WorkspaceModel struct {
|
||||
UserID string `bson:"_id" json:"user_id"`
|
||||
|
||||
Data []DataModel `json:"data"`
|
||||
Computing []ComputingModel `json:"computing"`
|
||||
Datacenter []DatacenterModel `json:"datacenter"`
|
||||
Storage []StorageModel `json:"storage"`
|
||||
}
|
||||
|
||||
func ListFullWorkspace(userID string) (*WorkspaceModel, error) {
|
||||
ws := GetWorkspace(userID)
|
||||
|
||||
if ws == nil {
|
||||
return nil, errors.New("Internal error")
|
||||
}
|
||||
|
||||
fws := &WorkspaceModel{
|
||||
UserID: ws.UserID,
|
||||
|
||||
Data: []DataModel{},
|
||||
Computing: []ComputingModel{},
|
||||
Datacenter: []DatacenterModel{},
|
||||
Storage: []StorageModel{},
|
||||
}
|
||||
|
||||
pipeline := []primitive.M{
|
||||
{"$match": primitive.M{"_id": userID}},
|
||||
{"$lookup": primitive.M{
|
||||
"localField": "data",
|
||||
"from": services.MngoNamesCollection.DATA,
|
||||
"foreignField": "_id",
|
||||
"as": "data",
|
||||
}},
|
||||
{"$lookup": primitive.M{
|
||||
"localField": "computing",
|
||||
"from": services.MngoNamesCollection.COMPUTING,
|
||||
"foreignField": "_id",
|
||||
"as": "computing",
|
||||
}},
|
||||
{"$lookup": primitive.M{
|
||||
"localField": "datacenter",
|
||||
"from": services.MngoNamesCollection.DATACENTER,
|
||||
"foreignField": "_id",
|
||||
"as": "datacenter",
|
||||
}},
|
||||
{"$lookup": primitive.M{
|
||||
"localField": "storage",
|
||||
"from": services.MngoNamesCollection.STORAGE,
|
||||
"foreignField": "_id",
|
||||
"as": "storage",
|
||||
}},
|
||||
}
|
||||
|
||||
ret, err := services.MngoCollWorkspace.Aggregate(services.MngoCtx, pipeline)
|
||||
|
||||
if err != nil {
|
||||
message := "Couldn't obtain subobjects"
|
||||
logs.Debug(message + "; " + err.Error())
|
||||
return nil, errors.New(message)
|
||||
}
|
||||
|
||||
if ret.RemainingBatchLength() == 1 {
|
||||
ret.Next(context.Background())
|
||||
ret.Decode(&fws)
|
||||
}
|
||||
|
||||
return fws, nil
|
||||
}
|
||||
|
||||
// Contains tells whether a contains x.
|
||||
func contains(a []string, x string) bool {
|
||||
for _, n := range a {
|
||||
if x == n {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func RemoveResource(userID, rID, rType string) error {
|
||||
|
||||
rIDObj, err := primitive.ObjectIDFromHex(rID)
|
||||
|
||||
if err != nil {
|
||||
message := "ID " + rID + " is not valid"
|
||||
logs.Debug(message + "; " + err.Error())
|
||||
return errors.New(message)
|
||||
}
|
||||
|
||||
result, err := services.MngoCollWorkspace.UpdateOne(services.MngoCtx,
|
||||
primitive.M{"_id": userID},
|
||||
primitive.M{"$pull": primitive.M{rType: rIDObj}},
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
message := err.Error()
|
||||
logs.Debug(message)
|
||||
return errors.New(message)
|
||||
}
|
||||
|
||||
if result.MatchedCount == 0 {
|
||||
message := "No user " + userID + " in workspace"
|
||||
logs.Debug(message)
|
||||
return errors.New(message)
|
||||
}
|
||||
|
||||
if result.ModifiedCount == 0 {
|
||||
message := "No rID " + rID + " in rtype " + rType
|
||||
logs.Debug(message)
|
||||
return errors.New(message)
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
}
|
||||
|
||||
func (w *Workspace) updateDB() (err error) {
|
||||
|
||||
_, err = services.MngoCollWorkspace.ReplaceOne(services.MngoCtx,
|
||||
primitive.M{"_id": w.UserID},
|
||||
w,
|
||||
)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func (w *Workspace) NewResource(rID string, rType string) (err error) {
|
||||
|
||||
var targetArray *[]string
|
||||
|
||||
switch rType {
|
||||
case rtype.DATA.String():
|
||||
targetArray = &w.Data
|
||||
case rtype.COMPUTING.String():
|
||||
targetArray = &w.Computing
|
||||
case rtype.STORAGE.String():
|
||||
targetArray = &w.Storage
|
||||
case rtype.DATACENTER.String():
|
||||
targetArray = &w.Datacenter
|
||||
default:
|
||||
return errors.New("Rtype " + rType + " is not valid")
|
||||
}
|
||||
|
||||
for _, models := range *targetArray {
|
||||
if models == rID {
|
||||
return errors.New("Resource " + rID + " of type " + rType +
|
||||
" is already registered for user " + w.UserID)
|
||||
}
|
||||
}
|
||||
|
||||
*targetArray = append(*targetArray, rID)
|
||||
|
||||
w.updateDB()
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func AddResource(userID, rID, rType string) (err error) {
|
||||
|
||||
var rIDObj *primitive.ObjectID
|
||||
|
||||
if rIDObj, err = IsValidResource(rID, rType); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
//TODO: Maybe operate directly in the DB instead retriving the full object?
|
||||
userWorkspace := GetWorkspace(userID)
|
||||
|
||||
// Exist in the DB
|
||||
if userWorkspace != nil {
|
||||
var targetArray []string
|
||||
|
||||
switch rType {
|
||||
case rtype.DATA.String():
|
||||
targetArray = userWorkspace.Data
|
||||
case rtype.COMPUTING.String():
|
||||
targetArray = userWorkspace.Computing
|
||||
case rtype.STORAGE.String():
|
||||
targetArray = userWorkspace.Storage
|
||||
case rtype.DATACENTER.String():
|
||||
targetArray = userWorkspace.Datacenter
|
||||
default:
|
||||
message := "Rtype " + rType + " is not valid"
|
||||
logs.Debug(message)
|
||||
return errors.New(message)
|
||||
}
|
||||
|
||||
if ok := contains(targetArray, rID); ok {
|
||||
// Element already registered
|
||||
message := "Resource " + rID + " of type " + rType +
|
||||
" is already registered for user " + userID
|
||||
logs.Debug(message)
|
||||
return errors.New(message)
|
||||
}
|
||||
|
||||
// New element
|
||||
// userWorkspace.ResourceList[rID] = rType
|
||||
_, err := services.MngoCollWorkspace.UpdateOne(services.MngoCtx,
|
||||
primitive.M{"_id": userID},
|
||||
primitive.M{"$push": primitive.M{rType: rIDObj}},
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
message := "Internal error when updating in DB"
|
||||
logs.Debug(message + "; " + err.Error())
|
||||
return errors.New(message)
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
}
|
||||
return errors.New("Internal error")
|
||||
}
|
||||
|
||||
func rTypeToCollection(rType string) (*mongo.Collection, error) {
|
||||
switch rType {
|
||||
case rtype.DATA.String():
|
||||
return services.MngoCollData, nil
|
||||
case rtype.COMPUTING.String():
|
||||
return services.MngoCollComputing, nil
|
||||
case rtype.DATACENTER.String():
|
||||
return services.MngoCollDatacenter, nil
|
||||
case rtype.STORAGE.String():
|
||||
return services.MngoCollStorage, nil
|
||||
}
|
||||
|
||||
message := rType + " is not a valid resource type"
|
||||
logs.Debug(message)
|
||||
|
||||
return nil, errors.New(message)
|
||||
}
|
||||
|
||||
func IsValidResource(rID, rType string) (*primitive.ObjectID, error) {
|
||||
|
||||
targetColl, err := rTypeToCollection(rType)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
rIDObj, err := primitive.ObjectIDFromHex(rID)
|
||||
|
||||
if err != nil {
|
||||
message := "ID " + rID + " is not valid"
|
||||
logs.Debug(message + "; " + err.Error())
|
||||
return nil, errors.New(message)
|
||||
}
|
||||
|
||||
result := targetColl.FindOne(services.MngoCtx, primitive.M{"_id": rIDObj})
|
||||
|
||||
if result.Err() != nil {
|
||||
message := "ID " + rID + " doesn't exist for resource type " + rType
|
||||
logs.Debug(message + "; " + result.Err().Error())
|
||||
return nil, errors.New(message)
|
||||
}
|
||||
|
||||
return &rIDObj, nil
|
||||
}
|
||||
|
||||
func GetAllWorkspaces() <-chan *Workspace {
|
||||
ch := make(chan *Workspace)
|
||||
go func() {
|
||||
cursor, err := services.MngoCollWorkspace.Find(services.MngoCtx, primitive.M{})
|
||||
if err != nil {
|
||||
logs.Error(cursor.Err())
|
||||
close(ch)
|
||||
}
|
||||
|
||||
for cursor.Next(services.MngoCtx) {
|
||||
var item Workspace
|
||||
if err = cursor.Decode(&item); err != nil {
|
||||
logs.Error(err)
|
||||
close(ch)
|
||||
}
|
||||
ch <- &item
|
||||
}
|
||||
close(ch) // Remember to close or the loop never ends!
|
||||
}()
|
||||
return ch
|
||||
}
|
||||
|
||||
func (w *Workspace) GetAllWorkspacesProjects() <-chan *Workflow {
|
||||
ch := make(chan *Workflow)
|
||||
go func() {
|
||||
for _, wproj := range w.Workflows {
|
||||
ch <- &wproj
|
||||
}
|
||||
close(ch)
|
||||
}()
|
||||
return ch
|
||||
}
|
||||
|
||||
func GetWorkspace(userID string) (retObj *Workspace) {
|
||||
|
||||
if err := services.MngoCollWorkspace.FindOne(services.MngoCtx, primitive.M{"_id": userID}).Decode(&retObj); err != nil {
|
||||
logs.Error(err.Error())
|
||||
return nil
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func NewWorkspace(userID string) (*Workspace, error) {
|
||||
|
||||
newWsp := &Workspace{
|
||||
UserID: userID,
|
||||
Data: []string{},
|
||||
Computing: []string{},
|
||||
Datacenter: []string{},
|
||||
Storage: []string{},
|
||||
}
|
||||
|
||||
_, err := services.MngoCollWorkspace.InsertOne(services.MngoCtx, newWsp)
|
||||
if err != nil {
|
||||
logs.Warning(err.Error())
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return newWsp, nil
|
||||
|
||||
}
|
118
routers/auth.go
Normal file
@ -0,0 +1,118 @@
|
||||
package routers
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"strings"
|
||||
|
||||
"cloud.o-forge.io/core/oc-catalog/controllers"
|
||||
"cloud.o-forge.io/core/oc-catalog/models"
|
||||
"github.com/beego/beego/v2/core/logs"
|
||||
beego "github.com/beego/beego/v2/server/web"
|
||||
"github.com/beego/beego/v2/server/web/context"
|
||||
"github.com/beego/beego/v2/server/web/swagger"
|
||||
)
|
||||
|
||||
func setStatus403(ctx *context.Context) {
|
||||
ctx.Output.SetStatus(403)
|
||||
ctx.Output.Body([]byte(""))
|
||||
}
|
||||
|
||||
// TODO: Force swagger regeneration during startup to ensure consistency
|
||||
func initAuthMiddleware() {
|
||||
var FilterAuthTags = func(ctx *context.Context) {
|
||||
patternMatch := ctx.Input.GetData("RouterPattern").(string)
|
||||
|
||||
patternMatchPath := strings.Replace(patternMatch, rootapi.BasePath, "", 1)
|
||||
|
||||
//Discovery path
|
||||
if patternMatch == "/" {
|
||||
return
|
||||
}
|
||||
|
||||
// First letter Uppercase and the rest lowercase
|
||||
reqMethod := strings.ToUpper(string(ctx.Request.Method[0])) + strings.ToLower(string(ctx.Request.Method[1:]))
|
||||
|
||||
val := reflect.ValueOf(rootapi.Paths[patternMatchPath]).
|
||||
Elem().FieldByName(reqMethod).
|
||||
Elem().Interface().(swagger.Operation)
|
||||
|
||||
// Make sure never omit a security declaration
|
||||
canaryVar := false
|
||||
|
||||
for _, securityItem := range val.Security {
|
||||
canaryVar = true
|
||||
|
||||
for securityItemName := range securityItem {
|
||||
switch t := rootapi.SecurityDefinitions[securityItemName]; t.Type {
|
||||
case "basic":
|
||||
user, pass, containBasic := ctx.Request.BasicAuth()
|
||||
if containBasic {
|
||||
if models.Login(user, pass) {
|
||||
//TODO: Decide behaviour with multiple security
|
||||
return
|
||||
}
|
||||
|
||||
ctx.Output.SetStatus(403)
|
||||
ctx.Output.Body([]byte("")) //We must create some kind of output to force beego abort the request
|
||||
return
|
||||
|
||||
}
|
||||
|
||||
ctx.Output.Header("WWW-Authenticate", `Basic realm="Restricted"`)
|
||||
ctx.Output.SetStatus(401)
|
||||
ctx.Output.Body([]byte("")) //We must create some kind of output to force beego abort the request
|
||||
return
|
||||
|
||||
case "apiKey":
|
||||
var jwtTokenString string
|
||||
|
||||
switch t.In {
|
||||
case "header":
|
||||
jwtTokenString = ctx.Request.Header.Get(t.Name)
|
||||
case "query":
|
||||
jwtTokenString = ctx.Request.URL.Query().Get(t.Name)
|
||||
default:
|
||||
logs.Warn("BUG: API auth with token of type " + t.In + " not implemented.")
|
||||
setStatus403(ctx)
|
||||
return
|
||||
}
|
||||
|
||||
if jwtTokenString != "" {
|
||||
// We have a token
|
||||
|
||||
_, err := controllers.IsValidToken(jwtTokenString)
|
||||
if err != nil {
|
||||
//Bad token
|
||||
ctx.Output.SetStatus(401)
|
||||
ctx.Output.Body([]byte(err.Error()))
|
||||
return
|
||||
}
|
||||
|
||||
ctx.Input.SetData("jwtAPIToken", jwtTokenString)
|
||||
return //Go to Controller
|
||||
}
|
||||
|
||||
// No token at all
|
||||
logs.Debug("No access token provided")
|
||||
setStatus403(ctx)
|
||||
return
|
||||
default:
|
||||
ctx.Output.SetStatus(501)
|
||||
ctx.Output.Body([]byte("Authentication with " + t.Type + " not implemented"))
|
||||
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if canaryVar {
|
||||
// If we are here, that means some Security declaration exist and was skipped.
|
||||
// Must avoid giving access, but should inform about it
|
||||
|
||||
logs.Critical("Probably a BUG related to authentication process")
|
||||
setStatus403(ctx)
|
||||
}
|
||||
}
|
||||
|
||||
beego.InsertFilter("/*", beego.BeforeExec, FilterAuthTags)
|
||||
}
|
129
routers/router.go
Normal file
@ -0,0 +1,129 @@
|
||||
// @APIVersion 1.0.0
|
||||
// @Title oc-catalog API
|
||||
// @Description Backend of the oc-search project
|
||||
// @Contact opencloud@irt-saintexupery.com
|
||||
//// @SecurityDefinition jwtAPIToken apiKey Authorization header "API authentication with JWT tokens"
|
||||
|
||||
package routers
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"cloud.o-forge.io/core/oc-catalog/controllers"
|
||||
"cloud.o-forge.io/core/oc-catalog/services"
|
||||
|
||||
"github.com/beego/beego/v2/core/logs"
|
||||
|
||||
bee "github.com/beego/bee/v2/generate/swaggergen"
|
||||
|
||||
"github.com/beego/beego/v2/adapter/swagger"
|
||||
beego "github.com/beego/beego/v2/server/web"
|
||||
"github.com/beego/beego/v2/server/web/context"
|
||||
)
|
||||
|
||||
var rootapi swagger.Swagger
|
||||
|
||||
func Init() {
|
||||
// Remove old swagger comments
|
||||
err := os.Remove("routers/commentsRouter_controllers.go")
|
||||
if err != nil {
|
||||
logs.Warning("Couldn't remove comments file: " + err.Error())
|
||||
}
|
||||
|
||||
ns := beego.NewNamespace("/v1",
|
||||
beego.NSNamespace("/user",
|
||||
beego.NSInclude(
|
||||
&controllers.UserController{},
|
||||
),
|
||||
),
|
||||
beego.NSNamespace("/data",
|
||||
beego.NSInclude(
|
||||
&controllers.DataController{},
|
||||
),
|
||||
),
|
||||
beego.NSNamespace("/computing",
|
||||
beego.NSInclude(
|
||||
&controllers.ComputingController{},
|
||||
),
|
||||
),
|
||||
beego.NSNamespace("/datacenter",
|
||||
beego.NSInclude(
|
||||
&controllers.DatacenterController{},
|
||||
),
|
||||
),
|
||||
beego.NSNamespace("/storage",
|
||||
beego.NSInclude(
|
||||
&controllers.StorageController{},
|
||||
),
|
||||
),
|
||||
beego.NSNamespace("/search",
|
||||
beego.NSInclude(
|
||||
&controllers.SearchController{},
|
||||
),
|
||||
),
|
||||
beego.NSNamespace("/workspace",
|
||||
beego.NSInclude(
|
||||
&controllers.WorkspaceController{},
|
||||
),
|
||||
),
|
||||
beego.NSNamespace("/workflow",
|
||||
beego.NSInclude(
|
||||
&controllers.WorkflowController{},
|
||||
),
|
||||
),
|
||||
beego.NSNamespace("/schedule",
|
||||
beego.NSInclude(
|
||||
&controllers.ScheduleController{},
|
||||
),
|
||||
),
|
||||
)
|
||||
|
||||
beego.AddNamespace(ns)
|
||||
|
||||
beego.Get("/", func(ctx *context.Context) {
|
||||
ctx.Output.Body([]byte(services.DC_NAME))
|
||||
})
|
||||
|
||||
// Force regenerate swagger before consuming the data
|
||||
bee.GenerateDocs(".")
|
||||
|
||||
// Open our jsonFile
|
||||
swaggerSchemaPath := "swagger/swagger.json"
|
||||
swaggerFile, err := os.Open(swaggerSchemaPath)
|
||||
// if we os.Open returns an error then handle it
|
||||
if err != nil {
|
||||
logs.Critical("Error opening %v: %v", swaggerSchemaPath, err)
|
||||
panic(err)
|
||||
}
|
||||
|
||||
// defer the closing of our jsonFile so that we can parse it later on
|
||||
defer swaggerFile.Close()
|
||||
|
||||
byteValue, err := ioutil.ReadAll(swaggerFile)
|
||||
if err != nil {
|
||||
logs.Critical("Error reading %v: %v", swaggerSchemaPath, err)
|
||||
panic(err)
|
||||
}
|
||||
|
||||
json.Unmarshal(byteValue, &rootapi)
|
||||
|
||||
// To simplify match of Paths, we must adapt swagger path representation to beego router
|
||||
// For example: /path/{myID} will be /path/:myID
|
||||
for k, v := range rootapi.Paths {
|
||||
if strings.ContainsAny(k, "{}") {
|
||||
newKey := strings.Replace(k, "{", ":", -1)
|
||||
newKey = strings.Replace(newKey, "}", "", -1)
|
||||
|
||||
rootapi.Paths[newKey] = v
|
||||
delete(rootapi.Paths, k)
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// Init some extra stuff
|
||||
initAuthMiddleware()
|
||||
initUglyFixes()
|
||||
}
|
42
routers/uglyfix.go
Normal file
@ -0,0 +1,42 @@
|
||||
package routers
|
||||
|
||||
import (
|
||||
"strings"
|
||||
|
||||
"github.com/beego/beego/v2/server/web/filter/cors"
|
||||
|
||||
"github.com/beego/beego/v2/core/logs"
|
||||
beego "github.com/beego/beego/v2/server/web"
|
||||
"github.com/beego/beego/v2/server/web/context"
|
||||
)
|
||||
|
||||
//TODO: This file should never exist. Solve the bugs and avoid using this
|
||||
// [ id id2 id3 ]
|
||||
// id,id2,id3
|
||||
// Some Beego bugs? that we want to fix
|
||||
func initUglyFixes() {
|
||||
var FixParameterArrays = func(ctx *context.Context) {
|
||||
|
||||
for k, v := range ctx.Input.Params() {
|
||||
if strings.HasPrefix(v, "[") && strings.HasSuffix(v, "]") {
|
||||
logs.Warn("BUGFIX: Fixing array interpretation. Should not be done like this")
|
||||
newParam := strings.NewReplacer("[", "", " ", ",", "]", "").Replace(v)
|
||||
ctx.Input.SetParam(k, newParam)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
beego.InsertFilter("/*/multi/:IDs", beego.BeforeExec, FixParameterArrays, beego.WithReturnOnOutput(true))
|
||||
|
||||
// FIXME: We should define CORS properly (maybe more permissive in dev mode?)
|
||||
beego.InsertFilter("*", beego.BeforeStatic, cors.Allow(&cors.Options{
|
||||
AllowAllOrigins: true,
|
||||
AllowMethods: []string{
|
||||
"HEAD",
|
||||
"GET",
|
||||
"POST",
|
||||
"PUT",
|
||||
"DELETE",
|
||||
},
|
||||
}))
|
||||
}
|
322
scripts/demo.json
Normal file
@ -0,0 +1,322 @@
|
||||
[
|
||||
{
|
||||
"api": "/v1/data/",
|
||||
"content": [
|
||||
{
|
||||
"name": "Mundi Sentienl 3 SRAL Images",
|
||||
"short_description": "Mundi Sentinels 3 SAR Altiemter image",
|
||||
"logo": "./local_imgs/Mundi Sentienl 3 SRAL Images.png",
|
||||
"description": "A very long description of what this data is",
|
||||
"example": "string",
|
||||
"ftype": "string",
|
||||
"location": "string",
|
||||
"type": "data"
|
||||
},
|
||||
{
|
||||
"name": "Mundi Sentienl 3 OLCI Images",
|
||||
"short_description": "Mundi Sentinels 3 Ocean and land color Altiemter image",
|
||||
"logo": "./local_imgs/Mundi Sentienl 3 OLCI Images.png",
|
||||
"description": "A very long description of what this data is",
|
||||
"example": "string",
|
||||
"ftype": "string",
|
||||
"location": "string",
|
||||
"type": "data"
|
||||
},
|
||||
{
|
||||
"name": "Meteo-France forecasts",
|
||||
"short_description": "Meteo France weather forecasts",
|
||||
"logo": "./local_imgs/Meteo-France forecasts.png",
|
||||
"description": "A very long description of what this data is",
|
||||
"example": "string",
|
||||
"ftype": "string",
|
||||
"location": "string",
|
||||
"type": "data"
|
||||
},
|
||||
{
|
||||
"name": "Meteo-France wind archive",
|
||||
"short_description": "Meteo France wind archive",
|
||||
"logo": "./local_imgs/Meteo-France wind archive.png",
|
||||
"description": "A very long description of what this data is",
|
||||
"example": "string",
|
||||
"ftype": "string",
|
||||
"location": "string",
|
||||
"type": "data"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"api": "/v1/computing/",
|
||||
"content": [
|
||||
{
|
||||
"name": "SAR High points",
|
||||
"short_description": "SAR Altimeter High points extraction Software",
|
||||
"logo": "./local_imgs/SAR High points.png",
|
||||
"description": "A very long description of what this data is",
|
||||
"type": "computing",
|
||||
"owner": "IRT",
|
||||
"price": 300,
|
||||
"license": "GPLv2",
|
||||
"execution_requirements": {
|
||||
"cpus": 1,
|
||||
"ram": 1024,
|
||||
"storage": 300,
|
||||
"gpus": 1,
|
||||
"disk_io": "30 MB/s",
|
||||
"parallel": true,
|
||||
"scaling_model": 2
|
||||
},
|
||||
"inputs": [],
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"name": "Flammable vegetation slicer",
|
||||
"short_description": "Analyze land cover and define optimum vegetation slices to prevent fire propagation",
|
||||
"logo": "./local_imgs/Flammable vegetation slicer.png",
|
||||
"description": "A very long description of what this data is",
|
||||
"type": "computing",
|
||||
"execution_requirements": {
|
||||
"cpus": 3,
|
||||
"ram": 4096,
|
||||
"storage": 30000,
|
||||
"disk_io": "30 MB/s",
|
||||
"parallel": true,
|
||||
"scaling_model": 2
|
||||
},
|
||||
"owner": "Gob.fr",
|
||||
"price": 330,
|
||||
"license": "Copyright",
|
||||
"inputs": [],
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"name": "Long term fire risk mitigation planner",
|
||||
"short_description": "Long term fire risk mitigation planner : provides list of actions to be performed to mitigate fire propagation",
|
||||
"logo": "./local_imgs/Long term fire risk mitigation planner.png",
|
||||
"description": "A very long description of what this data is",
|
||||
"type": "computing",
|
||||
"execution_requirements": {
|
||||
"cpus": 2,
|
||||
"ram": 1024,
|
||||
"disk_io": "30 MB/s",
|
||||
"parallel": false,
|
||||
"scaling_model": 2
|
||||
},
|
||||
"owner": "Gob.fr",
|
||||
"price": 30,
|
||||
"license": "GPLv3",
|
||||
"inputs": [],
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"name": "Fire propagation simulator",
|
||||
"short_description": "Fire propagation simulator",
|
||||
"logo": "./local_imgs/Fire propagation simulator.png",
|
||||
"description": "A very long description of what this data is",
|
||||
"type": "computing",
|
||||
"execution_requirements": {
|
||||
"cpus": 4,
|
||||
"ram": 8192,
|
||||
"storage": 30000,
|
||||
"gpus": 1,
|
||||
"disk_io": "30 MB/s",
|
||||
"parallel": true,
|
||||
"scaling_model": 2
|
||||
},
|
||||
"owner": "Gob.fr",
|
||||
"price": 39,
|
||||
"license": "GPLv3",
|
||||
"inputs": [],
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"name": "Environment builder",
|
||||
"short_description": "build simulated environment from real environmental data and fire mitigation rules ",
|
||||
"logo": "./local_imgs/Environment builder.png",
|
||||
"description": "A very long description of what this data is",
|
||||
"type": "computing",
|
||||
"execution_requirements": {
|
||||
"cpus": 1,
|
||||
"ram": 2049,
|
||||
"storage": 500,
|
||||
"gpus": 4,
|
||||
"disk_io": "30 MB/s",
|
||||
"parallel": true,
|
||||
"scaling_model": 2
|
||||
},
|
||||
"owner": "Gob.fr",
|
||||
"price": 39,
|
||||
"license": "GPLv3",
|
||||
"inputs": [],
|
||||
"outputs": []
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"api": "/v1/storage/",
|
||||
"content": [
|
||||
{
|
||||
"name": "IRT risk database",
|
||||
"short_description": "IRT Database instance",
|
||||
"logo": "./local_imgs/IRT risk database.png",
|
||||
"description": "A very long description of what this data is",
|
||||
"type": "database",
|
||||
"DCacronym": "DC_myDC",
|
||||
"size": 4000,
|
||||
"encryption": false,
|
||||
"redundancy": "RAID5",
|
||||
"throughput": "r:200,w:150",
|
||||
"bookingPrice": 60,
|
||||
"inputs": [],
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"name": "IRT local file storage",
|
||||
"short_description": "S3 compliant IRT file storage",
|
||||
"logo": "./local_imgs/IRT local file storage.png",
|
||||
"description": "A very long description of what this data is",
|
||||
"type": "storage",
|
||||
"DCacronym": "DC_myDC",
|
||||
"size": 40000,
|
||||
"encryption": false,
|
||||
"redundancy": "RAID5S",
|
||||
"throughput": "r:300,w:350",
|
||||
"bookingPrice": 90,
|
||||
"inputs": [],
|
||||
"outputs": []
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"api": "/v1/datacenter/",
|
||||
"content": [
|
||||
{
|
||||
"name": "Mundi datacenter",
|
||||
"acronym": "DC_myDC",
|
||||
"hosts": [
|
||||
"localhost:49618",
|
||||
"oc-catalog:49618"
|
||||
],
|
||||
"short_description": "Mundi Opencloud Instance",
|
||||
"logo": "./local_imgs/Mundi datacenter.png",
|
||||
"description": "A very long description of what this data is",
|
||||
"type": "datacenter",
|
||||
"bookingPrice": 650,
|
||||
"owner": "IRT",
|
||||
"cpu": {
|
||||
"cores": 8,
|
||||
"architecture": "x86",
|
||||
"shared": false
|
||||
},
|
||||
"ram": {
|
||||
"size": 16384,
|
||||
"ecc": false
|
||||
},
|
||||
"gpu": [
|
||||
{
|
||||
"cuda_cores": 10496,
|
||||
"model": "RTX 3090 FE",
|
||||
"memory": 24000,
|
||||
"tensor_cores": 328
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "CNES datacenter",
|
||||
"acronym": "DC_superDC1",
|
||||
"hosts": [
|
||||
"localhost:49619",
|
||||
"dc1:49618"
|
||||
],
|
||||
"short_description": "CNES Opencloud Instance",
|
||||
"logo": "./local_imgs/CNES datacenter.png",
|
||||
"description": "A very long description of what this data is",
|
||||
"type": "datacenter",
|
||||
"bookingPrice": 650,
|
||||
"owner": "IRT",
|
||||
"cpu": {
|
||||
"cores": 32,
|
||||
"architecture": "x86",
|
||||
"shared": false
|
||||
},
|
||||
"ram": {
|
||||
"size": 100000,
|
||||
"ecc": false
|
||||
},
|
||||
"gpu": []
|
||||
},
|
||||
{
|
||||
"name": "Meteo France datacenter",
|
||||
"acronym": "DC_superDC2",
|
||||
"hosts": [
|
||||
"localhost:49620",
|
||||
"dc2:49618"
|
||||
],
|
||||
"short_description": "Meteo France Opencloud Instance",
|
||||
"logo": "./local_imgs/Meteo France datacenter.png",
|
||||
"description": "A very long description of what this data is",
|
||||
"type": "datacenter",
|
||||
"bookingPrice": 650,
|
||||
"owner": "Meteo France",
|
||||
"cpu": {
|
||||
"cores": 16,
|
||||
"architecture": "x86",
|
||||
"shared": false
|
||||
},
|
||||
"ram": {
|
||||
"size": 32786,
|
||||
"ecc": false
|
||||
},
|
||||
"gpu": [
|
||||
{
|
||||
"cuda_cores": 10496,
|
||||
"model": "RTX 3090 FE",
|
||||
"memory": 24000,
|
||||
"tensor_cores": 328
|
||||
},
|
||||
{
|
||||
"cuda_cores": 10496,
|
||||
"model": "RTX 3090 FE",
|
||||
"memory": 24000,
|
||||
"tensor_cores": 328
|
||||
},
|
||||
{
|
||||
"cuda_cores": 10496,
|
||||
"model": "RTX 3090 FE",
|
||||
"memory": 24000,
|
||||
"tensor_cores": 328
|
||||
},
|
||||
{
|
||||
"cuda_cores": 10496,
|
||||
"model": "RTX 3090 FE",
|
||||
"memory": 24000,
|
||||
"tensor_cores": 328
|
||||
},
|
||||
{
|
||||
"cuda_cores": 10496,
|
||||
"model": "RTX 3090 FE",
|
||||
"memory": 24000,
|
||||
"tensor_cores": 328
|
||||
},
|
||||
{
|
||||
"cuda_cores": 10496,
|
||||
"model": "RTX 3090 FE",
|
||||
"memory": 24000,
|
||||
"tensor_cores": 328
|
||||
},
|
||||
{
|
||||
"cuda_cores": 10496,
|
||||
"model": "RTX 3090 FE",
|
||||
"memory": 24000,
|
||||
"tensor_cores": 328
|
||||
},
|
||||
{
|
||||
"cuda_cores": 10496,
|
||||
"model": "RTX 3090 FE",
|
||||
"memory": 24000,
|
||||
"tensor_cores": 328
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
135
scripts/demo_dc2.json
Normal file
@ -0,0 +1,135 @@
|
||||
[
|
||||
{
|
||||
"api": "/v1/datacenter/",
|
||||
"content": [
|
||||
{
|
||||
"name": "Mundi datacenter",
|
||||
"acronym": "DC_myDC",
|
||||
"hosts": [
|
||||
"localhost:49618",
|
||||
"oc-catalog:49618"
|
||||
],
|
||||
"short_description": "Mundi Opencloud Instance",
|
||||
"logo": "./local_imgs/Mundi datacenter.png",
|
||||
"description": "A very long description of what this data is",
|
||||
"type": "datacenter",
|
||||
"bookingPrice": 650,
|
||||
"owner": "IRT",
|
||||
"cpu": {
|
||||
"cores": 8,
|
||||
"architecture": "x86",
|
||||
"shared": false
|
||||
},
|
||||
"ram": {
|
||||
"size": 16384,
|
||||
"ecc": false
|
||||
},
|
||||
"gpu": [
|
||||
{
|
||||
"cuda_cores": 10496,
|
||||
"model": "RTX 3090 FE",
|
||||
"memory": 24000,
|
||||
"tensor_cores": 328
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "CNES datacenter",
|
||||
"acronym": "DC_superDC1",
|
||||
"hosts": [
|
||||
"localhost:49619",
|
||||
"dc1:49618"
|
||||
],
|
||||
"short_description": "CNES Opencloud Instance",
|
||||
"logo": "./local_imgs/CNES datacenter.png",
|
||||
"description": "A very long description of what this data is",
|
||||
"type": "datacenter",
|
||||
"bookingPrice": 650,
|
||||
"owner": "IRT",
|
||||
"cpu": {
|
||||
"cores": 32,
|
||||
"architecture": "x86",
|
||||
"shared": false
|
||||
},
|
||||
"ram": {
|
||||
"size": 100000,
|
||||
"ecc": false
|
||||
},
|
||||
"gpu": []
|
||||
},
|
||||
{
|
||||
"name": "Meteo France datacenter",
|
||||
"acronym": "DC_superDC2",
|
||||
"hosts": [
|
||||
"localhost:49620",
|
||||
"dc2:49618"
|
||||
],
|
||||
"short_description": "Meteo France Opencloud Instance",
|
||||
"logo": "./local_imgs/Meteo France datacenter.png",
|
||||
"description": "A very long description of what this data is",
|
||||
"type": "datacenter",
|
||||
"bookingPrice": 650,
|
||||
"owner": "Meteo France",
|
||||
"cpu": {
|
||||
"cores": 16,
|
||||
"architecture": "x86",
|
||||
"shared": false
|
||||
},
|
||||
"ram": {
|
||||
"size": 32786,
|
||||
"ecc": false
|
||||
},
|
||||
"gpu": [
|
||||
{
|
||||
"cuda_cores": 10496,
|
||||
"model": "RTX 3090 FE",
|
||||
"memory": 24000,
|
||||
"tensor_cores": 328
|
||||
},
|
||||
{
|
||||
"cuda_cores": 10496,
|
||||
"model": "RTX 3090 FE",
|
||||
"memory": 24000,
|
||||
"tensor_cores": 328
|
||||
},
|
||||
{
|
||||
"cuda_cores": 10496,
|
||||
"model": "RTX 3090 FE",
|
||||
"memory": 24000,
|
||||
"tensor_cores": 328
|
||||
},
|
||||
{
|
||||
"cuda_cores": 10496,
|
||||
"model": "RTX 3090 FE",
|
||||
"memory": 24000,
|
||||
"tensor_cores": 328
|
||||
},
|
||||
{
|
||||
"cuda_cores": 10496,
|
||||
"model": "RTX 3090 FE",
|
||||
"memory": 24000,
|
||||
"tensor_cores": 328
|
||||
},
|
||||
{
|
||||
"cuda_cores": 10496,
|
||||
"model": "RTX 3090 FE",
|
||||
"memory": 24000,
|
||||
"tensor_cores": 328
|
||||
},
|
||||
{
|
||||
"cuda_cores": 10496,
|
||||
"model": "RTX 3090 FE",
|
||||
"memory": 24000,
|
||||
"tensor_cores": 328
|
||||
},
|
||||
{
|
||||
"cuda_cores": 10496,
|
||||
"model": "RTX 3090 FE",
|
||||
"memory": 24000,
|
||||
"tensor_cores": 328
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
135
scripts/demo_dc3.json
Normal file
@ -0,0 +1,135 @@
|
||||
[
|
||||
{
|
||||
"api": "/v1/datacenter/",
|
||||
"content": [
|
||||
{
|
||||
"name": "Mundi datacenter",
|
||||
"acronym": "DC_myDC",
|
||||
"hosts": [
|
||||
"localhost:49618",
|
||||
"oc-catalog:49618"
|
||||
],
|
||||
"short_description": "Mundi Opencloud Instance",
|
||||
"logo": "./local_imgs/Mundi datacenter.png",
|
||||
"description": "A very long description of what this data is",
|
||||
"type": "datacenter",
|
||||
"bookingPrice": 650,
|
||||
"owner": "IRT",
|
||||
"cpu": {
|
||||
"cores": 8,
|
||||
"architecture": "x86",
|
||||
"shared": false
|
||||
},
|
||||
"ram": {
|
||||
"size": 16384,
|
||||
"ecc": false
|
||||
},
|
||||
"gpu": [
|
||||
{
|
||||
"cuda_cores": 10496,
|
||||
"model": "RTX 3090 FE",
|
||||
"memory": 24000,
|
||||
"tensor_cores": 328
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "CNES datacenter",
|
||||
"acronym": "DC_superDC1",
|
||||
"hosts": [
|
||||
"localhost:49619",
|
||||
"dc1:49618"
|
||||
],
|
||||
"short_description": "CNES Opencloud Instance",
|
||||
"logo": "./local_imgs/CNES datacenter.png",
|
||||
"description": "A very long description of what this data is",
|
||||
"type": "datacenter",
|
||||
"bookingPrice": 650,
|
||||
"owner": "IRT",
|
||||
"cpu": {
|
||||
"cores": 32,
|
||||
"architecture": "x86",
|
||||
"shared": false
|
||||
},
|
||||
"ram": {
|
||||
"size": 100000,
|
||||
"ecc": false
|
||||
},
|
||||
"gpu": []
|
||||
},
|
||||
{
|
||||
"name": "Meteo France datacenter",
|
||||
"acronym": "DC_superDC2",
|
||||
"hosts": [
|
||||
"localhost:49620",
|
||||
"dc2:49618"
|
||||
],
|
||||
"short_description": "Meteo France Opencloud Instance",
|
||||
"logo": "./local_imgs/Meteo France datacenter.png",
|
||||
"description": "A very long description of what this data is",
|
||||
"type": "datacenter",
|
||||
"bookingPrice": 650,
|
||||
"owner": "Meteo France",
|
||||
"cpu": {
|
||||
"cores": 16,
|
||||
"architecture": "x86",
|
||||
"shared": false
|
||||
},
|
||||
"ram": {
|
||||
"size": 32786,
|
||||
"ecc": false
|
||||
},
|
||||
"gpu": [
|
||||
{
|
||||
"cuda_cores": 10496,
|
||||
"model": "RTX 3090 FE",
|
||||
"memory": 24000,
|
||||
"tensor_cores": 328
|
||||
},
|
||||
{
|
||||
"cuda_cores": 10496,
|
||||
"model": "RTX 3090 FE",
|
||||
"memory": 24000,
|
||||
"tensor_cores": 328
|
||||
},
|
||||
{
|
||||
"cuda_cores": 10496,
|
||||
"model": "RTX 3090 FE",
|
||||
"memory": 24000,
|
||||
"tensor_cores": 328
|
||||
},
|
||||
{
|
||||
"cuda_cores": 10496,
|
||||
"model": "RTX 3090 FE",
|
||||
"memory": 24000,
|
||||
"tensor_cores": 328
|
||||
},
|
||||
{
|
||||
"cuda_cores": 10496,
|
||||
"model": "RTX 3090 FE",
|
||||
"memory": 24000,
|
||||
"tensor_cores": 328
|
||||
},
|
||||
{
|
||||
"cuda_cores": 10496,
|
||||
"model": "RTX 3090 FE",
|
||||
"memory": 24000,
|
||||
"tensor_cores": 328
|
||||
},
|
||||
{
|
||||
"cuda_cores": 10496,
|
||||
"model": "RTX 3090 FE",
|
||||
"memory": 24000,
|
||||
"tensor_cores": 328
|
||||
},
|
||||
{
|
||||
"cuda_cores": 10496,
|
||||
"model": "RTX 3090 FE",
|
||||
"memory": 24000,
|
||||
"tensor_cores": 328
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
15
scripts/generate_selfapi.sh
Executable file
@ -0,0 +1,15 @@
|
||||
#!/bin/env bash
|
||||
set -xe # Don't continue if first command fail
|
||||
|
||||
docker run \
|
||||
--rm \
|
||||
--user=$UID \
|
||||
--network=host \
|
||||
-v ${PWD}:/local \
|
||||
swaggerapi/swagger-codegen-cli:2.4.18 \
|
||||
generate -i /local/swagger/swagger.json -l go -o /local/selfapi_bak
|
||||
|
||||
if [ -d selfapi_bak ]; then
|
||||
rm -fr selfapi
|
||||
mv selfapi_bak selfapi
|
||||
fi
|
BIN
scripts/local_imgs/CNES datacenter.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
scripts/local_imgs/Environment builder.png
Normal file
After Width: | Height: | Size: 39 KiB |
BIN
scripts/local_imgs/Fire propagation simulator.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
scripts/local_imgs/Flammable vegetation slicer.png
Normal file
After Width: | Height: | Size: 42 KiB |
BIN
scripts/local_imgs/IRT local file storage.png
Normal file
After Width: | Height: | Size: 46 KiB |
BIN
scripts/local_imgs/IRT risk database.png
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
scripts/local_imgs/Long term fire risk mitigation planner.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
scripts/local_imgs/Meteo France datacenter.png
Normal file
After Width: | Height: | Size: 38 KiB |
BIN
scripts/local_imgs/Meteo-France forecasts.png
Normal file
After Width: | Height: | Size: 26 KiB |
BIN
scripts/local_imgs/Meteo-France wind archive.png
Normal file
After Width: | Height: | Size: 33 KiB |
BIN
scripts/local_imgs/Mundi Sentienl 3 OLCI Images.png
Normal file
After Width: | Height: | Size: 20 KiB |
BIN
scripts/local_imgs/Mundi Sentienl 3 SRAL Images.png
Normal file
After Width: | Height: | Size: 20 KiB |
BIN
scripts/local_imgs/Mundi datacenter.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
scripts/local_imgs/SAR High points.png
Normal file
After Width: | Height: | Size: 16 KiB |
62
scripts/populate_models.sh
Executable file
@ -0,0 +1,62 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
|
||||
# Must specify a JSON with a following structure:
|
||||
|
||||
# [
|
||||
# {
|
||||
# "api": "endpoint",
|
||||
# "content": [
|
||||
# {} //obj to populate
|
||||
# ]
|
||||
# },
|
||||
# ]
|
||||
|
||||
ENDPOINT="http://localhost:49618"
|
||||
if [[ $DOCKER_ENVIRONMENT ]]; then
|
||||
ENDPOINT="http://oc-catalog:49618"
|
||||
fi
|
||||
|
||||
if [[ $DOCKER_ENDPOINT ]]; then
|
||||
ENDPOINT="$DOCKER_ENDPOINT"
|
||||
fi
|
||||
|
||||
[[ -z $1 ]] && { echo "Must specify a json path"; exit 1; }
|
||||
[[ ! -f $1 ]] && { echo "$1 is not a file"; exit 1; }
|
||||
cat "$1" | jq empty || { echo "$1 is not a valid JSON"; exit 1; }
|
||||
|
||||
########
|
||||
|
||||
while read row; do
|
||||
TRGT_ENDPOINT=$(echo $row | jq -r '.api')
|
||||
|
||||
while read item; do
|
||||
|
||||
img_data=$(echo $item | jq -r '.logo')
|
||||
# If is a path, replace with base64 encoded image
|
||||
if [[ $img_data =~ ^\./.* ]]; then
|
||||
if [[ ! -f ./scripts/"$img_data" ]]; then
|
||||
echo "File ./scripts/$img_data doesn't exist"; exit 1
|
||||
fi
|
||||
|
||||
item=$(echo $item | jq ".logo |= \"$(base64 -w0 ./scripts/"$img_data")\"")
|
||||
fi
|
||||
|
||||
echo `echo $item | jq -r '.name'` to $ENDPOINT${TRGT_ENDPOINT}
|
||||
|
||||
answer=$(curl --fail "$ENDPOINT${TRGT_ENDPOINT}" \
|
||||
-X POST \
|
||||
--data-binary "$item")
|
||||
|
||||
if [[ $? -ne 0 || "$answer" == *"<html>"* ]]; then
|
||||
echo -e "\nERROR: Some error ocurred when submitting"
|
||||
exit 1
|
||||
fi
|
||||
done < <(echo "$row" | jq -c '.content[]')
|
||||
done < <(jq -c '.[]' $1)
|
||||
|
||||
|
||||
echo
|
||||
echo
|
||||
echo
|
||||
echo "All models submitted correctly!"
|
24
selfapi/.gitignore
vendored
Normal file
@ -0,0 +1,24 @@
|
||||
# Compiled Object files, Static and Dynamic libs (Shared Objects)
|
||||
*.o
|
||||
*.a
|
||||
*.so
|
||||
|
||||
# Folders
|
||||
_obj
|
||||
_test
|
||||
|
||||
# Architecture specific extensions/prefixes
|
||||
*.[568vq]
|
||||
[568vq].out
|
||||
|
||||
*.cgo1.go
|
||||
*.cgo2.c
|
||||
_cgo_defun.c
|
||||
_cgo_gotypes.go
|
||||
_cgo_export.*
|
||||
|
||||
_testmain.go
|
||||
|
||||
*.exe
|
||||
*.test
|
||||
*.prof
|
23
selfapi/.swagger-codegen-ignore
Normal file
@ -0,0 +1,23 @@
|
||||
# Swagger Codegen Ignore
|
||||
# Generated by swagger-codegen https://github.com/swagger-api/swagger-codegen
|
||||
|
||||
# Use this file to prevent files from being overwritten by the generator.
|
||||
# The patterns follow closely to .gitignore or .dockerignore.
|
||||
|
||||
# As an example, the C# client generator defines ApiClient.cs.
|
||||
# You can make changes and tell Swagger Codgen to ignore just this file by uncommenting the following line:
|
||||
#ApiClient.cs
|
||||
|
||||
# You can match any string of characters against a directory, file or extension with a single asterisk (*):
|
||||
#foo/*/qux
|
||||
# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux
|
||||
|
||||
# You can recursively match patterns against a directory, file or extension with a double asterisk (**):
|
||||
#foo/**/qux
|
||||
# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux
|
||||
|
||||
# You can also negate patterns with an exclamation (!).
|
||||
# For example, you can ignore all files in a docs folder with the file extension .md:
|
||||
#docs/*.md
|
||||
# Then explicitly reverse the ignore rule for a single file:
|
||||
#!docs/README.md
|
1
selfapi/.swagger-codegen/VERSION
Normal file
@ -0,0 +1 @@
|
||||
2.4.18
|
8
selfapi/.travis.yml
Normal file
@ -0,0 +1,8 @@
|
||||
language: go
|
||||
|
||||
install:
|
||||
- go get -d -v .
|
||||
|
||||
script:
|
||||
- go build -v ./
|
||||
|
100
selfapi/README.md
Normal file
@ -0,0 +1,100 @@
|
||||
# Go API client for swagger
|
||||
|
||||
Backend of the oc-search project
|
||||
|
||||
## Overview
|
||||
This API client was generated by the [swagger-codegen](https://github.com/swagger-api/swagger-codegen) project. By using the [swagger-spec](https://github.com/swagger-api/swagger-spec) from a remote server, you can easily generate an API client.
|
||||
|
||||
- API version: 1.0.0
|
||||
- Package version: 1.0.0
|
||||
- Build package: io.swagger.codegen.languages.GoClientCodegen
|
||||
|
||||
## Installation
|
||||
Put the package under your project folder and add the following in import:
|
||||
```golang
|
||||
import "./swagger"
|
||||
```
|
||||
|
||||
## Documentation for API Endpoints
|
||||
|
||||
All URIs are relative to *https://localhost:49618/v1*
|
||||
|
||||
Class | Method | HTTP request | Description
|
||||
------------ | ------------- | ------------- | -------------
|
||||
*ComputingApi* | [**ComputingControllerAddComputing**](docs/ComputingApi.md#computingcontrolleraddcomputing) | **Post** /computing/ |
|
||||
*ComputingApi* | [**ComputingControllerGetComputingByID**](docs/ComputingApi.md#computingcontrollergetcomputingbyid) | **Get** /computing/{ID} |
|
||||
*ComputingApi* | [**ComputingControllerGetMultipleComputingByIDs**](docs/ComputingApi.md#computingcontrollergetmultiplecomputingbyids) | **Get** /computing/multi/{IDs} |
|
||||
*DataApi* | [**DataControllerCreateData**](docs/DataApi.md#datacontrollercreatedata) | **Post** /data/ |
|
||||
*DataApi* | [**DataControllerGetDataByID**](docs/DataApi.md#datacontrollergetdatabyid) | **Get** /data/{ID} |
|
||||
*DataApi* | [**DataControllerGetMultipleDataByIDs**](docs/DataApi.md#datacontrollergetmultipledatabyids) | **Get** /data/multi/{IDs} |
|
||||
*DatacenterApi* | [**DatacenterControllerCreateDatacenter**](docs/DatacenterApi.md#datacentercontrollercreatedatacenter) | **Post** /datacenter/ |
|
||||
*DatacenterApi* | [**DatacenterControllerGetMultipleDatacentersByIDs**](docs/DatacenterApi.md#datacentercontrollergetmultipledatacentersbyids) | **Get** /datacenter/multi/{IDs} |
|
||||
*DatacenterApi* | [**DatacenterControllerGetOneDatacenter**](docs/DatacenterApi.md#datacentercontrollergetonedatacenter) | **Get** /datacenter/{ID} |
|
||||
*ScheduleApi* | [**ScheduleControllerCheckIfScheduleCanBeCreatedInThisDC**](docs/ScheduleApi.md#schedulecontrollercheckifschedulecanbecreatedinthisdc) | **Post** /schedule/check |
|
||||
*ScheduleApi* | [**ScheduleControllerCreateSchedule**](docs/ScheduleApi.md#schedulecontrollercreateschedule) | **Post** /schedule/book |
|
||||
*ScheduleApi* | [**ScheduleControllerGetNextSchedule**](docs/ScheduleApi.md#schedulecontrollergetnextschedule) | **Get** /schedule/next |
|
||||
*ScheduleApi* | [**ScheduleControllerGetPreviousSchedule**](docs/ScheduleApi.md#schedulecontrollergetpreviousschedule) | **Get** /schedule/previous |
|
||||
*ScheduleApi* | [**ScheduleControllerGetSchedules**](docs/ScheduleApi.md#schedulecontrollergetschedules) | **Get** /schedule/ |
|
||||
*SearchApi* | [**SearchControllerSearchByWord**](docs/SearchApi.md#searchcontrollersearchbyword) | **Get** /search/byWord |
|
||||
*StorageApi* | [**StorageControllerCreateStorage**](docs/StorageApi.md#storagecontrollercreatestorage) | **Post** /storage/ |
|
||||
*StorageApi* | [**StorageControllerGet**](docs/StorageApi.md#storagecontrollerget) | **Get** /storage/{ID} |
|
||||
*StorageApi* | [**StorageControllerGetMultipleStoragesByIDs**](docs/StorageApi.md#storagecontrollergetmultiplestoragesbyids) | **Get** /storage/multi/{IDs} |
|
||||
*UserApi* | [**UserControllerLogin**](docs/UserApi.md#usercontrollerlogin) | **Get** /user/login |
|
||||
*UserApi* | [**UserControllerLogout**](docs/UserApi.md#usercontrollerlogout) | **Get** /user/logout |
|
||||
*WorkflowApi* | [**WorkflowControllerAddNewObjectToAWorkflow**](docs/WorkflowApi.md#workflowcontrolleraddnewobjecttoaworkflow) | **Post** /workflow/{workflowName}/add |
|
||||
*WorkflowApi* | [**WorkflowControllerBookSchedule**](docs/WorkflowApi.md#workflowcontrollerbookschedule) | **Post** /workflow/{workflowName}/schedule/book |
|
||||
*WorkflowApi* | [**WorkflowControllerCheckSchedule**](docs/WorkflowApi.md#workflowcontrollercheckschedule) | **Get** /workflow/{workflowName}/schedule/check |
|
||||
*WorkflowApi* | [**WorkflowControllerCreateANewWorkflow**](docs/WorkflowApi.md#workflowcontrollercreateanewworkflow) | **Post** /workflow/ |
|
||||
*WorkflowApi* | [**WorkflowControllerCreateARealtionshipBetweenTwoRobjects**](docs/WorkflowApi.md#workflowcontrollercreatearealtionshipbetweentworobjects) | **Post** /workflow/{workflowName}/link |
|
||||
*WorkflowApi* | [**WorkflowControllerGetMxGraphLastStatus**](docs/WorkflowApi.md#workflowcontrollergetmxgraphlaststatus) | **Get** /workflow/{workflowName}/mxGraphParser |
|
||||
*WorkflowApi* | [**WorkflowControllerGetSchedule**](docs/WorkflowApi.md#workflowcontrollergetschedule) | **Get** /workflow/{workflowName}/schedule |
|
||||
*WorkflowApi* | [**WorkflowControllerGetWorkflow**](docs/WorkflowApi.md#workflowcontrollergetworkflow) | **Get** /workflow/{workflowName} |
|
||||
*WorkflowApi* | [**WorkflowControllerListWorkflows**](docs/WorkflowApi.md#workflowcontrollerlistworkflows) | **Get** /workflow/ |
|
||||
*WorkflowApi* | [**WorkflowControllerParseMxGraph**](docs/WorkflowApi.md#workflowcontrollerparsemxgraph) | **Post** /workflow/{workflowName}/mxGraphParser |
|
||||
*WorkflowApi* | [**WorkflowControllerSetSchedule**](docs/WorkflowApi.md#workflowcontrollersetschedule) | **Put** /workflow/{workflowName}/schedule |
|
||||
*WorkspaceApi* | [**WorkspaceControllerAddModelToWorkspace**](docs/WorkspaceApi.md#workspacecontrolleraddmodeltoworkspace) | **Post** /workspace/ |
|
||||
*WorkspaceApi* | [**WorkspaceControllerDeleteElementFromUserWorkspace**](docs/WorkspaceApi.md#workspacecontrollerdeleteelementfromuserworkspace) | **Delete** /workspace/ |
|
||||
*WorkspaceApi* | [**WorkspaceControllerGetFullWorkspace**](docs/WorkspaceApi.md#workspacecontrollergetfullworkspace) | **Get** /workspace/list_model |
|
||||
*WorkspaceApi* | [**WorkspaceControllerGetWorkspace**](docs/WorkspaceApi.md#workspacecontrollergetworkspace) | **Get** /workspace/list |
|
||||
|
||||
|
||||
## Documentation For Models
|
||||
|
||||
- [ModelsComputingModel](docs/ModelsComputingModel.md)
|
||||
- [ModelsComputingNewModel](docs/ModelsComputingNewModel.md)
|
||||
- [ModelsComputingObject](docs/ModelsComputingObject.md)
|
||||
- [ModelsDCstatus](docs/ModelsDCstatus.md)
|
||||
- [ModelsDataModel](docs/ModelsDataModel.md)
|
||||
- [ModelsDataNewModel](docs/ModelsDataNewModel.md)
|
||||
- [ModelsDataObject](docs/ModelsDataObject.md)
|
||||
- [ModelsDatacenterCpuModel](docs/ModelsDatacenterCpuModel.md)
|
||||
- [ModelsDatacenterGpuModel](docs/ModelsDatacenterGpuModel.md)
|
||||
- [ModelsDatacenterMemoryModel](docs/ModelsDatacenterMemoryModel.md)
|
||||
- [ModelsDatacenterModel](docs/ModelsDatacenterModel.md)
|
||||
- [ModelsDatacenterNewModel](docs/ModelsDatacenterNewModel.md)
|
||||
- [ModelsDatacenterObject](docs/ModelsDatacenterObject.md)
|
||||
- [ModelsExecutionRequirementsModel](docs/ModelsExecutionRequirementsModel.md)
|
||||
- [ModelsRepositoryModel](docs/ModelsRepositoryModel.md)
|
||||
- [ModelsScheduleDb](docs/ModelsScheduleDb.md)
|
||||
- [ModelsScheduleInfo](docs/ModelsScheduleInfo.md)
|
||||
- [ModelsScheduleTime](docs/ModelsScheduleTime.md)
|
||||
- [ModelsSearchResult](docs/ModelsSearchResult.md)
|
||||
- [ModelsStorageModel](docs/ModelsStorageModel.md)
|
||||
- [ModelsStorageNewModel](docs/ModelsStorageNewModel.md)
|
||||
- [ModelsStorageObject](docs/ModelsStorageObject.md)
|
||||
- [ModelsWorkflow](docs/ModelsWorkflow.md)
|
||||
- [ModelsWorkflowSchedule](docs/ModelsWorkflowSchedule.md)
|
||||
- [ModelsWorkspace](docs/ModelsWorkspace.md)
|
||||
- [ModelsWorkspaceModel](docs/ModelsWorkspaceModel.md)
|
||||
- [PrimitiveObjectId](docs/PrimitiveObjectId.md)
|
||||
- [TimeTime](docs/TimeTime.md)
|
||||
|
||||
|
||||
## Documentation For Authorization
|
||||
Endpoints do not require authorization.
|
||||
|
||||
|
||||
## Author
|
||||
|
||||
opencloud@irt-saintexupery.com
|
||||
|
1996
selfapi/api/swagger.yaml
Normal file
269
selfapi/api_computing.go
Normal file
@ -0,0 +1,269 @@
|
||||
/*
|
||||
* oc-catalog API
|
||||
*
|
||||
* Backend of the oc-search project
|
||||
*
|
||||
* API version: 1.0.0
|
||||
* Contact: opencloud@irt-saintexupery.com
|
||||
* Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
|
||||
*/
|
||||
|
||||
package swagger
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Linger please
|
||||
var (
|
||||
_ context.Context
|
||||
)
|
||||
|
||||
type ComputingApiService service
|
||||
|
||||
/*
|
||||
ComputingApiService
|
||||
Submit a computing object
|
||||
- @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
|
||||
- @param body The object content
|
||||
*/
|
||||
func (a *ComputingApiService) ComputingControllerAddComputing(ctx context.Context, body ModelsComputingNewModel) (*http.Response, error) {
|
||||
var (
|
||||
localVarHttpMethod = strings.ToUpper("Post")
|
||||
localVarPostBody interface{}
|
||||
localVarFileName string
|
||||
localVarFileBytes []byte
|
||||
)
|
||||
|
||||
// create path and map variables
|
||||
localVarPath := a.client.cfg.BasePath + "/computing/"
|
||||
|
||||
localVarHeaderParams := make(map[string]string)
|
||||
localVarQueryParams := url.Values{}
|
||||
localVarFormParams := url.Values{}
|
||||
|
||||
// to determine the Content-Type header
|
||||
localVarHttpContentTypes := []string{}
|
||||
|
||||
// set Content-Type header
|
||||
localVarHttpContentType := selectHeaderContentType(localVarHttpContentTypes)
|
||||
if localVarHttpContentType != "" {
|
||||
localVarHeaderParams["Content-Type"] = localVarHttpContentType
|
||||
}
|
||||
|
||||
// to determine the Accept header
|
||||
localVarHttpHeaderAccepts := []string{}
|
||||
|
||||
// set Accept header
|
||||
localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
|
||||
if localVarHttpHeaderAccept != "" {
|
||||
localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
|
||||
}
|
||||
// body params
|
||||
localVarPostBody = &body
|
||||
r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
localVarHttpResponse, err := a.client.callAPI(r)
|
||||
if err != nil || localVarHttpResponse == nil {
|
||||
return localVarHttpResponse, err
|
||||
}
|
||||
|
||||
localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
|
||||
localVarHttpResponse.Body.Close()
|
||||
if err != nil {
|
||||
return localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode >= 300 {
|
||||
newErr := GenericSwaggerError{
|
||||
body: localVarBody,
|
||||
error: localVarHttpResponse.Status,
|
||||
}
|
||||
|
||||
return localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarHttpResponse, nil
|
||||
}
|
||||
|
||||
/*
|
||||
ComputingApiService
|
||||
Find a computing resource based on ID
|
||||
- @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
|
||||
- @param iD The ID of the resource
|
||||
|
||||
@return ModelsComputingModel
|
||||
*/
|
||||
func (a *ComputingApiService) ComputingControllerGetComputingByID(ctx context.Context, iD string) (ModelsComputingModel, *http.Response, error) {
|
||||
var (
|
||||
localVarHttpMethod = strings.ToUpper("Get")
|
||||
localVarPostBody interface{}
|
||||
localVarFileName string
|
||||
localVarFileBytes []byte
|
||||
localVarReturnValue ModelsComputingModel
|
||||
)
|
||||
|
||||
// create path and map variables
|
||||
localVarPath := a.client.cfg.BasePath + "/computing/{ID}"
|
||||
localVarPath = strings.Replace(localVarPath, "{"+"ID"+"}", fmt.Sprintf("%v", iD), -1)
|
||||
|
||||
localVarHeaderParams := make(map[string]string)
|
||||
localVarQueryParams := url.Values{}
|
||||
localVarFormParams := url.Values{}
|
||||
|
||||
// to determine the Content-Type header
|
||||
localVarHttpContentTypes := []string{}
|
||||
|
||||
// set Content-Type header
|
||||
localVarHttpContentType := selectHeaderContentType(localVarHttpContentTypes)
|
||||
if localVarHttpContentType != "" {
|
||||
localVarHeaderParams["Content-Type"] = localVarHttpContentType
|
||||
}
|
||||
|
||||
// to determine the Accept header
|
||||
localVarHttpHeaderAccepts := []string{}
|
||||
|
||||
// set Accept header
|
||||
localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
|
||||
if localVarHttpHeaderAccept != "" {
|
||||
localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
|
||||
}
|
||||
r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
|
||||
if err != nil {
|
||||
return localVarReturnValue, nil, err
|
||||
}
|
||||
|
||||
localVarHttpResponse, err := a.client.callAPI(r)
|
||||
if err != nil || localVarHttpResponse == nil {
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
|
||||
localVarHttpResponse.Body.Close()
|
||||
if err != nil {
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode < 300 {
|
||||
// If we succeed, return the data, otherwise pass on to decode error.
|
||||
err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode >= 300 {
|
||||
newErr := GenericSwaggerError{
|
||||
body: localVarBody,
|
||||
error: localVarHttpResponse.Status,
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode == 200 {
|
||||
var v ModelsComputingModel
|
||||
err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
|
||||
if err != nil {
|
||||
newErr.error = err.Error()
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
newErr.model = v
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarReturnValue, localVarHttpResponse, nil
|
||||
}
|
||||
|
||||
/*
|
||||
ComputingApiService
|
||||
Return Computing objects if found in the DB. Not found IDs will be ignored
|
||||
- @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
|
||||
- @param iDs List of computing IDs
|
||||
|
||||
@return []ModelsComputingModel
|
||||
*/
|
||||
func (a *ComputingApiService) ComputingControllerGetMultipleComputingByIDs(ctx context.Context, iDs []string) ([]ModelsComputingModel, *http.Response, error) {
|
||||
var (
|
||||
localVarHttpMethod = strings.ToUpper("Get")
|
||||
localVarPostBody interface{}
|
||||
localVarFileName string
|
||||
localVarFileBytes []byte
|
||||
localVarReturnValue []ModelsComputingModel
|
||||
)
|
||||
|
||||
// create path and map variables
|
||||
localVarPath := a.client.cfg.BasePath + "/computing/multi/{IDs}"
|
||||
localVarPath = strings.Replace(localVarPath, "{"+"IDs"+"}", fmt.Sprintf("%v", iDs), -1)
|
||||
|
||||
localVarHeaderParams := make(map[string]string)
|
||||
localVarQueryParams := url.Values{}
|
||||
localVarFormParams := url.Values{}
|
||||
|
||||
// to determine the Content-Type header
|
||||
localVarHttpContentTypes := []string{}
|
||||
|
||||
// set Content-Type header
|
||||
localVarHttpContentType := selectHeaderContentType(localVarHttpContentTypes)
|
||||
if localVarHttpContentType != "" {
|
||||
localVarHeaderParams["Content-Type"] = localVarHttpContentType
|
||||
}
|
||||
|
||||
// to determine the Accept header
|
||||
localVarHttpHeaderAccepts := []string{}
|
||||
|
||||
// set Accept header
|
||||
localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
|
||||
if localVarHttpHeaderAccept != "" {
|
||||
localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
|
||||
}
|
||||
r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
|
||||
if err != nil {
|
||||
return localVarReturnValue, nil, err
|
||||
}
|
||||
|
||||
localVarHttpResponse, err := a.client.callAPI(r)
|
||||
if err != nil || localVarHttpResponse == nil {
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
|
||||
localVarHttpResponse.Body.Close()
|
||||
if err != nil {
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode < 300 {
|
||||
// If we succeed, return the data, otherwise pass on to decode error.
|
||||
err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode >= 300 {
|
||||
newErr := GenericSwaggerError{
|
||||
body: localVarBody,
|
||||
error: localVarHttpResponse.Status,
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode == 200 {
|
||||
var v []ModelsComputingModel
|
||||
err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
|
||||
if err != nil {
|
||||
newErr.error = err.Error()
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
newErr.model = v
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarReturnValue, localVarHttpResponse, nil
|
||||
}
|
269
selfapi/api_data.go
Normal file
@ -0,0 +1,269 @@
|
||||
/*
|
||||
* oc-catalog API
|
||||
*
|
||||
* Backend of the oc-search project
|
||||
*
|
||||
* API version: 1.0.0
|
||||
* Contact: opencloud@irt-saintexupery.com
|
||||
* Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
|
||||
*/
|
||||
|
||||
package swagger
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Linger please
|
||||
var (
|
||||
_ context.Context
|
||||
)
|
||||
|
||||
type DataApiService service
|
||||
|
||||
/*
|
||||
DataApiService
|
||||
Submit data object
|
||||
- @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
|
||||
- @param body The object content
|
||||
*/
|
||||
func (a *DataApiService) DataControllerCreateData(ctx context.Context, body ModelsDataNewModel) (*http.Response, error) {
|
||||
var (
|
||||
localVarHttpMethod = strings.ToUpper("Post")
|
||||
localVarPostBody interface{}
|
||||
localVarFileName string
|
||||
localVarFileBytes []byte
|
||||
)
|
||||
|
||||
// create path and map variables
|
||||
localVarPath := a.client.cfg.BasePath + "/data/"
|
||||
|
||||
localVarHeaderParams := make(map[string]string)
|
||||
localVarQueryParams := url.Values{}
|
||||
localVarFormParams := url.Values{}
|
||||
|
||||
// to determine the Content-Type header
|
||||
localVarHttpContentTypes := []string{}
|
||||
|
||||
// set Content-Type header
|
||||
localVarHttpContentType := selectHeaderContentType(localVarHttpContentTypes)
|
||||
if localVarHttpContentType != "" {
|
||||
localVarHeaderParams["Content-Type"] = localVarHttpContentType
|
||||
}
|
||||
|
||||
// to determine the Accept header
|
||||
localVarHttpHeaderAccepts := []string{}
|
||||
|
||||
// set Accept header
|
||||
localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
|
||||
if localVarHttpHeaderAccept != "" {
|
||||
localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
|
||||
}
|
||||
// body params
|
||||
localVarPostBody = &body
|
||||
r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
localVarHttpResponse, err := a.client.callAPI(r)
|
||||
if err != nil || localVarHttpResponse == nil {
|
||||
return localVarHttpResponse, err
|
||||
}
|
||||
|
||||
localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
|
||||
localVarHttpResponse.Body.Close()
|
||||
if err != nil {
|
||||
return localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode >= 300 {
|
||||
newErr := GenericSwaggerError{
|
||||
body: localVarBody,
|
||||
error: localVarHttpResponse.Status,
|
||||
}
|
||||
|
||||
return localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarHttpResponse, nil
|
||||
}
|
||||
|
||||
/*
|
||||
DataApiService
|
||||
Find rType data based on ID
|
||||
- @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
|
||||
- @param iD The ID of the data resource
|
||||
|
||||
@return ModelsDataModel
|
||||
*/
|
||||
func (a *DataApiService) DataControllerGetDataByID(ctx context.Context, iD string) (ModelsDataModel, *http.Response, error) {
|
||||
var (
|
||||
localVarHttpMethod = strings.ToUpper("Get")
|
||||
localVarPostBody interface{}
|
||||
localVarFileName string
|
||||
localVarFileBytes []byte
|
||||
localVarReturnValue ModelsDataModel
|
||||
)
|
||||
|
||||
// create path and map variables
|
||||
localVarPath := a.client.cfg.BasePath + "/data/{ID}"
|
||||
localVarPath = strings.Replace(localVarPath, "{"+"ID"+"}", fmt.Sprintf("%v", iD), -1)
|
||||
|
||||
localVarHeaderParams := make(map[string]string)
|
||||
localVarQueryParams := url.Values{}
|
||||
localVarFormParams := url.Values{}
|
||||
|
||||
// to determine the Content-Type header
|
||||
localVarHttpContentTypes := []string{}
|
||||
|
||||
// set Content-Type header
|
||||
localVarHttpContentType := selectHeaderContentType(localVarHttpContentTypes)
|
||||
if localVarHttpContentType != "" {
|
||||
localVarHeaderParams["Content-Type"] = localVarHttpContentType
|
||||
}
|
||||
|
||||
// to determine the Accept header
|
||||
localVarHttpHeaderAccepts := []string{}
|
||||
|
||||
// set Accept header
|
||||
localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
|
||||
if localVarHttpHeaderAccept != "" {
|
||||
localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
|
||||
}
|
||||
r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
|
||||
if err != nil {
|
||||
return localVarReturnValue, nil, err
|
||||
}
|
||||
|
||||
localVarHttpResponse, err := a.client.callAPI(r)
|
||||
if err != nil || localVarHttpResponse == nil {
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
|
||||
localVarHttpResponse.Body.Close()
|
||||
if err != nil {
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode < 300 {
|
||||
// If we succeed, return the data, otherwise pass on to decode error.
|
||||
err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode >= 300 {
|
||||
newErr := GenericSwaggerError{
|
||||
body: localVarBody,
|
||||
error: localVarHttpResponse.Status,
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode == 200 {
|
||||
var v ModelsDataModel
|
||||
err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
|
||||
if err != nil {
|
||||
newErr.error = err.Error()
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
newErr.model = v
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarReturnValue, localVarHttpResponse, nil
|
||||
}
|
||||
|
||||
/*
|
||||
DataApiService
|
||||
Return Data object if found in the DB. Not found IDs will be ignored
|
||||
- @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
|
||||
- @param iDs List of data IDs
|
||||
|
||||
@return []ModelsDataModel
|
||||
*/
|
||||
func (a *DataApiService) DataControllerGetMultipleDataByIDs(ctx context.Context, iDs []string) ([]ModelsDataModel, *http.Response, error) {
|
||||
var (
|
||||
localVarHttpMethod = strings.ToUpper("Get")
|
||||
localVarPostBody interface{}
|
||||
localVarFileName string
|
||||
localVarFileBytes []byte
|
||||
localVarReturnValue []ModelsDataModel
|
||||
)
|
||||
|
||||
// create path and map variables
|
||||
localVarPath := a.client.cfg.BasePath + "/data/multi/{IDs}"
|
||||
localVarPath = strings.Replace(localVarPath, "{"+"IDs"+"}", fmt.Sprintf("%v", iDs), -1)
|
||||
|
||||
localVarHeaderParams := make(map[string]string)
|
||||
localVarQueryParams := url.Values{}
|
||||
localVarFormParams := url.Values{}
|
||||
|
||||
// to determine the Content-Type header
|
||||
localVarHttpContentTypes := []string{}
|
||||
|
||||
// set Content-Type header
|
||||
localVarHttpContentType := selectHeaderContentType(localVarHttpContentTypes)
|
||||
if localVarHttpContentType != "" {
|
||||
localVarHeaderParams["Content-Type"] = localVarHttpContentType
|
||||
}
|
||||
|
||||
// to determine the Accept header
|
||||
localVarHttpHeaderAccepts := []string{}
|
||||
|
||||
// set Accept header
|
||||
localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
|
||||
if localVarHttpHeaderAccept != "" {
|
||||
localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
|
||||
}
|
||||
r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
|
||||
if err != nil {
|
||||
return localVarReturnValue, nil, err
|
||||
}
|
||||
|
||||
localVarHttpResponse, err := a.client.callAPI(r)
|
||||
if err != nil || localVarHttpResponse == nil {
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
|
||||
localVarHttpResponse.Body.Close()
|
||||
if err != nil {
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode < 300 {
|
||||
// If we succeed, return the data, otherwise pass on to decode error.
|
||||
err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode >= 300 {
|
||||
newErr := GenericSwaggerError{
|
||||
body: localVarBody,
|
||||
error: localVarHttpResponse.Status,
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode == 200 {
|
||||
var v []ModelsDataModel
|
||||
err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
|
||||
if err != nil {
|
||||
newErr.error = err.Error()
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
newErr.model = v
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarReturnValue, localVarHttpResponse, nil
|
||||
}
|
269
selfapi/api_datacenter.go
Normal file
@ -0,0 +1,269 @@
|
||||
/*
|
||||
* oc-catalog API
|
||||
*
|
||||
* Backend of the oc-search project
|
||||
*
|
||||
* API version: 1.0.0
|
||||
* Contact: opencloud@irt-saintexupery.com
|
||||
* Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
|
||||
*/
|
||||
|
||||
package swagger
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Linger please
|
||||
var (
|
||||
_ context.Context
|
||||
)
|
||||
|
||||
type DatacenterApiService service
|
||||
|
||||
/*
|
||||
DatacenterApiService
|
||||
submit Datacenter object
|
||||
- @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
|
||||
- @param body The object content
|
||||
*/
|
||||
func (a *DatacenterApiService) DatacenterControllerCreateDatacenter(ctx context.Context, body ModelsDatacenterNewModel) (*http.Response, error) {
|
||||
var (
|
||||
localVarHttpMethod = strings.ToUpper("Post")
|
||||
localVarPostBody interface{}
|
||||
localVarFileName string
|
||||
localVarFileBytes []byte
|
||||
)
|
||||
|
||||
// create path and map variables
|
||||
localVarPath := a.client.cfg.BasePath + "/datacenter/"
|
||||
|
||||
localVarHeaderParams := make(map[string]string)
|
||||
localVarQueryParams := url.Values{}
|
||||
localVarFormParams := url.Values{}
|
||||
|
||||
// to determine the Content-Type header
|
||||
localVarHttpContentTypes := []string{}
|
||||
|
||||
// set Content-Type header
|
||||
localVarHttpContentType := selectHeaderContentType(localVarHttpContentTypes)
|
||||
if localVarHttpContentType != "" {
|
||||
localVarHeaderParams["Content-Type"] = localVarHttpContentType
|
||||
}
|
||||
|
||||
// to determine the Accept header
|
||||
localVarHttpHeaderAccepts := []string{}
|
||||
|
||||
// set Accept header
|
||||
localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
|
||||
if localVarHttpHeaderAccept != "" {
|
||||
localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
|
||||
}
|
||||
// body params
|
||||
localVarPostBody = &body
|
||||
r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
localVarHttpResponse, err := a.client.callAPI(r)
|
||||
if err != nil || localVarHttpResponse == nil {
|
||||
return localVarHttpResponse, err
|
||||
}
|
||||
|
||||
localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
|
||||
localVarHttpResponse.Body.Close()
|
||||
if err != nil {
|
||||
return localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode >= 300 {
|
||||
newErr := GenericSwaggerError{
|
||||
body: localVarBody,
|
||||
error: localVarHttpResponse.Status,
|
||||
}
|
||||
|
||||
return localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarHttpResponse, nil
|
||||
}
|
||||
|
||||
/*
|
||||
DatacenterApiService
|
||||
Return Datacenter objects if found in the DB. Not found IDs will be ignored
|
||||
- @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
|
||||
- @param iDs List of datacenter IDs
|
||||
|
||||
@return []ModelsComputingModel
|
||||
*/
|
||||
func (a *DatacenterApiService) DatacenterControllerGetMultipleDatacentersByIDs(ctx context.Context, iDs []string) ([]ModelsComputingModel, *http.Response, error) {
|
||||
var (
|
||||
localVarHttpMethod = strings.ToUpper("Get")
|
||||
localVarPostBody interface{}
|
||||
localVarFileName string
|
||||
localVarFileBytes []byte
|
||||
localVarReturnValue []ModelsComputingModel
|
||||
)
|
||||
|
||||
// create path and map variables
|
||||
localVarPath := a.client.cfg.BasePath + "/datacenter/multi/{IDs}"
|
||||
localVarPath = strings.Replace(localVarPath, "{"+"IDs"+"}", fmt.Sprintf("%v", iDs), -1)
|
||||
|
||||
localVarHeaderParams := make(map[string]string)
|
||||
localVarQueryParams := url.Values{}
|
||||
localVarFormParams := url.Values{}
|
||||
|
||||
// to determine the Content-Type header
|
||||
localVarHttpContentTypes := []string{}
|
||||
|
||||
// set Content-Type header
|
||||
localVarHttpContentType := selectHeaderContentType(localVarHttpContentTypes)
|
||||
if localVarHttpContentType != "" {
|
||||
localVarHeaderParams["Content-Type"] = localVarHttpContentType
|
||||
}
|
||||
|
||||
// to determine the Accept header
|
||||
localVarHttpHeaderAccepts := []string{}
|
||||
|
||||
// set Accept header
|
||||
localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
|
||||
if localVarHttpHeaderAccept != "" {
|
||||
localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
|
||||
}
|
||||
r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
|
||||
if err != nil {
|
||||
return localVarReturnValue, nil, err
|
||||
}
|
||||
|
||||
localVarHttpResponse, err := a.client.callAPI(r)
|
||||
if err != nil || localVarHttpResponse == nil {
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
|
||||
localVarHttpResponse.Body.Close()
|
||||
if err != nil {
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode < 300 {
|
||||
// If we succeed, return the data, otherwise pass on to decode error.
|
||||
err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode >= 300 {
|
||||
newErr := GenericSwaggerError{
|
||||
body: localVarBody,
|
||||
error: localVarHttpResponse.Status,
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode == 200 {
|
||||
var v []ModelsComputingModel
|
||||
err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
|
||||
if err != nil {
|
||||
newErr.error = err.Error()
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
newErr.model = v
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarReturnValue, localVarHttpResponse, nil
|
||||
}
|
||||
|
||||
/*
|
||||
DatacenterApiService
|
||||
find datacenter by ID
|
||||
- @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
|
||||
- @param iD the ID you want to get
|
||||
|
||||
@return ModelsDatacenterModel
|
||||
*/
|
||||
func (a *DatacenterApiService) DatacenterControllerGetOneDatacenter(ctx context.Context, iD string) (ModelsDatacenterModel, *http.Response, error) {
|
||||
var (
|
||||
localVarHttpMethod = strings.ToUpper("Get")
|
||||
localVarPostBody interface{}
|
||||
localVarFileName string
|
||||
localVarFileBytes []byte
|
||||
localVarReturnValue ModelsDatacenterModel
|
||||
)
|
||||
|
||||
// create path and map variables
|
||||
localVarPath := a.client.cfg.BasePath + "/datacenter/{ID}"
|
||||
localVarPath = strings.Replace(localVarPath, "{"+"ID"+"}", fmt.Sprintf("%v", iD), -1)
|
||||
|
||||
localVarHeaderParams := make(map[string]string)
|
||||
localVarQueryParams := url.Values{}
|
||||
localVarFormParams := url.Values{}
|
||||
|
||||
// to determine the Content-Type header
|
||||
localVarHttpContentTypes := []string{}
|
||||
|
||||
// set Content-Type header
|
||||
localVarHttpContentType := selectHeaderContentType(localVarHttpContentTypes)
|
||||
if localVarHttpContentType != "" {
|
||||
localVarHeaderParams["Content-Type"] = localVarHttpContentType
|
||||
}
|
||||
|
||||
// to determine the Accept header
|
||||
localVarHttpHeaderAccepts := []string{}
|
||||
|
||||
// set Accept header
|
||||
localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
|
||||
if localVarHttpHeaderAccept != "" {
|
||||
localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
|
||||
}
|
||||
r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
|
||||
if err != nil {
|
||||
return localVarReturnValue, nil, err
|
||||
}
|
||||
|
||||
localVarHttpResponse, err := a.client.callAPI(r)
|
||||
if err != nil || localVarHttpResponse == nil {
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
|
||||
localVarHttpResponse.Body.Close()
|
||||
if err != nil {
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode < 300 {
|
||||
// If we succeed, return the data, otherwise pass on to decode error.
|
||||
err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode >= 300 {
|
||||
newErr := GenericSwaggerError{
|
||||
body: localVarBody,
|
||||
error: localVarHttpResponse.Status,
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode == 200 {
|
||||
var v ModelsDatacenterModel
|
||||
err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
|
||||
if err != nil {
|
||||
newErr.error = err.Error()
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
newErr.model = v
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarReturnValue, localVarHttpResponse, nil
|
||||
}
|
465
selfapi/api_schedule.go
Normal file
@ -0,0 +1,465 @@
|
||||
/*
|
||||
* oc-catalog API
|
||||
*
|
||||
* Backend of the oc-search project
|
||||
*
|
||||
* API version: 1.0.0
|
||||
* Contact: opencloud@irt-saintexupery.com
|
||||
* Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
|
||||
*/
|
||||
|
||||
package swagger
|
||||
|
||||
import (
|
||||
"context"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Linger please
|
||||
var (
|
||||
_ context.Context
|
||||
)
|
||||
|
||||
type ScheduleApiService service
|
||||
|
||||
/*
|
||||
ScheduleApiService
|
||||
Check for availability of this DC
|
||||
- @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
|
||||
- @param cron Cron syntax
|
||||
- @param duration Duration in seconds
|
||||
- @param startDate RFC3339 time for startDate
|
||||
- @param stopDate RFC3339 time for stopDate
|
||||
- @param requirements The object content
|
||||
*/
|
||||
func (a *ScheduleApiService) ScheduleControllerCheckIfScheduleCanBeCreatedInThisDC(ctx context.Context, cron string, duration int32, startDate interface{}, stopDate interface{}, requirements ModelsExecutionRequirementsModel) (*http.Response, error) {
|
||||
var (
|
||||
localVarHttpMethod = strings.ToUpper("Post")
|
||||
localVarPostBody interface{}
|
||||
localVarFileName string
|
||||
localVarFileBytes []byte
|
||||
)
|
||||
|
||||
// create path and map variables
|
||||
localVarPath := a.client.cfg.BasePath + "/schedule/check"
|
||||
|
||||
localVarHeaderParams := make(map[string]string)
|
||||
localVarQueryParams := url.Values{}
|
||||
localVarFormParams := url.Values{}
|
||||
|
||||
localVarQueryParams.Add("cron", parameterToString(cron, ""))
|
||||
localVarQueryParams.Add("duration", parameterToString(duration, ""))
|
||||
localVarQueryParams.Add("startDate", parameterToString(startDate, ""))
|
||||
localVarQueryParams.Add("stopDate", parameterToString(stopDate, ""))
|
||||
// to determine the Content-Type header
|
||||
localVarHttpContentTypes := []string{}
|
||||
|
||||
// set Content-Type header
|
||||
localVarHttpContentType := selectHeaderContentType(localVarHttpContentTypes)
|
||||
if localVarHttpContentType != "" {
|
||||
localVarHeaderParams["Content-Type"] = localVarHttpContentType
|
||||
}
|
||||
|
||||
// to determine the Accept header
|
||||
localVarHttpHeaderAccepts := []string{}
|
||||
|
||||
// set Accept header
|
||||
localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
|
||||
if localVarHttpHeaderAccept != "" {
|
||||
localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
|
||||
}
|
||||
// body params
|
||||
localVarPostBody = &requirements
|
||||
r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
localVarHttpResponse, err := a.client.callAPI(r)
|
||||
if err != nil || localVarHttpResponse == nil {
|
||||
return localVarHttpResponse, err
|
||||
}
|
||||
|
||||
localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
|
||||
localVarHttpResponse.Body.Close()
|
||||
if err != nil {
|
||||
return localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode >= 300 {
|
||||
newErr := GenericSwaggerError{
|
||||
body: localVarBody,
|
||||
error: localVarHttpResponse.Status,
|
||||
}
|
||||
|
||||
return localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarHttpResponse, nil
|
||||
}
|
||||
|
||||
/*
|
||||
ScheduleApiService
|
||||
Create schedule for a workflow. It will return some future executions just as information
|
||||
- @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
|
||||
- @param dcName Name of the node (oc-catalog) from where the workflow comes.
|
||||
- @param workflowName Workflow Name
|
||||
- @param cron Cron syntax with year. If no year is specified, will use the current
|
||||
- @param duration Duration in seconds
|
||||
- @param startDate RFC3339 time for startDate
|
||||
- @param stopDate RFC3339 time for stopDate
|
||||
- @param requirements The object content
|
||||
|
||||
@return ModelsScheduleInfo
|
||||
*/
|
||||
func (a *ScheduleApiService) ScheduleControllerCreateSchedule(ctx context.Context, dcName string, workflowName string, cron string, duration int32, startDate interface{}, stopDate interface{}, requirements ModelsExecutionRequirementsModel) (ModelsScheduleInfo, *http.Response, error) {
|
||||
var (
|
||||
localVarHttpMethod = strings.ToUpper("Post")
|
||||
localVarPostBody interface{}
|
||||
localVarFileName string
|
||||
localVarFileBytes []byte
|
||||
localVarReturnValue ModelsScheduleInfo
|
||||
)
|
||||
|
||||
// create path and map variables
|
||||
localVarPath := a.client.cfg.BasePath + "/schedule/book"
|
||||
|
||||
localVarHeaderParams := make(map[string]string)
|
||||
localVarQueryParams := url.Values{}
|
||||
localVarFormParams := url.Values{}
|
||||
|
||||
localVarQueryParams.Add("dcName", parameterToString(dcName, ""))
|
||||
localVarQueryParams.Add("workflowName", parameterToString(workflowName, ""))
|
||||
localVarQueryParams.Add("cron", parameterToString(cron, ""))
|
||||
localVarQueryParams.Add("duration", parameterToString(duration, ""))
|
||||
localVarQueryParams.Add("startDate", parameterToString(startDate, ""))
|
||||
localVarQueryParams.Add("stopDate", parameterToString(stopDate, ""))
|
||||
// to determine the Content-Type header
|
||||
localVarHttpContentTypes := []string{}
|
||||
|
||||
// set Content-Type header
|
||||
localVarHttpContentType := selectHeaderContentType(localVarHttpContentTypes)
|
||||
if localVarHttpContentType != "" {
|
||||
localVarHeaderParams["Content-Type"] = localVarHttpContentType
|
||||
}
|
||||
|
||||
// to determine the Accept header
|
||||
localVarHttpHeaderAccepts := []string{}
|
||||
|
||||
// set Accept header
|
||||
localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
|
||||
if localVarHttpHeaderAccept != "" {
|
||||
localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
|
||||
}
|
||||
// body params
|
||||
localVarPostBody = &requirements
|
||||
r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
|
||||
if err != nil {
|
||||
return localVarReturnValue, nil, err
|
||||
}
|
||||
|
||||
localVarHttpResponse, err := a.client.callAPI(r)
|
||||
if err != nil || localVarHttpResponse == nil {
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
|
||||
localVarHttpResponse.Body.Close()
|
||||
if err != nil {
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode < 300 {
|
||||
// If we succeed, return the data, otherwise pass on to decode error.
|
||||
err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode >= 300 {
|
||||
newErr := GenericSwaggerError{
|
||||
body: localVarBody,
|
||||
error: localVarHttpResponse.Status,
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode == 200 {
|
||||
var v ModelsScheduleInfo
|
||||
err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
|
||||
if err != nil {
|
||||
newErr.error = err.Error()
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
newErr.model = v
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarReturnValue, localVarHttpResponse, nil
|
||||
}
|
||||
|
||||
/*
|
||||
ScheduleApiService
|
||||
Give a date, get the next date where there are at least on schedule. If no hours specified, will assume 00:00
|
||||
- @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
|
||||
- @param baseDate Base date
|
||||
|
||||
@return TimeTime
|
||||
*/
|
||||
func (a *ScheduleApiService) ScheduleControllerGetNextSchedule(ctx context.Context, baseDate interface{}) (TimeTime, *http.Response, error) {
|
||||
var (
|
||||
localVarHttpMethod = strings.ToUpper("Get")
|
||||
localVarPostBody interface{}
|
||||
localVarFileName string
|
||||
localVarFileBytes []byte
|
||||
localVarReturnValue TimeTime
|
||||
)
|
||||
|
||||
// create path and map variables
|
||||
localVarPath := a.client.cfg.BasePath + "/schedule/next"
|
||||
|
||||
localVarHeaderParams := make(map[string]string)
|
||||
localVarQueryParams := url.Values{}
|
||||
localVarFormParams := url.Values{}
|
||||
|
||||
localVarQueryParams.Add("baseDate", parameterToString(baseDate, ""))
|
||||
// to determine the Content-Type header
|
||||
localVarHttpContentTypes := []string{}
|
||||
|
||||
// set Content-Type header
|
||||
localVarHttpContentType := selectHeaderContentType(localVarHttpContentTypes)
|
||||
if localVarHttpContentType != "" {
|
||||
localVarHeaderParams["Content-Type"] = localVarHttpContentType
|
||||
}
|
||||
|
||||
// to determine the Accept header
|
||||
localVarHttpHeaderAccepts := []string{}
|
||||
|
||||
// set Accept header
|
||||
localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
|
||||
if localVarHttpHeaderAccept != "" {
|
||||
localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
|
||||
}
|
||||
r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
|
||||
if err != nil {
|
||||
return localVarReturnValue, nil, err
|
||||
}
|
||||
|
||||
localVarHttpResponse, err := a.client.callAPI(r)
|
||||
if err != nil || localVarHttpResponse == nil {
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
|
||||
localVarHttpResponse.Body.Close()
|
||||
if err != nil {
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode < 300 {
|
||||
// If we succeed, return the data, otherwise pass on to decode error.
|
||||
err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode >= 300 {
|
||||
newErr := GenericSwaggerError{
|
||||
body: localVarBody,
|
||||
error: localVarHttpResponse.Status,
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode == 200 {
|
||||
var v TimeTime
|
||||
err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
|
||||
if err != nil {
|
||||
newErr.error = err.Error()
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
newErr.model = v
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarReturnValue, localVarHttpResponse, nil
|
||||
}
|
||||
|
||||
/*
|
||||
ScheduleApiService
|
||||
Give a date, get the previous date where there are at least on schedule. If no hours specified, will assume 00:00
|
||||
- @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
|
||||
- @param baseDate Base date
|
||||
|
||||
@return TimeTime
|
||||
*/
|
||||
func (a *ScheduleApiService) ScheduleControllerGetPreviousSchedule(ctx context.Context, baseDate interface{}) (TimeTime, *http.Response, error) {
|
||||
var (
|
||||
localVarHttpMethod = strings.ToUpper("Get")
|
||||
localVarPostBody interface{}
|
||||
localVarFileName string
|
||||
localVarFileBytes []byte
|
||||
localVarReturnValue TimeTime
|
||||
)
|
||||
|
||||
// create path and map variables
|
||||
localVarPath := a.client.cfg.BasePath + "/schedule/previous"
|
||||
|
||||
localVarHeaderParams := make(map[string]string)
|
||||
localVarQueryParams := url.Values{}
|
||||
localVarFormParams := url.Values{}
|
||||
|
||||
localVarQueryParams.Add("baseDate", parameterToString(baseDate, ""))
|
||||
// to determine the Content-Type header
|
||||
localVarHttpContentTypes := []string{}
|
||||
|
||||
// set Content-Type header
|
||||
localVarHttpContentType := selectHeaderContentType(localVarHttpContentTypes)
|
||||
if localVarHttpContentType != "" {
|
||||
localVarHeaderParams["Content-Type"] = localVarHttpContentType
|
||||
}
|
||||
|
||||
// to determine the Accept header
|
||||
localVarHttpHeaderAccepts := []string{}
|
||||
|
||||
// set Accept header
|
||||
localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
|
||||
if localVarHttpHeaderAccept != "" {
|
||||
localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
|
||||
}
|
||||
r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
|
||||
if err != nil {
|
||||
return localVarReturnValue, nil, err
|
||||
}
|
||||
|
||||
localVarHttpResponse, err := a.client.callAPI(r)
|
||||
if err != nil || localVarHttpResponse == nil {
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
|
||||
localVarHttpResponse.Body.Close()
|
||||
if err != nil {
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode < 300 {
|
||||
// If we succeed, return the data, otherwise pass on to decode error.
|
||||
err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode >= 300 {
|
||||
newErr := GenericSwaggerError{
|
||||
body: localVarBody,
|
||||
error: localVarHttpResponse.Status,
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode == 200 {
|
||||
var v TimeTime
|
||||
err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
|
||||
if err != nil {
|
||||
newErr.error = err.Error()
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
newErr.model = v
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarReturnValue, localVarHttpResponse, nil
|
||||
}
|
||||
|
||||
/*
|
||||
ScheduleApiService
|
||||
Get a list of next startDates schedules (inclusive). If timezone is not specified, will assume UTC
|
||||
- @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
|
||||
- @param startDate Start date
|
||||
- @param stopDate End date
|
||||
|
||||
@return []ModelsScheduleDb
|
||||
*/
|
||||
func (a *ScheduleApiService) ScheduleControllerGetSchedules(ctx context.Context, startDate interface{}, stopDate interface{}) ([]ModelsScheduleDb, *http.Response, error) {
|
||||
var (
|
||||
localVarHttpMethod = strings.ToUpper("Get")
|
||||
localVarPostBody interface{}
|
||||
localVarFileName string
|
||||
localVarFileBytes []byte
|
||||
localVarReturnValue []ModelsScheduleDb
|
||||
)
|
||||
|
||||
// create path and map variables
|
||||
localVarPath := a.client.cfg.BasePath + "/schedule/"
|
||||
|
||||
localVarHeaderParams := make(map[string]string)
|
||||
localVarQueryParams := url.Values{}
|
||||
localVarFormParams := url.Values{}
|
||||
|
||||
localVarQueryParams.Add("startDate", parameterToString(startDate, ""))
|
||||
localVarQueryParams.Add("stopDate", parameterToString(stopDate, ""))
|
||||
// to determine the Content-Type header
|
||||
localVarHttpContentTypes := []string{}
|
||||
|
||||
// set Content-Type header
|
||||
localVarHttpContentType := selectHeaderContentType(localVarHttpContentTypes)
|
||||
if localVarHttpContentType != "" {
|
||||
localVarHeaderParams["Content-Type"] = localVarHttpContentType
|
||||
}
|
||||
|
||||
// to determine the Accept header
|
||||
localVarHttpHeaderAccepts := []string{}
|
||||
|
||||
// set Accept header
|
||||
localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
|
||||
if localVarHttpHeaderAccept != "" {
|
||||
localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
|
||||
}
|
||||
r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
|
||||
if err != nil {
|
||||
return localVarReturnValue, nil, err
|
||||
}
|
||||
|
||||
localVarHttpResponse, err := a.client.callAPI(r)
|
||||
if err != nil || localVarHttpResponse == nil {
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
|
||||
localVarHttpResponse.Body.Close()
|
||||
if err != nil {
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode < 300 {
|
||||
// If we succeed, return the data, otherwise pass on to decode error.
|
||||
err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode >= 300 {
|
||||
newErr := GenericSwaggerError{
|
||||
body: localVarBody,
|
||||
error: localVarHttpResponse.Status,
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode == 200 {
|
||||
var v []ModelsScheduleDb
|
||||
err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
|
||||
if err != nil {
|
||||
newErr.error = err.Error()
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
newErr.model = v
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarReturnValue, localVarHttpResponse, nil
|
||||
}
|
113
selfapi/api_search.go
Normal file
@ -0,0 +1,113 @@
|
||||
/*
|
||||
* oc-catalog API
|
||||
*
|
||||
* Backend of the oc-search project
|
||||
*
|
||||
* API version: 1.0.0
|
||||
* Contact: opencloud@irt-saintexupery.com
|
||||
* Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
|
||||
*/
|
||||
|
||||
package swagger
|
||||
|
||||
import (
|
||||
"context"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Linger please
|
||||
var (
|
||||
_ context.Context
|
||||
)
|
||||
|
||||
type SearchApiService service
|
||||
|
||||
/*
|
||||
SearchApiService
|
||||
find resources by word
|
||||
- @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
|
||||
- @param word Word to search across all resources
|
||||
|
||||
@return ModelsSearchResult
|
||||
*/
|
||||
func (a *SearchApiService) SearchControllerSearchByWord(ctx context.Context, word string) (ModelsSearchResult, *http.Response, error) {
|
||||
var (
|
||||
localVarHttpMethod = strings.ToUpper("Get")
|
||||
localVarPostBody interface{}
|
||||
localVarFileName string
|
||||
localVarFileBytes []byte
|
||||
localVarReturnValue ModelsSearchResult
|
||||
)
|
||||
|
||||
// create path and map variables
|
||||
localVarPath := a.client.cfg.BasePath + "/search/byWord"
|
||||
|
||||
localVarHeaderParams := make(map[string]string)
|
||||
localVarQueryParams := url.Values{}
|
||||
localVarFormParams := url.Values{}
|
||||
|
||||
localVarQueryParams.Add("word", parameterToString(word, ""))
|
||||
// to determine the Content-Type header
|
||||
localVarHttpContentTypes := []string{}
|
||||
|
||||
// set Content-Type header
|
||||
localVarHttpContentType := selectHeaderContentType(localVarHttpContentTypes)
|
||||
if localVarHttpContentType != "" {
|
||||
localVarHeaderParams["Content-Type"] = localVarHttpContentType
|
||||
}
|
||||
|
||||
// to determine the Accept header
|
||||
localVarHttpHeaderAccepts := []string{}
|
||||
|
||||
// set Accept header
|
||||
localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
|
||||
if localVarHttpHeaderAccept != "" {
|
||||
localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
|
||||
}
|
||||
r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
|
||||
if err != nil {
|
||||
return localVarReturnValue, nil, err
|
||||
}
|
||||
|
||||
localVarHttpResponse, err := a.client.callAPI(r)
|
||||
if err != nil || localVarHttpResponse == nil {
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
|
||||
localVarHttpResponse.Body.Close()
|
||||
if err != nil {
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode < 300 {
|
||||
// If we succeed, return the data, otherwise pass on to decode error.
|
||||
err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode >= 300 {
|
||||
newErr := GenericSwaggerError{
|
||||
body: localVarBody,
|
||||
error: localVarHttpResponse.Status,
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode == 200 {
|
||||
var v ModelsSearchResult
|
||||
err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
|
||||
if err != nil {
|
||||
newErr.error = err.Error()
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
newErr.model = v
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarReturnValue, localVarHttpResponse, nil
|
||||
}
|
269
selfapi/api_storage.go
Normal file
@ -0,0 +1,269 @@
|
||||
/*
|
||||
* oc-catalog API
|
||||
*
|
||||
* Backend of the oc-search project
|
||||
*
|
||||
* API version: 1.0.0
|
||||
* Contact: opencloud@irt-saintexupery.com
|
||||
* Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
|
||||
*/
|
||||
|
||||
package swagger
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Linger please
|
||||
var (
|
||||
_ context.Context
|
||||
)
|
||||
|
||||
type StorageApiService service
|
||||
|
||||
/*
|
||||
StorageApiService
|
||||
submit storage object
|
||||
- @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
|
||||
- @param body The object content
|
||||
*/
|
||||
func (a *StorageApiService) StorageControllerCreateStorage(ctx context.Context, body ModelsStorageNewModel) (*http.Response, error) {
|
||||
var (
|
||||
localVarHttpMethod = strings.ToUpper("Post")
|
||||
localVarPostBody interface{}
|
||||
localVarFileName string
|
||||
localVarFileBytes []byte
|
||||
)
|
||||
|
||||
// create path and map variables
|
||||
localVarPath := a.client.cfg.BasePath + "/storage/"
|
||||
|
||||
localVarHeaderParams := make(map[string]string)
|
||||
localVarQueryParams := url.Values{}
|
||||
localVarFormParams := url.Values{}
|
||||
|
||||
// to determine the Content-Type header
|
||||
localVarHttpContentTypes := []string{}
|
||||
|
||||
// set Content-Type header
|
||||
localVarHttpContentType := selectHeaderContentType(localVarHttpContentTypes)
|
||||
if localVarHttpContentType != "" {
|
||||
localVarHeaderParams["Content-Type"] = localVarHttpContentType
|
||||
}
|
||||
|
||||
// to determine the Accept header
|
||||
localVarHttpHeaderAccepts := []string{}
|
||||
|
||||
// set Accept header
|
||||
localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
|
||||
if localVarHttpHeaderAccept != "" {
|
||||
localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
|
||||
}
|
||||
// body params
|
||||
localVarPostBody = &body
|
||||
r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
localVarHttpResponse, err := a.client.callAPI(r)
|
||||
if err != nil || localVarHttpResponse == nil {
|
||||
return localVarHttpResponse, err
|
||||
}
|
||||
|
||||
localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
|
||||
localVarHttpResponse.Body.Close()
|
||||
if err != nil {
|
||||
return localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode >= 300 {
|
||||
newErr := GenericSwaggerError{
|
||||
body: localVarBody,
|
||||
error: localVarHttpResponse.Status,
|
||||
}
|
||||
|
||||
return localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarHttpResponse, nil
|
||||
}
|
||||
|
||||
/*
|
||||
StorageApiService
|
||||
find storage by ID
|
||||
- @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
|
||||
- @param iD the ID you want to get
|
||||
|
||||
@return ModelsStorageModel
|
||||
*/
|
||||
func (a *StorageApiService) StorageControllerGet(ctx context.Context, iD string) (ModelsStorageModel, *http.Response, error) {
|
||||
var (
|
||||
localVarHttpMethod = strings.ToUpper("Get")
|
||||
localVarPostBody interface{}
|
||||
localVarFileName string
|
||||
localVarFileBytes []byte
|
||||
localVarReturnValue ModelsStorageModel
|
||||
)
|
||||
|
||||
// create path and map variables
|
||||
localVarPath := a.client.cfg.BasePath + "/storage/{ID}"
|
||||
localVarPath = strings.Replace(localVarPath, "{"+"ID"+"}", fmt.Sprintf("%v", iD), -1)
|
||||
|
||||
localVarHeaderParams := make(map[string]string)
|
||||
localVarQueryParams := url.Values{}
|
||||
localVarFormParams := url.Values{}
|
||||
|
||||
// to determine the Content-Type header
|
||||
localVarHttpContentTypes := []string{}
|
||||
|
||||
// set Content-Type header
|
||||
localVarHttpContentType := selectHeaderContentType(localVarHttpContentTypes)
|
||||
if localVarHttpContentType != "" {
|
||||
localVarHeaderParams["Content-Type"] = localVarHttpContentType
|
||||
}
|
||||
|
||||
// to determine the Accept header
|
||||
localVarHttpHeaderAccepts := []string{}
|
||||
|
||||
// set Accept header
|
||||
localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
|
||||
if localVarHttpHeaderAccept != "" {
|
||||
localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
|
||||
}
|
||||
r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
|
||||
if err != nil {
|
||||
return localVarReturnValue, nil, err
|
||||
}
|
||||
|
||||
localVarHttpResponse, err := a.client.callAPI(r)
|
||||
if err != nil || localVarHttpResponse == nil {
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
|
||||
localVarHttpResponse.Body.Close()
|
||||
if err != nil {
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode < 300 {
|
||||
// If we succeed, return the data, otherwise pass on to decode error.
|
||||
err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode >= 300 {
|
||||
newErr := GenericSwaggerError{
|
||||
body: localVarBody,
|
||||
error: localVarHttpResponse.Status,
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode == 200 {
|
||||
var v ModelsStorageModel
|
||||
err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
|
||||
if err != nil {
|
||||
newErr.error = err.Error()
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
newErr.model = v
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarReturnValue, localVarHttpResponse, nil
|
||||
}
|
||||
|
||||
/*
|
||||
StorageApiService
|
||||
Return Storage objects if found in the DB. Not found IDs will be ignored
|
||||
- @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
|
||||
- @param iDs List of storage IDs
|
||||
|
||||
@return []ModelsComputingModel
|
||||
*/
|
||||
func (a *StorageApiService) StorageControllerGetMultipleStoragesByIDs(ctx context.Context, iDs []string) ([]ModelsComputingModel, *http.Response, error) {
|
||||
var (
|
||||
localVarHttpMethod = strings.ToUpper("Get")
|
||||
localVarPostBody interface{}
|
||||
localVarFileName string
|
||||
localVarFileBytes []byte
|
||||
localVarReturnValue []ModelsComputingModel
|
||||
)
|
||||
|
||||
// create path and map variables
|
||||
localVarPath := a.client.cfg.BasePath + "/storage/multi/{IDs}"
|
||||
localVarPath = strings.Replace(localVarPath, "{"+"IDs"+"}", fmt.Sprintf("%v", iDs), -1)
|
||||
|
||||
localVarHeaderParams := make(map[string]string)
|
||||
localVarQueryParams := url.Values{}
|
||||
localVarFormParams := url.Values{}
|
||||
|
||||
// to determine the Content-Type header
|
||||
localVarHttpContentTypes := []string{}
|
||||
|
||||
// set Content-Type header
|
||||
localVarHttpContentType := selectHeaderContentType(localVarHttpContentTypes)
|
||||
if localVarHttpContentType != "" {
|
||||
localVarHeaderParams["Content-Type"] = localVarHttpContentType
|
||||
}
|
||||
|
||||
// to determine the Accept header
|
||||
localVarHttpHeaderAccepts := []string{}
|
||||
|
||||
// set Accept header
|
||||
localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
|
||||
if localVarHttpHeaderAccept != "" {
|
||||
localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
|
||||
}
|
||||
r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
|
||||
if err != nil {
|
||||
return localVarReturnValue, nil, err
|
||||
}
|
||||
|
||||
localVarHttpResponse, err := a.client.callAPI(r)
|
||||
if err != nil || localVarHttpResponse == nil {
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
|
||||
localVarHttpResponse.Body.Close()
|
||||
if err != nil {
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode < 300 {
|
||||
// If we succeed, return the data, otherwise pass on to decode error.
|
||||
err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode >= 300 {
|
||||
newErr := GenericSwaggerError{
|
||||
body: localVarBody,
|
||||
error: localVarHttpResponse.Status,
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode == 200 {
|
||||
var v []ModelsComputingModel
|
||||
err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
|
||||
if err != nil {
|
||||
newErr.error = err.Error()
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
newErr.model = v
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarReturnValue, localVarHttpResponse, nil
|
||||
}
|
160
selfapi/api_user.go
Normal file
@ -0,0 +1,160 @@
|
||||
/*
|
||||
* oc-catalog API
|
||||
*
|
||||
* Backend of the oc-search project
|
||||
*
|
||||
* API version: 1.0.0
|
||||
* Contact: opencloud@irt-saintexupery.com
|
||||
* Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
|
||||
*/
|
||||
|
||||
package swagger
|
||||
|
||||
import (
|
||||
"context"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Linger please
|
||||
var (
|
||||
_ context.Context
|
||||
)
|
||||
|
||||
type UserApiService service
|
||||
|
||||
/*
|
||||
UserApiService
|
||||
Logs user into the system
|
||||
- @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
|
||||
- @param username The username for login
|
||||
- @param password The password for login
|
||||
*/
|
||||
func (a *UserApiService) UserControllerLogin(ctx context.Context, username string, password string) (*http.Response, error) {
|
||||
var (
|
||||
localVarHttpMethod = strings.ToUpper("Get")
|
||||
localVarPostBody interface{}
|
||||
localVarFileName string
|
||||
localVarFileBytes []byte
|
||||
)
|
||||
|
||||
// create path and map variables
|
||||
localVarPath := a.client.cfg.BasePath + "/user/login"
|
||||
|
||||
localVarHeaderParams := make(map[string]string)
|
||||
localVarQueryParams := url.Values{}
|
||||
localVarFormParams := url.Values{}
|
||||
|
||||
localVarQueryParams.Add("username", parameterToString(username, ""))
|
||||
localVarQueryParams.Add("password", parameterToString(password, ""))
|
||||
// to determine the Content-Type header
|
||||
localVarHttpContentTypes := []string{}
|
||||
|
||||
// set Content-Type header
|
||||
localVarHttpContentType := selectHeaderContentType(localVarHttpContentTypes)
|
||||
if localVarHttpContentType != "" {
|
||||
localVarHeaderParams["Content-Type"] = localVarHttpContentType
|
||||
}
|
||||
|
||||
// to determine the Accept header
|
||||
localVarHttpHeaderAccepts := []string{}
|
||||
|
||||
// set Accept header
|
||||
localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
|
||||
if localVarHttpHeaderAccept != "" {
|
||||
localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
|
||||
}
|
||||
r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
localVarHttpResponse, err := a.client.callAPI(r)
|
||||
if err != nil || localVarHttpResponse == nil {
|
||||
return localVarHttpResponse, err
|
||||
}
|
||||
|
||||
localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
|
||||
localVarHttpResponse.Body.Close()
|
||||
if err != nil {
|
||||
return localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode >= 300 {
|
||||
newErr := GenericSwaggerError{
|
||||
body: localVarBody,
|
||||
error: localVarHttpResponse.Status,
|
||||
}
|
||||
|
||||
return localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarHttpResponse, nil
|
||||
}
|
||||
|
||||
/*
|
||||
UserApiService
|
||||
Logs out current logged in user session
|
||||
- @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
|
||||
*/
|
||||
func (a *UserApiService) UserControllerLogout(ctx context.Context) (*http.Response, error) {
|
||||
var (
|
||||
localVarHttpMethod = strings.ToUpper("Get")
|
||||
localVarPostBody interface{}
|
||||
localVarFileName string
|
||||
localVarFileBytes []byte
|
||||
)
|
||||
|
||||
// create path and map variables
|
||||
localVarPath := a.client.cfg.BasePath + "/user/logout"
|
||||
|
||||
localVarHeaderParams := make(map[string]string)
|
||||
localVarQueryParams := url.Values{}
|
||||
localVarFormParams := url.Values{}
|
||||
|
||||
// to determine the Content-Type header
|
||||
localVarHttpContentTypes := []string{}
|
||||
|
||||
// set Content-Type header
|
||||
localVarHttpContentType := selectHeaderContentType(localVarHttpContentTypes)
|
||||
if localVarHttpContentType != "" {
|
||||
localVarHeaderParams["Content-Type"] = localVarHttpContentType
|
||||
}
|
||||
|
||||
// to determine the Accept header
|
||||
localVarHttpHeaderAccepts := []string{}
|
||||
|
||||
// set Accept header
|
||||
localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
|
||||
if localVarHttpHeaderAccept != "" {
|
||||
localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
|
||||
}
|
||||
r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
localVarHttpResponse, err := a.client.callAPI(r)
|
||||
if err != nil || localVarHttpResponse == nil {
|
||||
return localVarHttpResponse, err
|
||||
}
|
||||
|
||||
localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
|
||||
localVarHttpResponse.Body.Close()
|
||||
if err != nil {
|
||||
return localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode >= 300 {
|
||||
newErr := GenericSwaggerError{
|
||||
body: localVarBody,
|
||||
error: localVarHttpResponse.Status,
|
||||
}
|
||||
|
||||
return localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarHttpResponse, nil
|
||||
}
|
901
selfapi/api_workflow.go
Normal file
@ -0,0 +1,901 @@
|
||||
/*
|
||||
* oc-catalog API
|
||||
*
|
||||
* Backend of the oc-search project
|
||||
*
|
||||
* API version: 1.0.0
|
||||
* Contact: opencloud@irt-saintexupery.com
|
||||
* Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
|
||||
*/
|
||||
|
||||
package swagger
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"strings"
|
||||
|
||||
"github.com/antihax/optional"
|
||||
)
|
||||
|
||||
// Linger please
|
||||
var (
|
||||
_ context.Context
|
||||
)
|
||||
|
||||
type WorkflowApiService service
|
||||
|
||||
/*
|
||||
WorkflowApiService
|
||||
Create a Rtype object from already added resources to the workspace
|
||||
- @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
|
||||
- @param workflowName workflow Name
|
||||
- @param rID rID of already existing item in Workspace
|
||||
*/
|
||||
func (a *WorkflowApiService) WorkflowControllerAddNewObjectToAWorkflow(ctx context.Context, workflowName string, rID string) (*http.Response, error) {
|
||||
var (
|
||||
localVarHttpMethod = strings.ToUpper("Post")
|
||||
localVarPostBody interface{}
|
||||
localVarFileName string
|
||||
localVarFileBytes []byte
|
||||
)
|
||||
|
||||
// create path and map variables
|
||||
localVarPath := a.client.cfg.BasePath + "/workflow/{workflowName}/add"
|
||||
localVarPath = strings.Replace(localVarPath, "{"+"workflowName"+"}", fmt.Sprintf("%v", workflowName), -1)
|
||||
|
||||
localVarHeaderParams := make(map[string]string)
|
||||
localVarQueryParams := url.Values{}
|
||||
localVarFormParams := url.Values{}
|
||||
|
||||
localVarQueryParams.Add("rID", parameterToString(rID, ""))
|
||||
// to determine the Content-Type header
|
||||
localVarHttpContentTypes := []string{}
|
||||
|
||||
// set Content-Type header
|
||||
localVarHttpContentType := selectHeaderContentType(localVarHttpContentTypes)
|
||||
if localVarHttpContentType != "" {
|
||||
localVarHeaderParams["Content-Type"] = localVarHttpContentType
|
||||
}
|
||||
|
||||
// to determine the Accept header
|
||||
localVarHttpHeaderAccepts := []string{}
|
||||
|
||||
// set Accept header
|
||||
localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
|
||||
if localVarHttpHeaderAccept != "" {
|
||||
localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
|
||||
}
|
||||
r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
localVarHttpResponse, err := a.client.callAPI(r)
|
||||
if err != nil || localVarHttpResponse == nil {
|
||||
return localVarHttpResponse, err
|
||||
}
|
||||
|
||||
localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
|
||||
localVarHttpResponse.Body.Close()
|
||||
if err != nil {
|
||||
return localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode >= 300 {
|
||||
newErr := GenericSwaggerError{
|
||||
body: localVarBody,
|
||||
error: localVarHttpResponse.Status,
|
||||
}
|
||||
|
||||
return localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarHttpResponse, nil
|
||||
}
|
||||
|
||||
/*
|
||||
WorkflowApiService
|
||||
Book a schedule in all DCs of the workflow. Must set a desired schedule first!
|
||||
- @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
|
||||
- @param workflowName Workflow Name
|
||||
|
||||
@return []ModelsDCstatus
|
||||
*/
|
||||
func (a *WorkflowApiService) WorkflowControllerBookSchedule(ctx context.Context, workflowName string) ([]ModelsDCstatus, *http.Response, error) {
|
||||
var (
|
||||
localVarHttpMethod = strings.ToUpper("Post")
|
||||
localVarPostBody interface{}
|
||||
localVarFileName string
|
||||
localVarFileBytes []byte
|
||||
localVarReturnValue []ModelsDCstatus
|
||||
)
|
||||
|
||||
// create path and map variables
|
||||
localVarPath := a.client.cfg.BasePath + "/workflow/{workflowName}/schedule/book"
|
||||
localVarPath = strings.Replace(localVarPath, "{"+"workflowName"+"}", fmt.Sprintf("%v", workflowName), -1)
|
||||
|
||||
localVarHeaderParams := make(map[string]string)
|
||||
localVarQueryParams := url.Values{}
|
||||
localVarFormParams := url.Values{}
|
||||
|
||||
// to determine the Content-Type header
|
||||
localVarHttpContentTypes := []string{}
|
||||
|
||||
// set Content-Type header
|
||||
localVarHttpContentType := selectHeaderContentType(localVarHttpContentTypes)
|
||||
if localVarHttpContentType != "" {
|
||||
localVarHeaderParams["Content-Type"] = localVarHttpContentType
|
||||
}
|
||||
|
||||
// to determine the Accept header
|
||||
localVarHttpHeaderAccepts := []string{}
|
||||
|
||||
// set Accept header
|
||||
localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
|
||||
if localVarHttpHeaderAccept != "" {
|
||||
localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
|
||||
}
|
||||
r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
|
||||
if err != nil {
|
||||
return localVarReturnValue, nil, err
|
||||
}
|
||||
|
||||
localVarHttpResponse, err := a.client.callAPI(r)
|
||||
if err != nil || localVarHttpResponse == nil {
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
|
||||
localVarHttpResponse.Body.Close()
|
||||
if err != nil {
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode < 300 {
|
||||
// If we succeed, return the data, otherwise pass on to decode error.
|
||||
err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode >= 300 {
|
||||
newErr := GenericSwaggerError{
|
||||
body: localVarBody,
|
||||
error: localVarHttpResponse.Status,
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode == 200 {
|
||||
var v []ModelsDCstatus
|
||||
err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
|
||||
if err != nil {
|
||||
newErr.error = err.Error()
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
newErr.model = v
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarReturnValue, localVarHttpResponse, nil
|
||||
}
|
||||
|
||||
/*
|
||||
WorkflowApiService
|
||||
Check if we can schedule the project in other DCs. Must set a desired schedule first!
|
||||
- @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
|
||||
- @param workflowName Workflow Name
|
||||
|
||||
@return []ModelsDCstatus
|
||||
*/
|
||||
func (a *WorkflowApiService) WorkflowControllerCheckSchedule(ctx context.Context, workflowName string) ([]ModelsDCstatus, *http.Response, error) {
|
||||
var (
|
||||
localVarHttpMethod = strings.ToUpper("Get")
|
||||
localVarPostBody interface{}
|
||||
localVarFileName string
|
||||
localVarFileBytes []byte
|
||||
localVarReturnValue []ModelsDCstatus
|
||||
)
|
||||
|
||||
// create path and map variables
|
||||
localVarPath := a.client.cfg.BasePath + "/workflow/{workflowName}/schedule/check"
|
||||
localVarPath = strings.Replace(localVarPath, "{"+"workflowName"+"}", fmt.Sprintf("%v", workflowName), -1)
|
||||
|
||||
localVarHeaderParams := make(map[string]string)
|
||||
localVarQueryParams := url.Values{}
|
||||
localVarFormParams := url.Values{}
|
||||
|
||||
// to determine the Content-Type header
|
||||
localVarHttpContentTypes := []string{}
|
||||
|
||||
// set Content-Type header
|
||||
localVarHttpContentType := selectHeaderContentType(localVarHttpContentTypes)
|
||||
if localVarHttpContentType != "" {
|
||||
localVarHeaderParams["Content-Type"] = localVarHttpContentType
|
||||
}
|
||||
|
||||
// to determine the Accept header
|
||||
localVarHttpHeaderAccepts := []string{}
|
||||
|
||||
// set Accept header
|
||||
localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
|
||||
if localVarHttpHeaderAccept != "" {
|
||||
localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
|
||||
}
|
||||
r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
|
||||
if err != nil {
|
||||
return localVarReturnValue, nil, err
|
||||
}
|
||||
|
||||
localVarHttpResponse, err := a.client.callAPI(r)
|
||||
if err != nil || localVarHttpResponse == nil {
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
|
||||
localVarHttpResponse.Body.Close()
|
||||
if err != nil {
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode < 300 {
|
||||
// If we succeed, return the data, otherwise pass on to decode error.
|
||||
err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode >= 300 {
|
||||
newErr := GenericSwaggerError{
|
||||
body: localVarBody,
|
||||
error: localVarHttpResponse.Status,
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode == 200 {
|
||||
var v []ModelsDCstatus
|
||||
err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
|
||||
if err != nil {
|
||||
newErr.error = err.Error()
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
newErr.model = v
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarReturnValue, localVarHttpResponse, nil
|
||||
}
|
||||
|
||||
/*
|
||||
WorkflowApiService
|
||||
Create a name for the new workflow
|
||||
- @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
|
||||
- @param workflowName Name of the workflow
|
||||
*/
|
||||
func (a *WorkflowApiService) WorkflowControllerCreateANewWorkflow(ctx context.Context, workflowName string) (*http.Response, error) {
|
||||
var (
|
||||
localVarHttpMethod = strings.ToUpper("Post")
|
||||
localVarPostBody interface{}
|
||||
localVarFileName string
|
||||
localVarFileBytes []byte
|
||||
)
|
||||
|
||||
// create path and map variables
|
||||
localVarPath := a.client.cfg.BasePath + "/workflow/"
|
||||
|
||||
localVarHeaderParams := make(map[string]string)
|
||||
localVarQueryParams := url.Values{}
|
||||
localVarFormParams := url.Values{}
|
||||
|
||||
localVarQueryParams.Add("workflowName", parameterToString(workflowName, ""))
|
||||
// to determine the Content-Type header
|
||||
localVarHttpContentTypes := []string{}
|
||||
|
||||
// set Content-Type header
|
||||
localVarHttpContentType := selectHeaderContentType(localVarHttpContentTypes)
|
||||
if localVarHttpContentType != "" {
|
||||
localVarHeaderParams["Content-Type"] = localVarHttpContentType
|
||||
}
|
||||
|
||||
// to determine the Accept header
|
||||
localVarHttpHeaderAccepts := []string{}
|
||||
|
||||
// set Accept header
|
||||
localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
|
||||
if localVarHttpHeaderAccept != "" {
|
||||
localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
|
||||
}
|
||||
r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
localVarHttpResponse, err := a.client.callAPI(r)
|
||||
if err != nil || localVarHttpResponse == nil {
|
||||
return localVarHttpResponse, err
|
||||
}
|
||||
|
||||
localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
|
||||
localVarHttpResponse.Body.Close()
|
||||
if err != nil {
|
||||
return localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode >= 300 {
|
||||
newErr := GenericSwaggerError{
|
||||
body: localVarBody,
|
||||
error: localVarHttpResponse.Status,
|
||||
}
|
||||
|
||||
return localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarHttpResponse, nil
|
||||
}
|
||||
|
||||
/*
|
||||
WorkflowApiService
|
||||
Create a Rtype object from already added resources to the workspace
|
||||
- @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
|
||||
- @param workflowName Workflow Name
|
||||
- @param rObjIDsource Robject source. Usually Data
|
||||
- @param isInput If the operation is for input (true) linkage or output (false)
|
||||
- @param rObjIDtarger Robject where will be written the association
|
||||
*/
|
||||
func (a *WorkflowApiService) WorkflowControllerCreateARealtionshipBetweenTwoRobjects(ctx context.Context, workflowName string, rObjIDsource string, isInput bool, rObjIDtarger string) (*http.Response, error) {
|
||||
var (
|
||||
localVarHttpMethod = strings.ToUpper("Post")
|
||||
localVarPostBody interface{}
|
||||
localVarFileName string
|
||||
localVarFileBytes []byte
|
||||
)
|
||||
|
||||
// create path and map variables
|
||||
localVarPath := a.client.cfg.BasePath + "/workflow/{workflowName}/link"
|
||||
localVarPath = strings.Replace(localVarPath, "{"+"workflowName"+"}", fmt.Sprintf("%v", workflowName), -1)
|
||||
|
||||
localVarHeaderParams := make(map[string]string)
|
||||
localVarQueryParams := url.Values{}
|
||||
localVarFormParams := url.Values{}
|
||||
|
||||
localVarQueryParams.Add("rObjIDsource", parameterToString(rObjIDsource, ""))
|
||||
localVarQueryParams.Add("isInput", parameterToString(isInput, ""))
|
||||
localVarQueryParams.Add("rObjIDtarger", parameterToString(rObjIDtarger, ""))
|
||||
// to determine the Content-Type header
|
||||
localVarHttpContentTypes := []string{}
|
||||
|
||||
// set Content-Type header
|
||||
localVarHttpContentType := selectHeaderContentType(localVarHttpContentTypes)
|
||||
if localVarHttpContentType != "" {
|
||||
localVarHeaderParams["Content-Type"] = localVarHttpContentType
|
||||
}
|
||||
|
||||
// to determine the Accept header
|
||||
localVarHttpHeaderAccepts := []string{}
|
||||
|
||||
// set Accept header
|
||||
localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
|
||||
if localVarHttpHeaderAccept != "" {
|
||||
localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
|
||||
}
|
||||
r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
localVarHttpResponse, err := a.client.callAPI(r)
|
||||
if err != nil || localVarHttpResponse == nil {
|
||||
return localVarHttpResponse, err
|
||||
}
|
||||
|
||||
localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
|
||||
localVarHttpResponse.Body.Close()
|
||||
if err != nil {
|
||||
return localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode >= 300 {
|
||||
newErr := GenericSwaggerError{
|
||||
body: localVarBody,
|
||||
error: localVarHttpResponse.Status,
|
||||
}
|
||||
|
||||
return localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarHttpResponse, nil
|
||||
}
|
||||
|
||||
/*
|
||||
WorkflowApiService
|
||||
Obtain the last mxgraph XML status from the workflow
|
||||
- @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
|
||||
- @param workflowName Workflow Name
|
||||
*/
|
||||
func (a *WorkflowApiService) WorkflowControllerGetMxGraphLastStatus(ctx context.Context, workflowName string) (*http.Response, error) {
|
||||
var (
|
||||
localVarHttpMethod = strings.ToUpper("Get")
|
||||
localVarPostBody interface{}
|
||||
localVarFileName string
|
||||
localVarFileBytes []byte
|
||||
)
|
||||
|
||||
// create path and map variables
|
||||
localVarPath := a.client.cfg.BasePath + "/workflow/{workflowName}/mxGraphParser"
|
||||
localVarPath = strings.Replace(localVarPath, "{"+"workflowName"+"}", fmt.Sprintf("%v", workflowName), -1)
|
||||
|
||||
localVarHeaderParams := make(map[string]string)
|
||||
localVarQueryParams := url.Values{}
|
||||
localVarFormParams := url.Values{}
|
||||
|
||||
// to determine the Content-Type header
|
||||
localVarHttpContentTypes := []string{}
|
||||
|
||||
// set Content-Type header
|
||||
localVarHttpContentType := selectHeaderContentType(localVarHttpContentTypes)
|
||||
if localVarHttpContentType != "" {
|
||||
localVarHeaderParams["Content-Type"] = localVarHttpContentType
|
||||
}
|
||||
|
||||
// to determine the Accept header
|
||||
localVarHttpHeaderAccepts := []string{}
|
||||
|
||||
// set Accept header
|
||||
localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
|
||||
if localVarHttpHeaderAccept != "" {
|
||||
localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
|
||||
}
|
||||
r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
localVarHttpResponse, err := a.client.callAPI(r)
|
||||
if err != nil || localVarHttpResponse == nil {
|
||||
return localVarHttpResponse, err
|
||||
}
|
||||
|
||||
localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
|
||||
localVarHttpResponse.Body.Close()
|
||||
if err != nil {
|
||||
return localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode >= 300 {
|
||||
newErr := GenericSwaggerError{
|
||||
body: localVarBody,
|
||||
error: localVarHttpResponse.Status,
|
||||
}
|
||||
|
||||
return localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarHttpResponse, nil
|
||||
}
|
||||
|
||||
/*
|
||||
WorkflowApiService
|
||||
Obtain the desired schedule of this workflow
|
||||
- @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
|
||||
- @param workflowName Workflow Name
|
||||
|
||||
@return ModelsScheduleTime
|
||||
*/
|
||||
func (a *WorkflowApiService) WorkflowControllerGetSchedule(ctx context.Context, workflowName string) (ModelsScheduleTime, *http.Response, error) {
|
||||
var (
|
||||
localVarHttpMethod = strings.ToUpper("Get")
|
||||
localVarPostBody interface{}
|
||||
localVarFileName string
|
||||
localVarFileBytes []byte
|
||||
localVarReturnValue ModelsScheduleTime
|
||||
)
|
||||
|
||||
// create path and map variables
|
||||
localVarPath := a.client.cfg.BasePath + "/workflow/{workflowName}/schedule"
|
||||
localVarPath = strings.Replace(localVarPath, "{"+"workflowName"+"}", fmt.Sprintf("%v", workflowName), -1)
|
||||
|
||||
localVarHeaderParams := make(map[string]string)
|
||||
localVarQueryParams := url.Values{}
|
||||
localVarFormParams := url.Values{}
|
||||
|
||||
// to determine the Content-Type header
|
||||
localVarHttpContentTypes := []string{}
|
||||
|
||||
// set Content-Type header
|
||||
localVarHttpContentType := selectHeaderContentType(localVarHttpContentTypes)
|
||||
if localVarHttpContentType != "" {
|
||||
localVarHeaderParams["Content-Type"] = localVarHttpContentType
|
||||
}
|
||||
|
||||
// to determine the Accept header
|
||||
localVarHttpHeaderAccepts := []string{}
|
||||
|
||||
// set Accept header
|
||||
localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
|
||||
if localVarHttpHeaderAccept != "" {
|
||||
localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
|
||||
}
|
||||
r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
|
||||
if err != nil {
|
||||
return localVarReturnValue, nil, err
|
||||
}
|
||||
|
||||
localVarHttpResponse, err := a.client.callAPI(r)
|
||||
if err != nil || localVarHttpResponse == nil {
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
|
||||
localVarHttpResponse.Body.Close()
|
||||
if err != nil {
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode < 300 {
|
||||
// If we succeed, return the data, otherwise pass on to decode error.
|
||||
err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode >= 300 {
|
||||
newErr := GenericSwaggerError{
|
||||
body: localVarBody,
|
||||
error: localVarHttpResponse.Status,
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode == 200 {
|
||||
var v ModelsScheduleTime
|
||||
err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
|
||||
if err != nil {
|
||||
newErr.error = err.Error()
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
newErr.model = v
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarReturnValue, localVarHttpResponse, nil
|
||||
}
|
||||
|
||||
/*
|
||||
WorkflowApiService
|
||||
Get a workflow by name
|
||||
- @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
|
||||
- @param workflowName Workflow Name
|
||||
|
||||
@return ModelsWorkflow
|
||||
*/
|
||||
func (a *WorkflowApiService) WorkflowControllerGetWorkflow(ctx context.Context, workflowName string) (ModelsWorkflow, *http.Response, error) {
|
||||
var (
|
||||
localVarHttpMethod = strings.ToUpper("Get")
|
||||
localVarPostBody interface{}
|
||||
localVarFileName string
|
||||
localVarFileBytes []byte
|
||||
localVarReturnValue ModelsWorkflow
|
||||
)
|
||||
|
||||
// create path and map variables
|
||||
localVarPath := a.client.cfg.BasePath + "/workflow/{workflowName}"
|
||||
localVarPath = strings.Replace(localVarPath, "{"+"workflowName"+"}", fmt.Sprintf("%v", workflowName), -1)
|
||||
|
||||
localVarHeaderParams := make(map[string]string)
|
||||
localVarQueryParams := url.Values{}
|
||||
localVarFormParams := url.Values{}
|
||||
|
||||
// to determine the Content-Type header
|
||||
localVarHttpContentTypes := []string{}
|
||||
|
||||
// set Content-Type header
|
||||
localVarHttpContentType := selectHeaderContentType(localVarHttpContentTypes)
|
||||
if localVarHttpContentType != "" {
|
||||
localVarHeaderParams["Content-Type"] = localVarHttpContentType
|
||||
}
|
||||
|
||||
// to determine the Accept header
|
||||
localVarHttpHeaderAccepts := []string{}
|
||||
|
||||
// set Accept header
|
||||
localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
|
||||
if localVarHttpHeaderAccept != "" {
|
||||
localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
|
||||
}
|
||||
r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
|
||||
if err != nil {
|
||||
return localVarReturnValue, nil, err
|
||||
}
|
||||
|
||||
localVarHttpResponse, err := a.client.callAPI(r)
|
||||
if err != nil || localVarHttpResponse == nil {
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
|
||||
localVarHttpResponse.Body.Close()
|
||||
if err != nil {
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode < 300 {
|
||||
// If we succeed, return the data, otherwise pass on to decode error.
|
||||
err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode >= 300 {
|
||||
newErr := GenericSwaggerError{
|
||||
body: localVarBody,
|
||||
error: localVarHttpResponse.Status,
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode == 200 {
|
||||
var v ModelsWorkflow
|
||||
err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
|
||||
if err != nil {
|
||||
newErr.error = err.Error()
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
newErr.model = v
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarReturnValue, localVarHttpResponse, nil
|
||||
}
|
||||
|
||||
/*
|
||||
WorkflowApiService
|
||||
List available workflows
|
||||
- @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
|
||||
*/
|
||||
func (a *WorkflowApiService) WorkflowControllerListWorkflows(ctx context.Context) (*http.Response, error) {
|
||||
var (
|
||||
localVarHttpMethod = strings.ToUpper("Get")
|
||||
localVarPostBody interface{}
|
||||
localVarFileName string
|
||||
localVarFileBytes []byte
|
||||
)
|
||||
|
||||
// create path and map variables
|
||||
localVarPath := a.client.cfg.BasePath + "/workflow/"
|
||||
|
||||
localVarHeaderParams := make(map[string]string)
|
||||
localVarQueryParams := url.Values{}
|
||||
localVarFormParams := url.Values{}
|
||||
|
||||
// to determine the Content-Type header
|
||||
localVarHttpContentTypes := []string{}
|
||||
|
||||
// set Content-Type header
|
||||
localVarHttpContentType := selectHeaderContentType(localVarHttpContentTypes)
|
||||
if localVarHttpContentType != "" {
|
||||
localVarHeaderParams["Content-Type"] = localVarHttpContentType
|
||||
}
|
||||
|
||||
// to determine the Accept header
|
||||
localVarHttpHeaderAccepts := []string{}
|
||||
|
||||
// set Accept header
|
||||
localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
|
||||
if localVarHttpHeaderAccept != "" {
|
||||
localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
|
||||
}
|
||||
r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
localVarHttpResponse, err := a.client.callAPI(r)
|
||||
if err != nil || localVarHttpResponse == nil {
|
||||
return localVarHttpResponse, err
|
||||
}
|
||||
|
||||
localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
|
||||
localVarHttpResponse.Body.Close()
|
||||
if err != nil {
|
||||
return localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode >= 300 {
|
||||
newErr := GenericSwaggerError{
|
||||
body: localVarBody,
|
||||
error: localVarHttpResponse.Status,
|
||||
}
|
||||
|
||||
return localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarHttpResponse, nil
|
||||
}
|
||||
|
||||
/*
|
||||
WorkflowApiService
|
||||
If we use this aproach to transofrm mxgraph representation in our representation, we should not use other API calls for modify the project structure or we'll have inconsistencies.
|
||||
- @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
|
||||
- @param workflowName Workflow Name
|
||||
- @param xmlData Xml representation of the workflow
|
||||
*/
|
||||
func (a *WorkflowApiService) WorkflowControllerParseMxGraph(ctx context.Context, workflowName string, xmlData string) (*http.Response, error) {
|
||||
var (
|
||||
localVarHttpMethod = strings.ToUpper("Post")
|
||||
localVarPostBody interface{}
|
||||
localVarFileName string
|
||||
localVarFileBytes []byte
|
||||
)
|
||||
|
||||
// create path and map variables
|
||||
localVarPath := a.client.cfg.BasePath + "/workflow/{workflowName}/mxGraphParser"
|
||||
localVarPath = strings.Replace(localVarPath, "{"+"workflowName"+"}", fmt.Sprintf("%v", workflowName), -1)
|
||||
|
||||
localVarHeaderParams := make(map[string]string)
|
||||
localVarQueryParams := url.Values{}
|
||||
localVarFormParams := url.Values{}
|
||||
|
||||
// to determine the Content-Type header
|
||||
localVarHttpContentTypes := []string{}
|
||||
|
||||
// set Content-Type header
|
||||
localVarHttpContentType := selectHeaderContentType(localVarHttpContentTypes)
|
||||
if localVarHttpContentType != "" {
|
||||
localVarHeaderParams["Content-Type"] = localVarHttpContentType
|
||||
}
|
||||
|
||||
// to determine the Accept header
|
||||
localVarHttpHeaderAccepts := []string{}
|
||||
|
||||
// set Accept header
|
||||
localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
|
||||
if localVarHttpHeaderAccept != "" {
|
||||
localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
|
||||
}
|
||||
// body params
|
||||
localVarPostBody = &xmlData
|
||||
r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
localVarHttpResponse, err := a.client.callAPI(r)
|
||||
if err != nil || localVarHttpResponse == nil {
|
||||
return localVarHttpResponse, err
|
||||
}
|
||||
|
||||
localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
|
||||
localVarHttpResponse.Body.Close()
|
||||
if err != nil {
|
||||
return localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode >= 300 {
|
||||
newErr := GenericSwaggerError{
|
||||
body: localVarBody,
|
||||
error: localVarHttpResponse.Status,
|
||||
}
|
||||
|
||||
return localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarHttpResponse, nil
|
||||
}
|
||||
|
||||
/*
|
||||
WorkflowApiService
|
||||
Set desired schedule by the user. No other effects a part of saving the user input
|
||||
* @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
|
||||
* @param workflowName Workflow Name
|
||||
* @param isService True: Service, False: Task
|
||||
* @param startDate RFC3339 time for startDate
|
||||
* @param stopDate RFC3339 time for stopDate
|
||||
* @param optional nil or *WorkflowApiWorkflowControllerSetScheduleOpts - Optional Parameters:
|
||||
* @param "Events" (optional.String) - List of events separated by comma
|
||||
* @param "CronString" (optional.String) - Cron string
|
||||
* @param "Duration" (optional.Int32) - Duration in seconds
|
||||
|
||||
@return ModelsScheduleInfo
|
||||
*/
|
||||
|
||||
type WorkflowApiWorkflowControllerSetScheduleOpts struct {
|
||||
Events optional.String
|
||||
CronString optional.String
|
||||
Duration optional.Int32
|
||||
}
|
||||
|
||||
func (a *WorkflowApiService) WorkflowControllerSetSchedule(ctx context.Context, workflowName string, isService bool, startDate interface{}, stopDate interface{}, localVarOptionals *WorkflowApiWorkflowControllerSetScheduleOpts) (ModelsScheduleInfo, *http.Response, error) {
|
||||
var (
|
||||
localVarHttpMethod = strings.ToUpper("Put")
|
||||
localVarPostBody interface{}
|
||||
localVarFileName string
|
||||
localVarFileBytes []byte
|
||||
localVarReturnValue ModelsScheduleInfo
|
||||
)
|
||||
|
||||
// create path and map variables
|
||||
localVarPath := a.client.cfg.BasePath + "/workflow/{workflowName}/schedule"
|
||||
localVarPath = strings.Replace(localVarPath, "{"+"workflowName"+"}", fmt.Sprintf("%v", workflowName), -1)
|
||||
|
||||
localVarHeaderParams := make(map[string]string)
|
||||
localVarQueryParams := url.Values{}
|
||||
localVarFormParams := url.Values{}
|
||||
|
||||
localVarQueryParams.Add("isService", parameterToString(isService, ""))
|
||||
localVarQueryParams.Add("startDate", parameterToString(startDate, ""))
|
||||
localVarQueryParams.Add("stopDate", parameterToString(stopDate, ""))
|
||||
if localVarOptionals != nil && localVarOptionals.Events.IsSet() {
|
||||
localVarQueryParams.Add("events", parameterToString(localVarOptionals.Events.Value(), ""))
|
||||
}
|
||||
if localVarOptionals != nil && localVarOptionals.CronString.IsSet() {
|
||||
localVarQueryParams.Add("cronString", parameterToString(localVarOptionals.CronString.Value(), ""))
|
||||
}
|
||||
if localVarOptionals != nil && localVarOptionals.Duration.IsSet() {
|
||||
localVarQueryParams.Add("duration", parameterToString(localVarOptionals.Duration.Value(), ""))
|
||||
}
|
||||
// to determine the Content-Type header
|
||||
localVarHttpContentTypes := []string{}
|
||||
|
||||
// set Content-Type header
|
||||
localVarHttpContentType := selectHeaderContentType(localVarHttpContentTypes)
|
||||
if localVarHttpContentType != "" {
|
||||
localVarHeaderParams["Content-Type"] = localVarHttpContentType
|
||||
}
|
||||
|
||||
// to determine the Accept header
|
||||
localVarHttpHeaderAccepts := []string{}
|
||||
|
||||
// set Accept header
|
||||
localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
|
||||
if localVarHttpHeaderAccept != "" {
|
||||
localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
|
||||
}
|
||||
r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
|
||||
if err != nil {
|
||||
return localVarReturnValue, nil, err
|
||||
}
|
||||
|
||||
localVarHttpResponse, err := a.client.callAPI(r)
|
||||
if err != nil || localVarHttpResponse == nil {
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
|
||||
localVarHttpResponse.Body.Close()
|
||||
if err != nil {
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode < 300 {
|
||||
// If we succeed, return the data, otherwise pass on to decode error.
|
||||
err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode >= 300 {
|
||||
newErr := GenericSwaggerError{
|
||||
body: localVarBody,
|
||||
error: localVarHttpResponse.Status,
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode == 200 {
|
||||
var v ModelsScheduleInfo
|
||||
err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
|
||||
if err != nil {
|
||||
newErr.error = err.Error()
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
newErr.model = v
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarReturnValue, localVarHttpResponse, nil
|
||||
}
|
334
selfapi/api_workspace.go
Normal file
@ -0,0 +1,334 @@
|
||||
/*
|
||||
* oc-catalog API
|
||||
*
|
||||
* Backend of the oc-search project
|
||||
*
|
||||
* API version: 1.0.0
|
||||
* Contact: opencloud@irt-saintexupery.com
|
||||
* Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
|
||||
*/
|
||||
|
||||
package swagger
|
||||
|
||||
import (
|
||||
"context"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Linger please
|
||||
var (
|
||||
_ context.Context
|
||||
)
|
||||
|
||||
type WorkspaceApiService service
|
||||
|
||||
/*
|
||||
WorkspaceApiService
|
||||
Insert a resource in the workspace
|
||||
- @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
|
||||
- @param id ID of a resource
|
||||
- @param rtype Type of resource
|
||||
*/
|
||||
func (a *WorkspaceApiService) WorkspaceControllerAddModelToWorkspace(ctx context.Context, id string, rtype string) (*http.Response, error) {
|
||||
var (
|
||||
localVarHttpMethod = strings.ToUpper("Post")
|
||||
localVarPostBody interface{}
|
||||
localVarFileName string
|
||||
localVarFileBytes []byte
|
||||
)
|
||||
|
||||
// create path and map variables
|
||||
localVarPath := a.client.cfg.BasePath + "/workspace/"
|
||||
|
||||
localVarHeaderParams := make(map[string]string)
|
||||
localVarQueryParams := url.Values{}
|
||||
localVarFormParams := url.Values{}
|
||||
|
||||
localVarQueryParams.Add("id", parameterToString(id, ""))
|
||||
localVarQueryParams.Add("rtype", parameterToString(rtype, ""))
|
||||
// to determine the Content-Type header
|
||||
localVarHttpContentTypes := []string{}
|
||||
|
||||
// set Content-Type header
|
||||
localVarHttpContentType := selectHeaderContentType(localVarHttpContentTypes)
|
||||
if localVarHttpContentType != "" {
|
||||
localVarHeaderParams["Content-Type"] = localVarHttpContentType
|
||||
}
|
||||
|
||||
// to determine the Accept header
|
||||
localVarHttpHeaderAccepts := []string{}
|
||||
|
||||
// set Accept header
|
||||
localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
|
||||
if localVarHttpHeaderAccept != "" {
|
||||
localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
|
||||
}
|
||||
r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
localVarHttpResponse, err := a.client.callAPI(r)
|
||||
if err != nil || localVarHttpResponse == nil {
|
||||
return localVarHttpResponse, err
|
||||
}
|
||||
|
||||
localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
|
||||
localVarHttpResponse.Body.Close()
|
||||
if err != nil {
|
||||
return localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode >= 300 {
|
||||
newErr := GenericSwaggerError{
|
||||
body: localVarBody,
|
||||
error: localVarHttpResponse.Status,
|
||||
}
|
||||
|
||||
return localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarHttpResponse, nil
|
||||
}
|
||||
|
||||
/*
|
||||
WorkspaceApiService
|
||||
Remove a resource from the workspace
|
||||
- @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
|
||||
- @param id ID of a resource
|
||||
- @param rtype Type of resource
|
||||
*/
|
||||
func (a *WorkspaceApiService) WorkspaceControllerDeleteElementFromUserWorkspace(ctx context.Context, id string, rtype string) (*http.Response, error) {
|
||||
var (
|
||||
localVarHttpMethod = strings.ToUpper("Delete")
|
||||
localVarPostBody interface{}
|
||||
localVarFileName string
|
||||
localVarFileBytes []byte
|
||||
)
|
||||
|
||||
// create path and map variables
|
||||
localVarPath := a.client.cfg.BasePath + "/workspace/"
|
||||
|
||||
localVarHeaderParams := make(map[string]string)
|
||||
localVarQueryParams := url.Values{}
|
||||
localVarFormParams := url.Values{}
|
||||
|
||||
localVarQueryParams.Add("id", parameterToString(id, ""))
|
||||
localVarQueryParams.Add("rtype", parameterToString(rtype, ""))
|
||||
// to determine the Content-Type header
|
||||
localVarHttpContentTypes := []string{}
|
||||
|
||||
// set Content-Type header
|
||||
localVarHttpContentType := selectHeaderContentType(localVarHttpContentTypes)
|
||||
if localVarHttpContentType != "" {
|
||||
localVarHeaderParams["Content-Type"] = localVarHttpContentType
|
||||
}
|
||||
|
||||
// to determine the Accept header
|
||||
localVarHttpHeaderAccepts := []string{}
|
||||
|
||||
// set Accept header
|
||||
localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
|
||||
if localVarHttpHeaderAccept != "" {
|
||||
localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
|
||||
}
|
||||
r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
localVarHttpResponse, err := a.client.callAPI(r)
|
||||
if err != nil || localVarHttpResponse == nil {
|
||||
return localVarHttpResponse, err
|
||||
}
|
||||
|
||||
localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
|
||||
localVarHttpResponse.Body.Close()
|
||||
if err != nil {
|
||||
return localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode >= 300 {
|
||||
newErr := GenericSwaggerError{
|
||||
body: localVarBody,
|
||||
error: localVarHttpResponse.Status,
|
||||
}
|
||||
|
||||
return localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarHttpResponse, nil
|
||||
}
|
||||
|
||||
/*
|
||||
WorkspaceApiService
|
||||
Get full workspace elements based on user_id token
|
||||
- @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
|
||||
|
||||
@return ModelsWorkspaceModel
|
||||
*/
|
||||
func (a *WorkspaceApiService) WorkspaceControllerGetFullWorkspace(ctx context.Context) (ModelsWorkspaceModel, *http.Response, error) {
|
||||
var (
|
||||
localVarHttpMethod = strings.ToUpper("Get")
|
||||
localVarPostBody interface{}
|
||||
localVarFileName string
|
||||
localVarFileBytes []byte
|
||||
localVarReturnValue ModelsWorkspaceModel
|
||||
)
|
||||
|
||||
// create path and map variables
|
||||
localVarPath := a.client.cfg.BasePath + "/workspace/list_model"
|
||||
|
||||
localVarHeaderParams := make(map[string]string)
|
||||
localVarQueryParams := url.Values{}
|
||||
localVarFormParams := url.Values{}
|
||||
|
||||
// to determine the Content-Type header
|
||||
localVarHttpContentTypes := []string{}
|
||||
|
||||
// set Content-Type header
|
||||
localVarHttpContentType := selectHeaderContentType(localVarHttpContentTypes)
|
||||
if localVarHttpContentType != "" {
|
||||
localVarHeaderParams["Content-Type"] = localVarHttpContentType
|
||||
}
|
||||
|
||||
// to determine the Accept header
|
||||
localVarHttpHeaderAccepts := []string{}
|
||||
|
||||
// set Accept header
|
||||
localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
|
||||
if localVarHttpHeaderAccept != "" {
|
||||
localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
|
||||
}
|
||||
r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
|
||||
if err != nil {
|
||||
return localVarReturnValue, nil, err
|
||||
}
|
||||
|
||||
localVarHttpResponse, err := a.client.callAPI(r)
|
||||
if err != nil || localVarHttpResponse == nil {
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
|
||||
localVarHttpResponse.Body.Close()
|
||||
if err != nil {
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode < 300 {
|
||||
// If we succeed, return the data, otherwise pass on to decode error.
|
||||
err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode >= 300 {
|
||||
newErr := GenericSwaggerError{
|
||||
body: localVarBody,
|
||||
error: localVarHttpResponse.Status,
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode == 200 {
|
||||
var v ModelsWorkspaceModel
|
||||
err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
|
||||
if err != nil {
|
||||
newErr.error = err.Error()
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
newErr.model = v
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarReturnValue, localVarHttpResponse, nil
|
||||
}
|
||||
|
||||
/*
|
||||
WorkspaceApiService
|
||||
Get workspace elements based on user_id token
|
||||
- @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
|
||||
|
||||
@return ModelsWorkspace
|
||||
*/
|
||||
func (a *WorkspaceApiService) WorkspaceControllerGetWorkspace(ctx context.Context) (ModelsWorkspace, *http.Response, error) {
|
||||
var (
|
||||
localVarHttpMethod = strings.ToUpper("Get")
|
||||
localVarPostBody interface{}
|
||||
localVarFileName string
|
||||
localVarFileBytes []byte
|
||||
localVarReturnValue ModelsWorkspace
|
||||
)
|
||||
|
||||
// create path and map variables
|
||||
localVarPath := a.client.cfg.BasePath + "/workspace/list"
|
||||
|
||||
localVarHeaderParams := make(map[string]string)
|
||||
localVarQueryParams := url.Values{}
|
||||
localVarFormParams := url.Values{}
|
||||
|
||||
// to determine the Content-Type header
|
||||
localVarHttpContentTypes := []string{}
|
||||
|
||||
// set Content-Type header
|
||||
localVarHttpContentType := selectHeaderContentType(localVarHttpContentTypes)
|
||||
if localVarHttpContentType != "" {
|
||||
localVarHeaderParams["Content-Type"] = localVarHttpContentType
|
||||
}
|
||||
|
||||
// to determine the Accept header
|
||||
localVarHttpHeaderAccepts := []string{}
|
||||
|
||||
// set Accept header
|
||||
localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
|
||||
if localVarHttpHeaderAccept != "" {
|
||||
localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
|
||||
}
|
||||
r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
|
||||
if err != nil {
|
||||
return localVarReturnValue, nil, err
|
||||
}
|
||||
|
||||
localVarHttpResponse, err := a.client.callAPI(r)
|
||||
if err != nil || localVarHttpResponse == nil {
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
|
||||
localVarHttpResponse.Body.Close()
|
||||
if err != nil {
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode < 300 {
|
||||
// If we succeed, return the data, otherwise pass on to decode error.
|
||||
err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
|
||||
return localVarReturnValue, localVarHttpResponse, err
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode >= 300 {
|
||||
newErr := GenericSwaggerError{
|
||||
body: localVarBody,
|
||||
error: localVarHttpResponse.Status,
|
||||
}
|
||||
|
||||
if localVarHttpResponse.StatusCode == 200 {
|
||||
var v ModelsWorkspace
|
||||
err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
|
||||
if err != nil {
|
||||
newErr.error = err.Error()
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
newErr.model = v
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarReturnValue, localVarHttpResponse, newErr
|
||||
}
|
||||
|
||||
return localVarReturnValue, localVarHttpResponse, nil
|
||||
}
|
499
selfapi/client.go
Normal file
@ -0,0 +1,499 @@
|
||||
/*
|
||||
* oc-catalog API
|
||||
*
|
||||
* Backend of the oc-search project
|
||||
*
|
||||
* API version: 1.0.0
|
||||
* Contact: opencloud@irt-saintexupery.com
|
||||
* Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
|
||||
*/
|
||||
|
||||
package swagger
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"encoding/json"
|
||||
"encoding/xml"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"mime/multipart"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"reflect"
|
||||
"regexp"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
"unicode/utf8"
|
||||
|
||||
"golang.org/x/oauth2"
|
||||
)
|
||||
|
||||
var (
|
||||
jsonCheck = regexp.MustCompile("(?i:(?:application|text)/json)")
|
||||
xmlCheck = regexp.MustCompile("(?i:(?:application|text)/xml)")
|
||||
)
|
||||
|
||||
// APIClient manages communication with the oc-catalog API API v1.0.0
|
||||
// In most cases there should be only one, shared, APIClient.
|
||||
type APIClient struct {
|
||||
cfg *Configuration
|
||||
common service // Reuse a single struct instead of allocating one for each service on the heap.
|
||||
|
||||
// API Services
|
||||
|
||||
ComputingApi *ComputingApiService
|
||||
|
||||
DataApi *DataApiService
|
||||
|
||||
DatacenterApi *DatacenterApiService
|
||||
|
||||
ScheduleApi *ScheduleApiService
|
||||
|
||||
SearchApi *SearchApiService
|
||||
|
||||
StorageApi *StorageApiService
|
||||
|
||||
UserApi *UserApiService
|
||||
|
||||
WorkflowApi *WorkflowApiService
|
||||
|
||||
WorkspaceApi *WorkspaceApiService
|
||||
}
|
||||
|
||||
type service struct {
|
||||
client *APIClient
|
||||
}
|
||||
|
||||
// NewAPIClient creates a new API client. Requires a userAgent string describing your application.
|
||||
// optionally a custom http.Client to allow for advanced features such as caching.
|
||||
func NewAPIClient(cfg *Configuration) *APIClient {
|
||||
if cfg.HTTPClient == nil {
|
||||
cfg.HTTPClient = http.DefaultClient
|
||||
}
|
||||
|
||||
c := &APIClient{}
|
||||
c.cfg = cfg
|
||||
c.common.client = c
|
||||
|
||||
// API Services
|
||||
c.ComputingApi = (*ComputingApiService)(&c.common)
|
||||
c.DataApi = (*DataApiService)(&c.common)
|
||||
c.DatacenterApi = (*DatacenterApiService)(&c.common)
|
||||
c.ScheduleApi = (*ScheduleApiService)(&c.common)
|
||||
c.SearchApi = (*SearchApiService)(&c.common)
|
||||
c.StorageApi = (*StorageApiService)(&c.common)
|
||||
c.UserApi = (*UserApiService)(&c.common)
|
||||
c.WorkflowApi = (*WorkflowApiService)(&c.common)
|
||||
c.WorkspaceApi = (*WorkspaceApiService)(&c.common)
|
||||
|
||||
return c
|
||||
}
|
||||
|
||||
func atoi(in string) (int, error) {
|
||||
return strconv.Atoi(in)
|
||||
}
|
||||
|
||||
// selectHeaderContentType select a content type from the available list.
|
||||
func selectHeaderContentType(contentTypes []string) string {
|
||||
if len(contentTypes) == 0 {
|
||||
return ""
|
||||
}
|
||||
if contains(contentTypes, "application/json") {
|
||||
return "application/json"
|
||||
}
|
||||
return contentTypes[0] // use the first content type specified in 'consumes'
|
||||
}
|
||||
|
||||
// selectHeaderAccept join all accept types and return
|
||||
func selectHeaderAccept(accepts []string) string {
|
||||
if len(accepts) == 0 {
|
||||
return ""
|
||||
}
|
||||
|
||||
if contains(accepts, "application/json") {
|
||||
return "application/json"
|
||||
}
|
||||
|
||||
return strings.Join(accepts, ",")
|
||||
}
|
||||
|
||||
// contains is a case insenstive match, finding needle in a haystack
|
||||
func contains(haystack []string, needle string) bool {
|
||||
for _, a := range haystack {
|
||||
if strings.ToLower(a) == strings.ToLower(needle) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// Verify optional parameters are of the correct type.
|
||||
func typeCheckParameter(obj interface{}, expected string, name string) error {
|
||||
// Make sure there is an object.
|
||||
if obj == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
// Check the type is as expected.
|
||||
if reflect.TypeOf(obj).String() != expected {
|
||||
return fmt.Errorf("Expected %s to be of type %s but received %s.", name, expected, reflect.TypeOf(obj).String())
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// parameterToString convert interface{} parameters to string, using a delimiter if format is provided.
|
||||
func parameterToString(obj interface{}, collectionFormat string) string {
|
||||
var delimiter string
|
||||
|
||||
switch collectionFormat {
|
||||
case "pipes":
|
||||
delimiter = "|"
|
||||
case "ssv":
|
||||
delimiter = " "
|
||||
case "tsv":
|
||||
delimiter = "\t"
|
||||
case "csv":
|
||||
delimiter = ","
|
||||
}
|
||||
|
||||
if reflect.TypeOf(obj).Kind() == reflect.Slice {
|
||||
return strings.Trim(strings.Replace(fmt.Sprint(obj), " ", delimiter, -1), "[]")
|
||||
}
|
||||
|
||||
return fmt.Sprintf("%v", obj)
|
||||
}
|
||||
|
||||
// callAPI do the request.
|
||||
func (c *APIClient) callAPI(request *http.Request) (*http.Response, error) {
|
||||
return c.cfg.HTTPClient.Do(request)
|
||||
}
|
||||
|
||||
// Change base path to allow switching to mocks
|
||||
func (c *APIClient) ChangeBasePath(path string) {
|
||||
c.cfg.BasePath = path
|
||||
}
|
||||
|
||||
// prepareRequest build the request
|
||||
func (c *APIClient) prepareRequest(
|
||||
ctx context.Context,
|
||||
path string, method string,
|
||||
postBody interface{},
|
||||
headerParams map[string]string,
|
||||
queryParams url.Values,
|
||||
formParams url.Values,
|
||||
fileName string,
|
||||
fileBytes []byte) (localVarRequest *http.Request, err error) {
|
||||
|
||||
var body *bytes.Buffer
|
||||
|
||||
// Detect postBody type and post.
|
||||
if postBody != nil {
|
||||
contentType := headerParams["Content-Type"]
|
||||
if contentType == "" {
|
||||
contentType = detectContentType(postBody)
|
||||
headerParams["Content-Type"] = contentType
|
||||
}
|
||||
|
||||
body, err = setBody(postBody, contentType)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
// add form parameters and file if available.
|
||||
if strings.HasPrefix(headerParams["Content-Type"], "multipart/form-data") && len(formParams) > 0 || (len(fileBytes) > 0 && fileName != "") {
|
||||
if body != nil {
|
||||
return nil, errors.New("Cannot specify postBody and multipart form at the same time.")
|
||||
}
|
||||
body = &bytes.Buffer{}
|
||||
w := multipart.NewWriter(body)
|
||||
|
||||
for k, v := range formParams {
|
||||
for _, iv := range v {
|
||||
if strings.HasPrefix(k, "@") { // file
|
||||
err = addFile(w, k[1:], iv)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
} else { // form value
|
||||
w.WriteField(k, iv)
|
||||
}
|
||||
}
|
||||
}
|
||||
if len(fileBytes) > 0 && fileName != "" {
|
||||
w.Boundary()
|
||||
//_, fileNm := filepath.Split(fileName)
|
||||
part, err := w.CreateFormFile("file", filepath.Base(fileName))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
_, err = part.Write(fileBytes)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
// Set the Boundary in the Content-Type
|
||||
headerParams["Content-Type"] = w.FormDataContentType()
|
||||
}
|
||||
|
||||
// Set Content-Length
|
||||
headerParams["Content-Length"] = fmt.Sprintf("%d", body.Len())
|
||||
w.Close()
|
||||
}
|
||||
|
||||
if strings.HasPrefix(headerParams["Content-Type"], "application/x-www-form-urlencoded") && len(formParams) > 0 {
|
||||
if body != nil {
|
||||
return nil, errors.New("Cannot specify postBody and x-www-form-urlencoded form at the same time.")
|
||||
}
|
||||
body = &bytes.Buffer{}
|
||||
body.WriteString(formParams.Encode())
|
||||
// Set Content-Length
|
||||
headerParams["Content-Length"] = fmt.Sprintf("%d", body.Len())
|
||||
}
|
||||
|
||||
// Setup path and query parameters
|
||||
url, err := url.Parse(path)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Adding Query Param
|
||||
query := url.Query()
|
||||
for k, v := range queryParams {
|
||||
for _, iv := range v {
|
||||
query.Add(k, iv)
|
||||
}
|
||||
}
|
||||
|
||||
// Encode the parameters.
|
||||
url.RawQuery = query.Encode()
|
||||
|
||||
// Generate a new request
|
||||
if body != nil {
|
||||
localVarRequest, err = http.NewRequest(method, url.String(), body)
|
||||
} else {
|
||||
localVarRequest, err = http.NewRequest(method, url.String(), nil)
|
||||
}
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// add header parameters, if any
|
||||
if len(headerParams) > 0 {
|
||||
headers := http.Header{}
|
||||
for h, v := range headerParams {
|
||||
headers.Set(h, v)
|
||||
}
|
||||
localVarRequest.Header = headers
|
||||
}
|
||||
|
||||
// Override request host, if applicable
|
||||
if c.cfg.Host != "" {
|
||||
localVarRequest.Host = c.cfg.Host
|
||||
}
|
||||
|
||||
// Add the user agent to the request.
|
||||
localVarRequest.Header.Add("User-Agent", c.cfg.UserAgent)
|
||||
|
||||
if ctx != nil {
|
||||
// add context to the request
|
||||
localVarRequest = localVarRequest.WithContext(ctx)
|
||||
|
||||
// Walk through any authentication.
|
||||
|
||||
// OAuth2 authentication
|
||||
if tok, ok := ctx.Value(ContextOAuth2).(oauth2.TokenSource); ok {
|
||||
// We were able to grab an oauth2 token from the context
|
||||
var latestToken *oauth2.Token
|
||||
if latestToken, err = tok.Token(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
latestToken.SetAuthHeader(localVarRequest)
|
||||
}
|
||||
|
||||
// Basic HTTP Authentication
|
||||
if auth, ok := ctx.Value(ContextBasicAuth).(BasicAuth); ok {
|
||||
localVarRequest.SetBasicAuth(auth.UserName, auth.Password)
|
||||
}
|
||||
|
||||
// AccessToken Authentication
|
||||
if auth, ok := ctx.Value(ContextAccessToken).(string); ok {
|
||||
localVarRequest.Header.Add("Authorization", "Bearer "+auth)
|
||||
}
|
||||
}
|
||||
|
||||
for header, value := range c.cfg.DefaultHeader {
|
||||
localVarRequest.Header.Add(header, value)
|
||||
}
|
||||
|
||||
return localVarRequest, nil
|
||||
}
|
||||
|
||||
func (c *APIClient) decode(v interface{}, b []byte, contentType string) (err error) {
|
||||
if strings.Contains(contentType, "application/xml") {
|
||||
if err = xml.Unmarshal(b, v); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
} else if strings.Contains(contentType, "application/json") {
|
||||
if err = json.Unmarshal(b, v); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
return errors.New("undefined response type")
|
||||
}
|
||||
|
||||
// Add a file to the multipart request
|
||||
func addFile(w *multipart.Writer, fieldName, path string) error {
|
||||
file, err := os.Open(path)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
part, err := w.CreateFormFile(fieldName, filepath.Base(path))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
_, err = io.Copy(part, file)
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
// Prevent trying to import "fmt"
|
||||
func reportError(format string, a ...interface{}) error {
|
||||
return fmt.Errorf(format, a...)
|
||||
}
|
||||
|
||||
// Set request body from an interface{}
|
||||
func setBody(body interface{}, contentType string) (bodyBuf *bytes.Buffer, err error) {
|
||||
if bodyBuf == nil {
|
||||
bodyBuf = &bytes.Buffer{}
|
||||
}
|
||||
|
||||
if reader, ok := body.(io.Reader); ok {
|
||||
_, err = bodyBuf.ReadFrom(reader)
|
||||
} else if b, ok := body.([]byte); ok {
|
||||
_, err = bodyBuf.Write(b)
|
||||
} else if s, ok := body.(string); ok {
|
||||
_, err = bodyBuf.WriteString(s)
|
||||
} else if s, ok := body.(*string); ok {
|
||||
_, err = bodyBuf.WriteString(*s)
|
||||
} else if jsonCheck.MatchString(contentType) {
|
||||
err = json.NewEncoder(bodyBuf).Encode(body)
|
||||
} else if xmlCheck.MatchString(contentType) {
|
||||
xml.NewEncoder(bodyBuf).Encode(body)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if bodyBuf.Len() == 0 {
|
||||
err = fmt.Errorf("Invalid body type %s\n", contentType)
|
||||
return nil, err
|
||||
}
|
||||
return bodyBuf, nil
|
||||
}
|
||||
|
||||
// detectContentType method is used to figure out `Request.Body` content type for request header
|
||||
func detectContentType(body interface{}) string {
|
||||
contentType := "text/plain; charset=utf-8"
|
||||
kind := reflect.TypeOf(body).Kind()
|
||||
|
||||
switch kind {
|
||||
case reflect.Struct, reflect.Map, reflect.Ptr:
|
||||
contentType = "application/json; charset=utf-8"
|
||||
case reflect.String:
|
||||
contentType = "text/plain; charset=utf-8"
|
||||
default:
|
||||
if b, ok := body.([]byte); ok {
|
||||
contentType = http.DetectContentType(b)
|
||||
} else if kind == reflect.Slice {
|
||||
contentType = "application/json; charset=utf-8"
|
||||
}
|
||||
}
|
||||
|
||||
return contentType
|
||||
}
|
||||
|
||||
// Ripped from https://github.com/gregjones/httpcache/blob/master/httpcache.go
|
||||
type cacheControl map[string]string
|
||||
|
||||
func parseCacheControl(headers http.Header) cacheControl {
|
||||
cc := cacheControl{}
|
||||
ccHeader := headers.Get("Cache-Control")
|
||||
for _, part := range strings.Split(ccHeader, ",") {
|
||||
part = strings.Trim(part, " ")
|
||||
if part == "" {
|
||||
continue
|
||||
}
|
||||
if strings.ContainsRune(part, '=') {
|
||||
keyval := strings.Split(part, "=")
|
||||
cc[strings.Trim(keyval[0], " ")] = strings.Trim(keyval[1], ",")
|
||||
} else {
|
||||
cc[part] = ""
|
||||
}
|
||||
}
|
||||
return cc
|
||||
}
|
||||
|
||||
// CacheExpires helper function to determine remaining time before repeating a request.
|
||||
func CacheExpires(r *http.Response) time.Time {
|
||||
// Figure out when the cache expires.
|
||||
var expires time.Time
|
||||
now, err := time.Parse(time.RFC1123, r.Header.Get("date"))
|
||||
if err != nil {
|
||||
return time.Now()
|
||||
}
|
||||
respCacheControl := parseCacheControl(r.Header)
|
||||
|
||||
if maxAge, ok := respCacheControl["max-age"]; ok {
|
||||
lifetime, err := time.ParseDuration(maxAge + "s")
|
||||
if err != nil {
|
||||
expires = now
|
||||
}
|
||||
expires = now.Add(lifetime)
|
||||
} else {
|
||||
expiresHeader := r.Header.Get("Expires")
|
||||
if expiresHeader != "" {
|
||||
expires, err = time.Parse(time.RFC1123, expiresHeader)
|
||||
if err != nil {
|
||||
expires = now
|
||||
}
|
||||
}
|
||||
}
|
||||
return expires
|
||||
}
|
||||
|
||||
func strlen(s string) int {
|
||||
return utf8.RuneCountInString(s)
|
||||
}
|
||||
|
||||
// GenericSwaggerError Provides access to the body, error and model on returned errors.
|
||||
type GenericSwaggerError struct {
|
||||
body []byte
|
||||
error string
|
||||
model interface{}
|
||||
}
|
||||
|
||||
// Error returns non-empty string if there was an error.
|
||||
func (e GenericSwaggerError) Error() string {
|
||||
return e.error
|
||||
}
|
||||
|
||||
// Body returns the raw bytes of the response
|
||||
func (e GenericSwaggerError) Body() []byte {
|
||||
return e.body
|
||||
}
|
||||
|
||||
// Model returns the unpacked model of the error
|
||||
func (e GenericSwaggerError) Model() interface{} {
|
||||
return e.model
|
||||
}
|
73
selfapi/configuration.go
Normal file
@ -0,0 +1,73 @@
|
||||
/*
|
||||
* oc-catalog API
|
||||
*
|
||||
* Backend of the oc-search project
|
||||
*
|
||||
* API version: 1.0.0
|
||||
* Contact: opencloud@irt-saintexupery.com
|
||||
* Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
|
||||
*/
|
||||
|
||||
package swagger
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
)
|
||||
|
||||
// contextKeys are used to identify the type of value in the context.
|
||||
// Since these are string, it is possible to get a short description of the
|
||||
// context key for logging and debugging using key.String().
|
||||
|
||||
type contextKey string
|
||||
|
||||
func (c contextKey) String() string {
|
||||
return "auth " + string(c)
|
||||
}
|
||||
|
||||
var (
|
||||
// ContextOAuth2 takes a oauth2.TokenSource as authentication for the request.
|
||||
ContextOAuth2 = contextKey("token")
|
||||
|
||||
// ContextBasicAuth takes BasicAuth as authentication for the request.
|
||||
ContextBasicAuth = contextKey("basic")
|
||||
|
||||
// ContextAccessToken takes a string oauth2 access token as authentication for the request.
|
||||
ContextAccessToken = contextKey("accesstoken")
|
||||
|
||||
// ContextAPIKey takes an APIKey as authentication for the request
|
||||
ContextAPIKey = contextKey("apikey")
|
||||
)
|
||||
|
||||
// BasicAuth provides basic http authentication to a request passed via context using ContextBasicAuth
|
||||
type BasicAuth struct {
|
||||
UserName string `json:"userName,omitempty"`
|
||||
Password string `json:"password,omitempty"`
|
||||
}
|
||||
|
||||
// APIKey provides API key based authentication to a request passed via context using ContextAPIKey
|
||||
type APIKey struct {
|
||||
Key string
|
||||
Prefix string
|
||||
}
|
||||
|
||||
type Configuration struct {
|
||||
BasePath string `json:"basePath,omitempty"`
|
||||
Host string `json:"host,omitempty"`
|
||||
Scheme string `json:"scheme,omitempty"`
|
||||
DefaultHeader map[string]string `json:"defaultHeader,omitempty"`
|
||||
UserAgent string `json:"userAgent,omitempty"`
|
||||
HTTPClient *http.Client
|
||||
}
|
||||
|
||||
func NewConfiguration() *Configuration {
|
||||
cfg := &Configuration{
|
||||
BasePath: "https://localhost:49618/v1",
|
||||
DefaultHeader: make(map[string]string),
|
||||
UserAgent: "Swagger-Codegen/1.0.0/go",
|
||||
}
|
||||
return cfg
|
||||
}
|
||||
|
||||
func (c *Configuration) AddDefaultHeader(key string, value string) {
|
||||
c.DefaultHeader[key] = value
|
||||
}
|
95
selfapi/docs/ComputingApi.md
Normal file
@ -0,0 +1,95 @@
|
||||
# \ComputingApi
|
||||
|
||||
All URIs are relative to *https://localhost:49618/v1*
|
||||
|
||||
Method | HTTP request | Description
|
||||
------------- | ------------- | -------------
|
||||
[**ComputingControllerAddComputing**](ComputingApi.md#ComputingControllerAddComputing) | **Post** /computing/ |
|
||||
[**ComputingControllerGetComputingByID**](ComputingApi.md#ComputingControllerGetComputingByID) | **Get** /computing/{ID} |
|
||||
[**ComputingControllerGetMultipleComputingByIDs**](ComputingApi.md#ComputingControllerGetMultipleComputingByIDs) | **Get** /computing/multi/{IDs} |
|
||||
|
||||
|
||||
# **ComputingControllerAddComputing**
|
||||
> ComputingControllerAddComputing(ctx, body)
|
||||
|
||||
|
||||
Submit a computing object
|
||||
|
||||
### Required Parameters
|
||||
|
||||
Name | Type | Description | Notes
|
||||
------------- | ------------- | ------------- | -------------
|
||||
**ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
|
||||
**body** | [**ModelsComputingNewModel**](ModelsComputingNewModel.md)| The object content |
|
||||
|
||||
### Return type
|
||||
|
||||
(empty response body)
|
||||
|
||||
### Authorization
|
||||
|
||||
No authorization required
|
||||
|
||||
### HTTP request headers
|
||||
|
||||
- **Content-Type**: Not defined
|
||||
- **Accept**: Not defined
|
||||
|
||||
[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
|
||||
|
||||
# **ComputingControllerGetComputingByID**
|
||||
> ModelsComputingModel ComputingControllerGetComputingByID(ctx, iD)
|
||||
|
||||
|
||||
Find a computing resource based on ID
|
||||
|
||||
### Required Parameters
|
||||
|
||||
Name | Type | Description | Notes
|
||||
------------- | ------------- | ------------- | -------------
|
||||
**ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
|
||||
**iD** | **string**| The ID of the resource |
|
||||
|
||||
### Return type
|
||||
|
||||
[**ModelsComputingModel**](models.ComputingModel.md)
|
||||
|
||||
### Authorization
|
||||
|
||||
No authorization required
|
||||
|
||||
### HTTP request headers
|
||||
|
||||
- **Content-Type**: Not defined
|
||||
- **Accept**: Not defined
|
||||
|
||||
[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
|
||||
|
||||
# **ComputingControllerGetMultipleComputingByIDs**
|
||||
> []ModelsComputingModel ComputingControllerGetMultipleComputingByIDs(ctx, iDs)
|
||||
|
||||
|
||||
Return Computing objects if found in the DB. Not found IDs will be ignored
|
||||
|
||||
### Required Parameters
|
||||
|
||||
Name | Type | Description | Notes
|
||||
------------- | ------------- | ------------- | -------------
|
||||
**ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
|
||||
**iDs** | [**[]string**](string.md)| List of computing IDs |
|
||||
|
||||
### Return type
|
||||
|
||||
[**[]ModelsComputingModel**](models.ComputingModel.md)
|
||||
|
||||
### Authorization
|
||||
|
||||
No authorization required
|
||||
|
||||
### HTTP request headers
|
||||
|
||||
- **Content-Type**: Not defined
|
||||
- **Accept**: Not defined
|
||||
|
||||
[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
|
||||
|
95
selfapi/docs/DataApi.md
Normal file
@ -0,0 +1,95 @@
|
||||
# \DataApi
|
||||
|
||||
All URIs are relative to *https://localhost:49618/v1*
|
||||
|
||||
Method | HTTP request | Description
|
||||
------------- | ------------- | -------------
|
||||
[**DataControllerCreateData**](DataApi.md#DataControllerCreateData) | **Post** /data/ |
|
||||
[**DataControllerGetDataByID**](DataApi.md#DataControllerGetDataByID) | **Get** /data/{ID} |
|
||||
[**DataControllerGetMultipleDataByIDs**](DataApi.md#DataControllerGetMultipleDataByIDs) | **Get** /data/multi/{IDs} |
|
||||
|
||||
|
||||
# **DataControllerCreateData**
|
||||
> DataControllerCreateData(ctx, body)
|
||||
|
||||
|
||||
Submit data object
|
||||
|
||||
### Required Parameters
|
||||
|
||||
Name | Type | Description | Notes
|
||||
------------- | ------------- | ------------- | -------------
|
||||
**ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
|
||||
**body** | [**ModelsDataNewModel**](ModelsDataNewModel.md)| The object content |
|
||||
|
||||
### Return type
|
||||
|
||||
(empty response body)
|
||||
|
||||
### Authorization
|
||||
|
||||
No authorization required
|
||||
|
||||
### HTTP request headers
|
||||
|
||||
- **Content-Type**: Not defined
|
||||
- **Accept**: Not defined
|
||||
|
||||
[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
|
||||
|
||||
# **DataControllerGetDataByID**
|
||||
> ModelsDataModel DataControllerGetDataByID(ctx, iD)
|
||||
|
||||
|
||||
Find rType data based on ID
|
||||
|
||||
### Required Parameters
|
||||
|
||||
Name | Type | Description | Notes
|
||||
------------- | ------------- | ------------- | -------------
|
||||
**ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
|
||||
**iD** | **string**| The ID of the data resource |
|
||||
|
||||
### Return type
|
||||
|
||||
[**ModelsDataModel**](models.DataModel.md)
|
||||
|
||||
### Authorization
|
||||
|
||||
No authorization required
|
||||
|
||||
### HTTP request headers
|
||||
|
||||
- **Content-Type**: Not defined
|
||||
- **Accept**: Not defined
|
||||
|
||||
[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
|
||||
|
||||
# **DataControllerGetMultipleDataByIDs**
|
||||
> []ModelsDataModel DataControllerGetMultipleDataByIDs(ctx, iDs)
|
||||
|
||||
|
||||
Return Data object if found in the DB. Not found IDs will be ignored
|
||||
|
||||
### Required Parameters
|
||||
|
||||
Name | Type | Description | Notes
|
||||
------------- | ------------- | ------------- | -------------
|
||||
**ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
|
||||
**iDs** | [**[]string**](string.md)| List of data IDs |
|
||||
|
||||
### Return type
|
||||
|
||||
[**[]ModelsDataModel**](models.DataModel.md)
|
||||
|
||||
### Authorization
|
||||
|
||||
No authorization required
|
||||
|
||||
### HTTP request headers
|
||||
|
||||
- **Content-Type**: Not defined
|
||||
- **Accept**: Not defined
|
||||
|
||||
[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
|
||||
|
95
selfapi/docs/DatacenterApi.md
Normal file
@ -0,0 +1,95 @@
|
||||
# \DatacenterApi
|
||||
|
||||
All URIs are relative to *https://localhost:49618/v1*
|
||||
|
||||
Method | HTTP request | Description
|
||||
------------- | ------------- | -------------
|
||||
[**DatacenterControllerCreateDatacenter**](DatacenterApi.md#DatacenterControllerCreateDatacenter) | **Post** /datacenter/ |
|
||||
[**DatacenterControllerGetMultipleDatacentersByIDs**](DatacenterApi.md#DatacenterControllerGetMultipleDatacentersByIDs) | **Get** /datacenter/multi/{IDs} |
|
||||
[**DatacenterControllerGetOneDatacenter**](DatacenterApi.md#DatacenterControllerGetOneDatacenter) | **Get** /datacenter/{ID} |
|
||||
|
||||
|
||||
# **DatacenterControllerCreateDatacenter**
|
||||
> DatacenterControllerCreateDatacenter(ctx, body)
|
||||
|
||||
|
||||
submit Datacenter object
|
||||
|
||||
### Required Parameters
|
||||
|
||||
Name | Type | Description | Notes
|
||||
------------- | ------------- | ------------- | -------------
|
||||
**ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
|
||||
**body** | [**ModelsDatacenterNewModel**](ModelsDatacenterNewModel.md)| The object content |
|
||||
|
||||
### Return type
|
||||
|
||||
(empty response body)
|
||||
|
||||
### Authorization
|
||||
|
||||
No authorization required
|
||||
|
||||
### HTTP request headers
|
||||
|
||||
- **Content-Type**: Not defined
|
||||
- **Accept**: Not defined
|
||||
|
||||
[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
|
||||
|
||||
# **DatacenterControllerGetMultipleDatacentersByIDs**
|
||||
> []ModelsComputingModel DatacenterControllerGetMultipleDatacentersByIDs(ctx, iDs)
|
||||
|
||||
|
||||
Return Datacenter objects if found in the DB. Not found IDs will be ignored
|
||||
|
||||
### Required Parameters
|
||||
|
||||
Name | Type | Description | Notes
|
||||
------------- | ------------- | ------------- | -------------
|
||||
**ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
|
||||
**iDs** | [**[]string**](string.md)| List of datacenter IDs |
|
||||
|
||||
### Return type
|
||||
|
||||
[**[]ModelsComputingModel**](models.ComputingModel.md)
|
||||
|
||||
### Authorization
|
||||
|
||||
No authorization required
|
||||
|
||||
### HTTP request headers
|
||||
|
||||
- **Content-Type**: Not defined
|
||||
- **Accept**: Not defined
|
||||
|
||||
[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
|
||||
|
||||
# **DatacenterControllerGetOneDatacenter**
|
||||
> ModelsDatacenterModel DatacenterControllerGetOneDatacenter(ctx, iD)
|
||||
|
||||
|
||||
find datacenter by ID
|
||||
|
||||
### Required Parameters
|
||||
|
||||
Name | Type | Description | Notes
|
||||
------------- | ------------- | ------------- | -------------
|
||||
**ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
|
||||
**iD** | **string**| the ID you want to get |
|
||||
|
||||
### Return type
|
||||
|
||||
[**ModelsDatacenterModel**](models.DatacenterModel.md)
|
||||
|
||||
### Authorization
|
||||
|
||||
No authorization required
|
||||
|
||||
### HTTP request headers
|
||||
|
||||
- **Content-Type**: Not defined
|
||||
- **Accept**: Not defined
|
||||
|
||||
[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
|
||||
|
20
selfapi/docs/ModelsComputingModel.md
Normal file
@ -0,0 +1,20 @@
|
||||
# ModelsComputingModel
|
||||
|
||||
## Properties
|
||||
Name | Type | Description | Notes
|
||||
------------ | ------------- | ------------- | -------------
|
||||
**ID** | **string** | | [default to null]
|
||||
**Description** | **string** | | [optional] [default to null]
|
||||
**ExecutionRequirements** | [***ModelsExecutionRequirementsModel**](models.ExecutionRequirementsModel.md) | | [optional] [default to null]
|
||||
**License** | **string** | | [optional] [default to null]
|
||||
**Logo** | **string** | | [optional] [default to null]
|
||||
**Name** | **string** | Name of the computing | [optional] [default to null]
|
||||
**Owner** | **string** | | [optional] [default to null]
|
||||
**Price** | **int32** | | [optional] [default to null]
|
||||
**Repository** | [***ModelsRepositoryModel**](models.RepositoryModel.md) | | [optional] [default to null]
|
||||
**ShortDescription** | **string** | | [optional] [default to null]
|
||||
**Type_** | **string** | | [optional] [default to null]
|
||||
|
||||
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||
|
||||
|
19
selfapi/docs/ModelsComputingNewModel.md
Normal file
@ -0,0 +1,19 @@
|
||||
# ModelsComputingNewModel
|
||||
|
||||
## Properties
|
||||
Name | Type | Description | Notes
|
||||
------------ | ------------- | ------------- | -------------
|
||||
**Description** | **string** | | [default to null]
|
||||
**ExecutionRequirements** | [***ModelsExecutionRequirementsModel**](models.ExecutionRequirementsModel.md) | | [optional] [default to null]
|
||||
**License** | **string** | | [optional] [default to null]
|
||||
**Logo** | **string** | | [default to null]
|
||||
**Name** | **string** | Name of the computing | [default to null]
|
||||
**Owner** | **string** | | [optional] [default to null]
|
||||
**Price** | **int32** | | [optional] [default to null]
|
||||
**Repository** | [***ModelsRepositoryModel**](models.RepositoryModel.md) | | [optional] [default to null]
|
||||
**ShortDescription** | **string** | | [default to null]
|
||||
**Type_** | **string** | | [default to null]
|
||||
|
||||
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||
|
||||
|
13
selfapi/docs/ModelsComputingObject.md
Normal file
@ -0,0 +1,13 @@
|
||||
# ModelsComputingObject
|
||||
|
||||
## Properties
|
||||
Name | Type | Description | Notes
|
||||
------------ | ------------- | ------------- | -------------
|
||||
**DatacenterID** | **string** | Datacenter where the computing will be executed | [optional] [default to null]
|
||||
**Inputs** | **[]string** | | [optional] [default to null]
|
||||
**Outputs** | **[]string** | | [optional] [default to null]
|
||||
**ReferenceID** | [***PrimitiveObjectId**](primitive.ObjectID.md) | Computing model ID | [optional] [default to null]
|
||||
|
||||
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||
|
||||
|
15
selfapi/docs/ModelsDCstatus.md
Normal file
@ -0,0 +1,15 @@
|
||||
# ModelsDCstatus
|
||||
|
||||
## Properties
|
||||
Name | Type | Description | Notes
|
||||
------------ | ------------- | ------------- | -------------
|
||||
**Booked** | [***ModelsScheduleInfo**](models.ScheduleInfo.md) | | [optional] [default to null]
|
||||
**DCname** | **string** | | [optional] [default to null]
|
||||
**DCobjID** | **string** | | [optional] [default to null]
|
||||
**ErrorMessage** | **string** | | [optional] [default to null]
|
||||
**IsAvailable** | **bool** | | [optional] [default to null]
|
||||
**IsReachable** | **bool** | | [optional] [default to null]
|
||||
|
||||
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||
|
||||
|
19
selfapi/docs/ModelsDataModel.md
Normal file
@ -0,0 +1,19 @@
|
||||
# ModelsDataModel
|
||||
|
||||
## Properties
|
||||
Name | Type | Description | Notes
|
||||
------------ | ------------- | ------------- | -------------
|
||||
**ID** | **string** | | [default to null]
|
||||
**Description** | **string** | | [optional] [default to null]
|
||||
**Example** | **string** | base64 encoded data | [optional] [default to null]
|
||||
**Ftype** | **string** | | [optional] [default to null]
|
||||
**Location** | **string** | | [optional] [default to null]
|
||||
**Logo** | **string** | | [optional] [default to null]
|
||||
**Name** | **string** | Name of the data | [optional] [default to null]
|
||||
**Protocol** | **[]string** | | [optional] [default to null]
|
||||
**ShortDescription** | **string** | | [optional] [default to null]
|
||||
**Type_** | **string** | Define type of data | [optional] [default to null]
|
||||
|
||||
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||
|
||||
|
18
selfapi/docs/ModelsDataNewModel.md
Normal file
@ -0,0 +1,18 @@
|
||||
# ModelsDataNewModel
|
||||
|
||||
## Properties
|
||||
Name | Type | Description | Notes
|
||||
------------ | ------------- | ------------- | -------------
|
||||
**Description** | **string** | | [default to null]
|
||||
**Example** | **string** | base64 encoded data | [default to null]
|
||||
**Ftype** | **string** | | [optional] [default to null]
|
||||
**Location** | **string** | | [default to null]
|
||||
**Logo** | **string** | | [default to null]
|
||||
**Name** | **string** | Name of the data | [default to null]
|
||||
**Protocol** | **[]string** | | [optional] [default to null]
|
||||
**ShortDescription** | **string** | | [default to null]
|
||||
**Type_** | **string** | Define type of data | [default to null]
|
||||
|
||||
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||
|
||||
|
10
selfapi/docs/ModelsDataObject.md
Normal file
@ -0,0 +1,10 @@
|
||||
# ModelsDataObject
|
||||
|
||||
## Properties
|
||||
Name | Type | Description | Notes
|
||||
------------ | ------------- | ------------- | -------------
|
||||
**ReferenceID** | [***PrimitiveObjectId**](primitive.ObjectID.md) | Data model ID | [optional] [default to null]
|
||||
|
||||
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||
|
||||
|
14
selfapi/docs/ModelsDatacenterCpuModel.md
Normal file
@ -0,0 +1,14 @@
|
||||
# ModelsDatacenterCpuModel
|
||||
|
||||
## Properties
|
||||
Name | Type | Description | Notes
|
||||
------------ | ------------- | ------------- | -------------
|
||||
**Architecture** | **string** | | [optional] [default to null]
|
||||
**Cores** | **int32** | | [default to null]
|
||||
**MinimumMemory** | **int32** | | [optional] [default to null]
|
||||
**Platform** | **string** | | [optional] [default to null]
|
||||
**Shared** | **bool** | | [optional] [default to null]
|
||||
|
||||
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||
|
||||
|
13
selfapi/docs/ModelsDatacenterGpuModel.md
Normal file
@ -0,0 +1,13 @@
|
||||
# ModelsDatacenterGpuModel
|
||||
|
||||
## Properties
|
||||
Name | Type | Description | Notes
|
||||
------------ | ------------- | ------------- | -------------
|
||||
**CudaCores** | **int32** | | [optional] [default to null]
|
||||
**Memory** | **int32** | Units in MB | [optional] [default to null]
|
||||
**Model** | **string** | | [optional] [default to null]
|
||||
**TensorCores** | **int32** | | [optional] [default to null]
|
||||
|
||||
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||
|
||||
|
11
selfapi/docs/ModelsDatacenterMemoryModel.md
Normal file
@ -0,0 +1,11 @@
|
||||
# ModelsDatacenterMemoryModel
|
||||
|
||||
## Properties
|
||||
Name | Type | Description | Notes
|
||||
------------ | ------------- | ------------- | -------------
|
||||
**Ecc** | **bool** | | [optional] [default to null]
|
||||
**Size** | **int32** | Units in MB | [optional] [default to null]
|
||||
|
||||
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||
|
||||
|
22
selfapi/docs/ModelsDatacenterModel.md
Normal file
@ -0,0 +1,22 @@
|
||||
# ModelsDatacenterModel
|
||||
|
||||
## Properties
|
||||
Name | Type | Description | Notes
|
||||
------------ | ------------- | ------------- | -------------
|
||||
**ID** | **string** | | [default to null]
|
||||
**Acronym** | **string** | id of the DC | [optional] [default to null]
|
||||
**BookingPrice** | **int64** | | [optional] [default to null]
|
||||
**Cpu** | [***ModelsDatacenterCpuModel**](models.DatacenterCpuModel.md) | | [optional] [default to null]
|
||||
**Description** | **string** | | [optional] [default to null]
|
||||
**Gpu** | [**[]ModelsDatacenterGpuModel**](models.DatacenterGpuModel.md) | | [optional] [default to null]
|
||||
**Hosts** | **[]string** | list of host:port | [optional] [default to null]
|
||||
**Logo** | **string** | | [optional] [default to null]
|
||||
**Name** | **string** | | [optional] [default to null]
|
||||
**Owner** | **string** | | [optional] [default to null]
|
||||
**Ram** | [***ModelsDatacenterMemoryModel**](models.DatacenterMemoryModel.md) | | [optional] [default to null]
|
||||
**ShortDescription** | **string** | | [optional] [default to null]
|
||||
**Type_** | **string** | | [optional] [default to null]
|
||||
|
||||
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||
|
||||
|
21
selfapi/docs/ModelsDatacenterNewModel.md
Normal file
@ -0,0 +1,21 @@
|
||||
# ModelsDatacenterNewModel
|
||||
|
||||
## Properties
|
||||
Name | Type | Description | Notes
|
||||
------------ | ------------- | ------------- | -------------
|
||||
**Acronym** | **string** | id of the DC | [default to null]
|
||||
**BookingPrice** | **int64** | | [optional] [default to null]
|
||||
**Cpu** | [***ModelsDatacenterCpuModel**](models.DatacenterCpuModel.md) | | [default to null]
|
||||
**Description** | **string** | | [default to null]
|
||||
**Gpu** | [**[]ModelsDatacenterGpuModel**](models.DatacenterGpuModel.md) | | [default to null]
|
||||
**Hosts** | **[]string** | list of host:port | [default to null]
|
||||
**Logo** | **string** | | [default to null]
|
||||
**Name** | **string** | | [default to null]
|
||||
**Owner** | **string** | | [optional] [default to null]
|
||||
**Ram** | [***ModelsDatacenterMemoryModel**](models.DatacenterMemoryModel.md) | | [default to null]
|
||||
**ShortDescription** | **string** | | [default to null]
|
||||
**Type_** | **string** | | [default to null]
|
||||
|
||||
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||
|
||||
|
10
selfapi/docs/ModelsDatacenterObject.md
Normal file
@ -0,0 +1,10 @@
|
||||
# ModelsDatacenterObject
|
||||
|
||||
## Properties
|
||||
Name | Type | Description | Notes
|
||||
------------ | ------------- | ------------- | -------------
|
||||
**ReferenceID** | [***PrimitiveObjectId**](primitive.ObjectID.md) | Data model ID | [optional] [default to null]
|
||||
|
||||
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||
|
||||
|
15
selfapi/docs/ModelsExecutionRequirementsModel.md
Normal file
@ -0,0 +1,15 @@
|
||||
# ModelsExecutionRequirementsModel
|
||||
|
||||
## Properties
|
||||
Name | Type | Description | Notes
|
||||
------------ | ------------- | ------------- | -------------
|
||||
**Cpus** | **int32** | | [default to null]
|
||||
**DiskIo** | **string** | | [optional] [default to null]
|
||||
**Gpus** | **int32** | Amount of GPUs needed | [optional] [default to null]
|
||||
**Parallel** | **bool** | | [optional] [default to null]
|
||||
**Ram** | **int32** | Units in MB | [default to null]
|
||||
**ScalingModel** | **int32** | | [optional] [default to null]
|
||||
|
||||
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||
|
||||
|
11
selfapi/docs/ModelsRepositoryModel.md
Normal file
@ -0,0 +1,11 @@
|
||||
# ModelsRepositoryModel
|
||||
|
||||
## Properties
|
||||
Name | Type | Description | Notes
|
||||
------------ | ------------- | ------------- | -------------
|
||||
**Credentials** | **string** | | [optional] [default to null]
|
||||
**Url** | **string** | | [optional] [default to null]
|
||||
|
||||
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||
|
||||
|
13
selfapi/docs/ModelsScheduleDb.md
Normal file
@ -0,0 +1,13 @@
|
||||
# ModelsScheduleDb
|
||||
|
||||
## Properties
|
||||
Name | Type | Description | Notes
|
||||
------------ | ------------- | ------------- | -------------
|
||||
**ResourceQty** | [***ModelsExecutionRequirementsModel**](models.ExecutionRequirementsModel.md) | | [optional] [default to null]
|
||||
**StartDate** | **string** | | [optional] [default to null]
|
||||
**StopDate** | **string** | | [optional] [default to null]
|
||||
**Workflow** | **string** | | [optional] [default to null]
|
||||
|
||||
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||
|
||||
|
11
selfapi/docs/ModelsScheduleInfo.md
Normal file
@ -0,0 +1,11 @@
|
||||
# ModelsScheduleInfo
|
||||
|
||||
## Properties
|
||||
Name | Type | Description | Notes
|
||||
------------ | ------------- | ------------- | -------------
|
||||
**NextExecutions** | **[]string** | | [optional] [default to null]
|
||||
**Total** | **int64** | | [optional] [default to null]
|
||||
|
||||
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||
|
||||
|
9
selfapi/docs/ModelsScheduleTime.md
Normal file
@ -0,0 +1,9 @@
|
||||
# ModelsScheduleTime
|
||||
|
||||
## Properties
|
||||
Name | Type | Description | Notes
|
||||
------------ | ------------- | ------------- | -------------
|
||||
|
||||
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||
|
||||
|
13
selfapi/docs/ModelsSearchResult.md
Normal file
@ -0,0 +1,13 @@
|
||||
# ModelsSearchResult
|
||||
|
||||
## Properties
|
||||
Name | Type | Description | Notes
|
||||
------------ | ------------- | ------------- | -------------
|
||||
**Computing** | [**[]ModelsComputingModel**](models.ComputingModel.md) | | [default to null]
|
||||
**Data** | [**[]ModelsDataModel**](models.DataModel.md) | | [optional] [default to null]
|
||||
**Datacenter** | [**[]ModelsDatacenterModel**](models.DatacenterModel.md) | | [optional] [default to null]
|
||||
**Storage** | [**[]ModelsStorageModel**](models.StorageModel.md) | | [optional] [default to null]
|
||||
|
||||
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||
|
||||
|
21
selfapi/docs/ModelsStorageModel.md
Normal file
@ -0,0 +1,21 @@
|
||||
# ModelsStorageModel
|
||||
|
||||
## Properties
|
||||
Name | Type | Description | Notes
|
||||
------------ | ------------- | ------------- | -------------
|
||||
**DCacronym** | **string** | Unique ID of the DC where it is the storage | [optional] [default to null]
|
||||
**ID** | **string** | | [default to null]
|
||||
**BookingPrice** | **int32** | | [optional] [default to null]
|
||||
**Description** | **string** | | [optional] [default to null]
|
||||
**Encryption** | **bool** | | [optional] [default to null]
|
||||
**Logo** | **string** | | [optional] [default to null]
|
||||
**Name** | **string** | | [optional] [default to null]
|
||||
**Redundancy** | **string** | | [optional] [default to null]
|
||||
**ShortDescription** | **string** | | [optional] [default to null]
|
||||
**Size** | **int32** | | [optional] [default to null]
|
||||
**Throughput** | **string** | | [optional] [default to null]
|
||||
**Type_** | **string** | | [optional] [default to null]
|
||||
|
||||
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||
|
||||
|
20
selfapi/docs/ModelsStorageNewModel.md
Normal file
@ -0,0 +1,20 @@
|
||||
# ModelsStorageNewModel
|
||||
|
||||
## Properties
|
||||
Name | Type | Description | Notes
|
||||
------------ | ------------- | ------------- | -------------
|
||||
**DCacronym** | **string** | Unique ID of the DC where it is the storage | [default to null]
|
||||
**BookingPrice** | **int32** | | [optional] [default to null]
|
||||
**Description** | **string** | | [default to null]
|
||||
**Encryption** | **bool** | | [optional] [default to null]
|
||||
**Logo** | **string** | | [default to null]
|
||||
**Name** | **string** | | [default to null]
|
||||
**Redundancy** | **string** | | [optional] [default to null]
|
||||
**ShortDescription** | **string** | | [default to null]
|
||||
**Size** | **int32** | | [default to null]
|
||||
**Throughput** | **string** | | [optional] [default to null]
|
||||
**Type_** | **string** | | [default to null]
|
||||
|
||||
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||
|
||||
|
12
selfapi/docs/ModelsStorageObject.md
Normal file
@ -0,0 +1,12 @@
|
||||
# ModelsStorageObject
|
||||
|
||||
## Properties
|
||||
Name | Type | Description | Notes
|
||||
------------ | ------------- | ------------- | -------------
|
||||
**Inputs** | **[]string** | | [optional] [default to null]
|
||||
**Outputs** | **[]string** | | [optional] [default to null]
|
||||
**ReferenceID** | [***PrimitiveObjectId**](primitive.ObjectID.md) | Storage model ID | [optional] [default to null]
|
||||
|
||||
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||
|
||||
|
15
selfapi/docs/ModelsWorkflow.md
Normal file
@ -0,0 +1,15 @@
|
||||
# ModelsWorkflow
|
||||
|
||||
## Properties
|
||||
Name | Type | Description | Notes
|
||||
------------ | ------------- | ------------- | -------------
|
||||
**MxgraphXML** | **string** | State of the mxgraph | [optional] [default to null]
|
||||
**Computing** | [***ModelsComputingObject**](models.ComputingObject.md) | | [optional] [default to null]
|
||||
**Data** | [***ModelsDataObject**](models.DataObject.md) | | [optional] [default to null]
|
||||
**Datacenter** | [***ModelsDatacenterObject**](models.DatacenterObject.md) | | [optional] [default to null]
|
||||
**Schedules** | [***ModelsWorkflowSchedule**](models.WorkflowSchedule.md) | | [optional] [default to null]
|
||||
**Storage** | [***ModelsStorageObject**](models.StorageObject.md) | | [optional] [default to null]
|
||||
|
||||
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||
|
||||
|
16
selfapi/docs/ModelsWorkflowSchedule.md
Normal file
@ -0,0 +1,16 @@
|
||||
# ModelsWorkflowSchedule
|
||||
|
||||
## Properties
|
||||
Name | Type | Description | Notes
|
||||
------------ | ------------- | ------------- | -------------
|
||||
**IsService** | **bool** | Service: true, Task: false | [optional] [default to null]
|
||||
**StartDate** | **string** | | [optional] [default to null]
|
||||
**StopDate** | **string** | | [optional] [default to null]
|
||||
**Cron** | **string** | | [optional] [default to null]
|
||||
**Duration** | **int32** | Durantion in seconds | [optional] [default to null]
|
||||
**Events** | **string** | | [optional] [default to null]
|
||||
**IsBooked** | **bool** | | [optional] [default to null]
|
||||
|
||||
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||
|
||||
|
15
selfapi/docs/ModelsWorkspace.md
Normal file
@ -0,0 +1,15 @@
|
||||
# ModelsWorkspace
|
||||
|
||||
## Properties
|
||||
Name | Type | Description | Notes
|
||||
------------ | ------------- | ------------- | -------------
|
||||
**Workflows** | [***ModelsWorkflow**](models.Workflow.md) | | [optional] [default to null]
|
||||
**Computing** | **[]string** | | [optional] [default to null]
|
||||
**Data** | **[]string** | | [optional] [default to null]
|
||||
**Datacenter** | **[]string** | | [optional] [default to null]
|
||||
**Storage** | **[]string** | | [optional] [default to null]
|
||||
**UserId** | **string** | | [optional] [default to null]
|
||||
|
||||
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||
|
||||
|