Compare commits
	
		
			6 Commits
		
	
	
		
			fd8e397e16
			...
			8eeae90b67
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 8eeae90b67 | |||
| 709e0300f9 | |||
| bff909abbb | |||
| a53dbccc23 | |||
| 43579a479f | |||
| ea69be8df1 | 
@@ -12,4 +12,9 @@ If default Swagger page is displayed instead of tyour api, change url in swagger
 | 
			
		||||
    url: "swagger.json"
 | 
			
		||||
 | 
			
		||||
Note on particular process :
 | 
			
		||||
- set a bookin delete all related workflow booking before creating new ones. (no update of existing ones)
 | 
			
		||||
- set a bookin delete all related workflow booking before creating new ones. (no update of existing ones)
 | 
			
		||||
 | 
			
		||||
# Docker Kube Settings
 | 
			
		||||
 | 
			
		||||
Set up your base64 key from your ~/.kube/config.
 | 
			
		||||
Don't forget to set up your external IP in docker_datacenter.json
 | 
			
		||||
							
								
								
									
										22
									
								
								conf/config.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								conf/config.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
			
		||||
package conf
 | 
			
		||||
 | 
			
		||||
import "sync"
 | 
			
		||||
 | 
			
		||||
type Config struct {
 | 
			
		||||
	Mode     string
 | 
			
		||||
	KubeHost string
 | 
			
		||||
	KubePort string
 | 
			
		||||
	KubeCA   string
 | 
			
		||||
	KubeCert string
 | 
			
		||||
	KubeData string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var instance *Config
 | 
			
		||||
var once sync.Once
 | 
			
		||||
 | 
			
		||||
func GetConfig() *Config {
 | 
			
		||||
	once.Do(func() {
 | 
			
		||||
		instance = &Config{}
 | 
			
		||||
	})
 | 
			
		||||
	return instance
 | 
			
		||||
}
 | 
			
		||||
@@ -4,12 +4,13 @@ import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"oc-datacenter/infrastructure"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	oclib "cloud.o-forge.io/core/oc-lib"
 | 
			
		||||
	"cloud.o-forge.io/core/oc-lib/dbs"
 | 
			
		||||
	"cloud.o-forge.io/core/oc-lib/models/booking"
 | 
			
		||||
	b "cloud.o-forge.io/core/oc-lib/models/booking"
 | 
			
		||||
	"cloud.o-forge.io/core/oc-lib/models/workflow_execution"
 | 
			
		||||
	beego "github.com/beego/beego/v2/server/web"
 | 
			
		||||
	"go.mongodb.org/mongo-driver/bson/primitive"
 | 
			
		||||
)
 | 
			
		||||
@@ -19,10 +20,40 @@ type BookingController struct {
 | 
			
		||||
	beego.Controller
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// @Title Search
 | 
			
		||||
// @Description search bookings by execution
 | 
			
		||||
// @Param	id		path 	string	true		"id execution"
 | 
			
		||||
// @Param	is_draft		query 	string	false		"draft wished"
 | 
			
		||||
// @Success 200 {workspace} models.workspace
 | 
			
		||||
// @router /search/execution/:id [get]
 | 
			
		||||
func (o *BookingController) ExecutionSearch() {
 | 
			
		||||
	/*
 | 
			
		||||
	* This is a sample of how to use the search function
 | 
			
		||||
	* The search function is used to search for data in the database
 | 
			
		||||
	* The search function takes in a filter and a data type
 | 
			
		||||
	* The filter is a struct that contains the search parameters
 | 
			
		||||
	* The data type is an enum that specifies the type of data to search for
 | 
			
		||||
	* The search function returns a list of data that matches the filter
 | 
			
		||||
	* The data is then returned as a json object
 | 
			
		||||
	 */
 | 
			
		||||
	// store and return Id or post with UUID
 | 
			
		||||
	user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request)
 | 
			
		||||
	id := o.Ctx.Input.Param(":id")
 | 
			
		||||
	isDraft := o.Ctx.Input.Query("is_draft")
 | 
			
		||||
	f := dbs.Filters{
 | 
			
		||||
		Or: map[string][]dbs.Filter{ // filter by name if no filters are provided
 | 
			
		||||
			"execution_id": {{Operator: dbs.EQUAL.String(), Value: id}},
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
	o.Data["json"] = oclib.NewRequest(oclib.LibDataEnum(oclib.BOOKING), user, peerID, groups, nil).Search(&f, "", isDraft == "true")
 | 
			
		||||
	o.ServeJSON()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// @Title Search
 | 
			
		||||
// @Description search bookings
 | 
			
		||||
// @Param	start_date		path 	string	true		"the word search you want to get"
 | 
			
		||||
// @Param	end_date		path 	string	true		"the word search you want to get"
 | 
			
		||||
// @Param	is_draft		query 	string	false		"draft wished"
 | 
			
		||||
// @Success 200 {workspace} models.workspace
 | 
			
		||||
// @router /search/:start_date/:end_date [get]
 | 
			
		||||
func (o *BookingController) Search() {
 | 
			
		||||
@@ -36,25 +67,30 @@ func (o *BookingController) Search() {
 | 
			
		||||
	* The data is then returned as a json object
 | 
			
		||||
	 */
 | 
			
		||||
	// store and return Id or post with UUID
 | 
			
		||||
	user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request)
 | 
			
		||||
	start_date, _ := time.Parse("2006-01-02", o.Ctx.Input.Param(":start_date"))
 | 
			
		||||
	end_date, _ := time.Parse("2006-01-02", o.Ctx.Input.Param(":end_date"))
 | 
			
		||||
	isDraft := o.Ctx.Input.Query("is_draft")
 | 
			
		||||
	sd := primitive.NewDateTimeFromTime(start_date)
 | 
			
		||||
	ed := primitive.NewDateTimeFromTime(end_date)
 | 
			
		||||
	f := dbs.Filters{
 | 
			
		||||
		And: map[string][]dbs.Filter{
 | 
			
		||||
			"workflowexecution.execution_date": {{Operator: "gte", Value: sd}, {Operator: "lte", Value: ed}},
 | 
			
		||||
			"execution_date": {{Operator: "gte", Value: sd}, {Operator: "lte", Value: ed}},
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
	o.Data["json"] = oclib.Search(&f, "", oclib.LibDataEnum(oclib.BOOKING))
 | 
			
		||||
	o.Data["json"] = oclib.NewRequest(oclib.LibDataEnum(oclib.BOOKING), user, peerID, groups, nil).Search(&f, "", isDraft == "true")
 | 
			
		||||
	o.ServeJSON()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// @Title GetAll
 | 
			
		||||
// @Description find booking by id
 | 
			
		||||
// @Param	is_draft		query 	string	false		"draft wished"
 | 
			
		||||
// @Success 200 {booking} models.booking
 | 
			
		||||
// @router / [get]
 | 
			
		||||
func (o *BookingController) GetAll() {
 | 
			
		||||
	o.Data["json"] = oclib.LoadAll(oclib.LibDataEnum(oclib.BOOKING))
 | 
			
		||||
	user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request)
 | 
			
		||||
	isDraft := o.Ctx.Input.Query("is_draft")
 | 
			
		||||
	o.Data["json"] = oclib.NewRequest(oclib.LibDataEnum(oclib.BOOKING), user, peerID, groups, nil).LoadAll(isDraft == "true")
 | 
			
		||||
	o.ServeJSON()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -64,8 +100,43 @@ func (o *BookingController) GetAll() {
 | 
			
		||||
// @Success 200 {booking} models.booking
 | 
			
		||||
// @router /:id [get]
 | 
			
		||||
func (o *BookingController) Get() {
 | 
			
		||||
	user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request)
 | 
			
		||||
	id := o.Ctx.Input.Param(":id")
 | 
			
		||||
	o.Data["json"] = oclib.LoadOne(oclib.LibDataEnum(oclib.BOOKING), id)
 | 
			
		||||
	o.Data["json"] = oclib.NewRequest(oclib.LibDataEnum(oclib.BOOKING), user, peerID, groups, nil).LoadOne(id)
 | 
			
		||||
	o.ServeJSON()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// @Title Update
 | 
			
		||||
// @Description create computes
 | 
			
		||||
// @Param	id		path 	string	true		"the compute id you want to get"
 | 
			
		||||
// @Param	body		body 	models.compute	true		"The compute content"
 | 
			
		||||
// @Success 200 {compute} models.compute
 | 
			
		||||
// @router /:id [put]
 | 
			
		||||
func (o *BookingController) Put() {
 | 
			
		||||
	user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request)
 | 
			
		||||
	// store and return Id or post with UUID
 | 
			
		||||
	var res map[string]interface{}
 | 
			
		||||
	id := o.Ctx.Input.Param(":id")
 | 
			
		||||
	book := oclib.NewRequest(oclib.LibDataEnum(oclib.BOOKING), user, peerID, groups, nil).LoadOne(id)
 | 
			
		||||
	if book.Code != 200 {
 | 
			
		||||
		o.Data["json"] = map[string]interface{}{
 | 
			
		||||
			"data":  nil,
 | 
			
		||||
			"code":  book.Code,
 | 
			
		||||
			"error": book.Err,
 | 
			
		||||
		}
 | 
			
		||||
		o.ServeJSON()
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	booking := book.Data.(*b.Booking)
 | 
			
		||||
	if time.Now().After(booking.ExpectedStartDate) {
 | 
			
		||||
		o.Data["json"] = oclib.NewRequest(oclib.LibDataEnum(oclib.BOOKING), user, peerID, groups, nil).UpdateOne(res, id)
 | 
			
		||||
	} else {
 | 
			
		||||
		o.Data["json"] = map[string]interface{}{
 | 
			
		||||
			"data":  nil,
 | 
			
		||||
			"code":  409,
 | 
			
		||||
			"error": "booking is not already started",
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	o.ServeJSON()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -74,6 +145,7 @@ func (o *BookingController) Get() {
 | 
			
		||||
// @Param	id	path 	string		"id of the datacenter"
 | 
			
		||||
// @Param	start_date		path 	string		"the booking start date" format "2006-01-02T15:04:05"
 | 
			
		||||
// @Param	end_date		path 	string		"the booking end date" format "2006-01-02T15:04:05"
 | 
			
		||||
// @Param	is_draft		query 	string	false		"draft wished"
 | 
			
		||||
// @Success 200 {object} models.object
 | 
			
		||||
// @router /check/:id/:start_date/:end_date [get]
 | 
			
		||||
func (o *BookingController) Check() {
 | 
			
		||||
@@ -81,7 +153,7 @@ func (o *BookingController) Check() {
 | 
			
		||||
	 * This function is used to check if a booking is available for a specific datacenter.
 | 
			
		||||
	 * It takes the following parameters:
 | 
			
		||||
	 * - id: the id of the datacenter
 | 
			
		||||
	 * - start_date: the start date of the booking
 | 
			
		||||
	 * - start_date: the start date of the booking/search/execution/:id
 | 
			
		||||
	 * - end_date: the end date of the booking
 | 
			
		||||
	 */
 | 
			
		||||
	id := o.Ctx.Input.Param(":id")
 | 
			
		||||
@@ -96,8 +168,8 @@ func (o *BookingController) Check() {
 | 
			
		||||
			"error": errors.New("invalid date format"),
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		booking := &b.Booking{}                                     // create a new booking object
 | 
			
		||||
		isAvailable, err2 := booking.CheckBooking(id, date, &date2) // check if the booking is available
 | 
			
		||||
		booking := &b.Booking{}                                 // create a new booking object
 | 
			
		||||
		isAvailable, err2 := booking.Check(id, date, &date2, 1) // check if the booking is available
 | 
			
		||||
		fmt.Println(isAvailable, err2)
 | 
			
		||||
		code := 200
 | 
			
		||||
		err := ""
 | 
			
		||||
@@ -119,12 +191,14 @@ func (o *BookingController) Check() {
 | 
			
		||||
	o.ServeJSON()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// @Title Post
 | 
			
		||||
// @Title Post.
 | 
			
		||||
// @Description create booking
 | 
			
		||||
// @Param	booking		body 	string	true		"the booking you want to post"
 | 
			
		||||
// @Param	is_draft		query 	string	false		"draft wished"
 | 
			
		||||
// @Success 200 {object} models.object
 | 
			
		||||
// @router / [post]
 | 
			
		||||
func (o *BookingController) Post() {
 | 
			
		||||
	fmt.Println("POST")
 | 
			
		||||
	/*
 | 
			
		||||
	 * This function is used to create a booking.
 | 
			
		||||
	 * It takes the following parameters:
 | 
			
		||||
@@ -133,15 +207,16 @@ func (o *BookingController) Post() {
 | 
			
		||||
	 * - datacenter_resource_id: the id of the datacenter
 | 
			
		||||
	 * - workflow_execution: the workflow execution
 | 
			
		||||
	 */
 | 
			
		||||
	var resp workflow_execution.WorkflowExecutions
 | 
			
		||||
	json.Unmarshal(o.Ctx.Input.CopyBody(10000), &resp)
 | 
			
		||||
	var resp booking.Booking
 | 
			
		||||
	user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request)
 | 
			
		||||
	json.Unmarshal(o.Ctx.Input.CopyBody(10000000), &resp)
 | 
			
		||||
	dc_id := resp.ResourceID
 | 
			
		||||
	// delete all previous bookings
 | 
			
		||||
	fmt.Println("Deleting previous bookings", resp)
 | 
			
		||||
	res := oclib.Search(&dbs.Filters{And: map[string][]dbs.Filter{
 | 
			
		||||
		"workflowexecution.workflow_id": {{Operator: dbs.EQUAL.String(), Value: resp.WorkflowID}},
 | 
			
		||||
		"compute_resource_id":           {{Operator: dbs.EQUAL.String(), Value: dc_id}},
 | 
			
		||||
	}}, "", oclib.LibDataEnum(oclib.BOOKING))
 | 
			
		||||
	isDraft := o.Ctx.Input.Query("is_draft")
 | 
			
		||||
	res := oclib.NewRequest(oclib.LibDataEnum(oclib.BOOKING), user, peerID, groups, nil).Search(&dbs.Filters{And: map[string][]dbs.Filter{
 | 
			
		||||
		"workflow_id": {{Operator: dbs.EQUAL.String(), Value: resp.WorkflowID}},
 | 
			
		||||
		"resource_id": {{Operator: dbs.EQUAL.String(), Value: dc_id}},
 | 
			
		||||
	}}, "", isDraft == "true")
 | 
			
		||||
	if res.Code != 200 {
 | 
			
		||||
		o.Data["json"] = map[string]interface{}{
 | 
			
		||||
			"data":  nil,
 | 
			
		||||
@@ -152,37 +227,62 @@ func (o *BookingController) Post() {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	for _, b := range res.Data { // delete all previous bookings
 | 
			
		||||
		oclib.DeleteOne(oclib.LibDataEnum(oclib.BOOKING), b.GetID())
 | 
			
		||||
		oclib.NewRequest(oclib.LibDataEnum(oclib.BOOKING), user, peerID, groups, nil).DeleteOne(b.GetID())
 | 
			
		||||
	}
 | 
			
		||||
	books := make([]interface{}, 0)
 | 
			
		||||
	errormsg := ""
 | 
			
		||||
	for _, exec := range resp.Executions { // create new bookings
 | 
			
		||||
		if ok, _ := (&b.Booking{}).CheckBooking(dc_id, *exec.ExecDate, exec.EndDate); !ok {
 | 
			
		||||
			res.Err += " -> the booking from " + exec.ExecDate.String() + " is already taken."
 | 
			
		||||
			o.Data["json"] = map[string]interface{}{
 | 
			
		||||
				"data":  nil,
 | 
			
		||||
				"code":  res.Code,
 | 
			
		||||
				"error": res.Err + " -> the booking from " + exec.ExecDate.String() + " is already taken.",
 | 
			
		||||
			}
 | 
			
		||||
			o.ServeJSON()
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		new := &b.Booking{
 | 
			
		||||
			ComputeResourceID: dc_id,
 | 
			
		||||
			WorkflowExecution: *exec,
 | 
			
		||||
		}
 | 
			
		||||
		// store the booking
 | 
			
		||||
		b := oclib.StoreOne(oclib.LibDataEnum(oclib.BOOKING), new.Serialize())
 | 
			
		||||
		if b.Code == 200 {
 | 
			
		||||
			books = append(books, b.Data)
 | 
			
		||||
		} else {
 | 
			
		||||
			errormsg += " -> " + b.Err
 | 
			
		||||
	b := oclib.NewRequest(oclib.LibDataEnum(oclib.BOOKING), user, peerID, groups, nil).StoreOne(resp.Serialize(&resp))
 | 
			
		||||
	if b.Code != 200 {
 | 
			
		||||
		o.Data["json"] = map[string]interface{}{
 | 
			
		||||
			"data":  nil,
 | 
			
		||||
			"code":  b.Code,
 | 
			
		||||
			"error": b.Err,
 | 
			
		||||
		}
 | 
			
		||||
		o.ServeJSON()
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	fmt.Println("there was an error creating the namespace", o.createNamespace(resp.ExecutionsID))
 | 
			
		||||
	o.Data["json"] = map[string]interface{}{
 | 
			
		||||
		"data":  books,
 | 
			
		||||
		"data":  []interface{}{b},
 | 
			
		||||
		"code":  200,
 | 
			
		||||
		"error": errormsg,
 | 
			
		||||
		"error": "",
 | 
			
		||||
	}
 | 
			
		||||
	o.ServeJSON()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (o *BookingController) createNamespace(ns string) error {
 | 
			
		||||
	/*
 | 
			
		||||
	 * This function is used to create a namespace.
 | 
			
		||||
	 * It takes the following parameters:
 | 
			
		||||
	 * - ns: the namespace you want to create
 | 
			
		||||
	 */
 | 
			
		||||
	serv, err := infrastructure.NewService()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	err = serv.CreateNamespace(o.Ctx.Request.Context(), ns)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	err = serv.CreateServiceAccount(o.Ctx.Request.Context(), ns)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	role := "argo-role"
 | 
			
		||||
	err = serv.CreateRole(o.Ctx.Request.Context(), ns, role,
 | 
			
		||||
		[][]string{
 | 
			
		||||
			{"coordination.k8s.io"},
 | 
			
		||||
			{""},
 | 
			
		||||
			{""}},
 | 
			
		||||
		[][]string{
 | 
			
		||||
			{"leases"},
 | 
			
		||||
			{"secrets"},
 | 
			
		||||
			{"pods"}},
 | 
			
		||||
		[][]string{
 | 
			
		||||
			{"get", "create", "update"},
 | 
			
		||||
			{"get"},
 | 
			
		||||
			{"patch"}})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	fmt.Println("ROLLLLLE BIND")
 | 
			
		||||
	return serv.CreateRoleBinding(o.Ctx.Request.Context(), ns, "argo-role-binding", role)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										85
									
								
								controllers/datacenter.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								controllers/datacenter.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,85 @@
 | 
			
		||||
package controllers
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	oclib "cloud.o-forge.io/core/oc-lib"
 | 
			
		||||
	"cloud.o-forge.io/core/oc-lib/dbs"
 | 
			
		||||
	beego "github.com/beego/beego/v2/server/web"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Operations about workspace
 | 
			
		||||
type DatacenterController struct {
 | 
			
		||||
	beego.Controller
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// @Title GetAll
 | 
			
		||||
// @Description find booking by id
 | 
			
		||||
// @Param	is_draft		query 	string	false		"draft wished"
 | 
			
		||||
// @Success 200 {booking} models.booking
 | 
			
		||||
// @router / [get]
 | 
			
		||||
func (o *DatacenterController) GetAll() {
 | 
			
		||||
	user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request)
 | 
			
		||||
	isDraft := o.Ctx.Input.Query("is_draft")
 | 
			
		||||
	storages := oclib.NewRequest(oclib.LibDataEnum(oclib.STORAGE_RESOURCE), user, peerID, groups, nil).Search(&dbs.Filters{
 | 
			
		||||
		Or: map[string][]dbs.Filter{
 | 
			
		||||
			"abstractintanciatedresource.abstractresource.abstractobject.creator_id": {{Operator: dbs.EQUAL.String(), Value: peerID}},
 | 
			
		||||
		},
 | 
			
		||||
	}, "", isDraft == "true")
 | 
			
		||||
	computes := oclib.NewRequest(oclib.LibDataEnum(oclib.COMPUTE_RESOURCE), user, peerID, groups, nil).Search(&dbs.Filters{
 | 
			
		||||
		Or: map[string][]dbs.Filter{
 | 
			
		||||
			"abstractintanciatedresource.abstractresource.abstractobject.creator_id": {{Operator: dbs.EQUAL.String(), Value: peerID}},
 | 
			
		||||
		},
 | 
			
		||||
	}, "", isDraft == "true")
 | 
			
		||||
	storages.Data = append(storages.Data, computes.Data...)
 | 
			
		||||
	if storages.Err != "" {
 | 
			
		||||
		storages.Err += " - " + computes.Err
 | 
			
		||||
	}
 | 
			
		||||
	o.Data["json"] = storages
 | 
			
		||||
	o.ServeJSON()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// @Title Get
 | 
			
		||||
// @Description find booking by id
 | 
			
		||||
// @Param	id		path 	string	true		"the id you want to get"
 | 
			
		||||
// @Param	is_draft		query 	string	false		"draft wished"
 | 
			
		||||
// @Success 200 {booking} models.booking
 | 
			
		||||
// @router /:id [get]
 | 
			
		||||
func (o *DatacenterController) Get() {
 | 
			
		||||
	user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request)
 | 
			
		||||
	isDraft := o.Ctx.Input.Query("is_draft")
 | 
			
		||||
	id := o.Ctx.Input.Param(":id")
 | 
			
		||||
	storages := oclib.NewRequest(oclib.LibDataEnum(oclib.STORAGE_RESOURCE), user, peerID, groups, nil).Search(&dbs.Filters{
 | 
			
		||||
		Or: map[string][]dbs.Filter{
 | 
			
		||||
			"abstractintanciatedresource.abstractresource.abstractobject.id":         {{Operator: dbs.EQUAL.String(), Value: id}},
 | 
			
		||||
			"abstractintanciatedresource.abstractresource.abstractobject.creator_id": {{Operator: dbs.EQUAL.String(), Value: peerID}},
 | 
			
		||||
		},
 | 
			
		||||
	}, "", isDraft == "true")
 | 
			
		||||
	if len(storages.Data) == 0 {
 | 
			
		||||
		computes := oclib.NewRequest(oclib.LibDataEnum(oclib.COMPUTE_RESOURCE), user, peerID, groups, nil).Search(&dbs.Filters{
 | 
			
		||||
			Or: map[string][]dbs.Filter{
 | 
			
		||||
				"abstractintanciatedresource.abstractresource.abstractobject.id":         {{Operator: dbs.EQUAL.String(), Value: id}},
 | 
			
		||||
				"abstractintanciatedresource.abstractresource.abstractobject.creator_id": {{Operator: dbs.EQUAL.String(), Value: peerID}},
 | 
			
		||||
			},
 | 
			
		||||
		}, "", isDraft == "true")
 | 
			
		||||
		if len(computes.Data) == 0 {
 | 
			
		||||
			o.Data["json"] = map[string]interface{}{
 | 
			
		||||
				"data": nil,
 | 
			
		||||
				"code": computes.Code,
 | 
			
		||||
				"err":  computes.Err,
 | 
			
		||||
			}
 | 
			
		||||
		} else {
 | 
			
		||||
			o.Data["json"] = map[string]interface{}{
 | 
			
		||||
				"data": computes.Data[0],
 | 
			
		||||
				"code": computes.Code,
 | 
			
		||||
				"err":  computes.Err,
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	} else {
 | 
			
		||||
		o.Data["json"] = map[string]interface{}{
 | 
			
		||||
			"data": storages.Data[0],
 | 
			
		||||
			"code": storages.Code,
 | 
			
		||||
			"err":  storages.Err,
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	o.ServeJSON()
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										53
									
								
								controllers/session.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								controllers/session.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,53 @@
 | 
			
		||||
package controllers
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"oc-datacenter/infrastructure"
 | 
			
		||||
	"strconv"
 | 
			
		||||
 | 
			
		||||
	beego "github.com/beego/beego/v2/server/web"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type SessionController struct {
 | 
			
		||||
	beego.Controller
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// @Title GetToken
 | 
			
		||||
// @Description find booking by id
 | 
			
		||||
// @Param	id	path 	string		"id of the datacenter"
 | 
			
		||||
// @Param	duration	path 	string		"duration of the token"
 | 
			
		||||
// @Success 200 {booking} models.booking
 | 
			
		||||
// @router /token/:id/:duration [get]
 | 
			
		||||
func (o *SessionController) GetToken() {
 | 
			
		||||
	id := o.Ctx.Input.Param(":id")
 | 
			
		||||
	durationSTR := o.Ctx.Input.Param(":duration")
 | 
			
		||||
 | 
			
		||||
	duration, err := strconv.Atoi(durationSTR)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		// change code to 400
 | 
			
		||||
		o.Ctx.Output.SetStatus(400)
 | 
			
		||||
		o.Data["json"] = map[string]string{"error": "duration invalid"}
 | 
			
		||||
		o.ServeJSON()
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	serv, err := infrastructure.NewService()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		// change code to 500
 | 
			
		||||
		o.Ctx.Output.SetStatus(500)
 | 
			
		||||
		o.Data["json"] = map[string]string{"error": err.Error()}
 | 
			
		||||
		o.ServeJSON()
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	fmt.Println("BLAPO", id, duration)
 | 
			
		||||
	token, err := serv.GetToken(o.Ctx.Request.Context(), id, duration)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		// change code to 500
 | 
			
		||||
		o.Ctx.Output.SetStatus(500)
 | 
			
		||||
		o.Data["json"] = map[string]string{"error": err.Error()}
 | 
			
		||||
		o.ServeJSON()
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	o.Data["json"] = token
 | 
			
		||||
	o.ServeJSON()
 | 
			
		||||
}
 | 
			
		||||
@@ -1,5 +1,9 @@
 | 
			
		||||
{
 | 
			
		||||
    "MONGO_URL":"mongodb://mongo:27017/", 
 | 
			
		||||
    "NATS_URL":"nats://nats:4222",
 | 
			
		||||
    "MONGO_DATABASE":"DC_myDC"
 | 
			
		||||
    "MONGO_DATABASE":"DC_myDC",
 | 
			
		||||
    "KUBERNETES_SERVICE_HOST" : "192.168.1.69",
 | 
			
		||||
    "KUBE_CA" : "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJkekNDQVIyZ0F3SUJBZ0lCQURBS0JnZ3Foa2pPUFFRREFqQWpNU0V3SHdZRFZRUUREQmhyTTNNdGMyVnkKZG1WeUxXTmhRREUzTWpNeE1USXdNell3SGhjTk1qUXdPREE0TVRBeE16VTJXaGNOTXpRd09EQTJNVEF4TXpVMgpXakFqTVNFd0h3WURWUVFEREJock0zTXRjMlZ5ZG1WeUxXTmhRREUzTWpNeE1USXdNell3V1RBVEJnY3Foa2pPClBRSUJCZ2dxaGtqT1BRTUJCd05DQUFTVlk3ZHZhNEdYTVdkMy9jMlhLN3JLYjlnWXgyNSthaEE0NmkyNVBkSFAKRktQL2UxSVMyWVF0dzNYZW1TTUQxaStZdzJSaVppNUQrSVZUamNtNHdhcnFvMEl3UURBT0JnTlZIUThCQWY4RQpCQU1DQXFRd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVWtlUVJpNFJiODduME5yRnZaWjZHClc2SU55NnN3Q2dZSUtvWkl6ajBFQXdJRFNBQXdSUUlnRXA5ck04WmdNclRZSHYxZjNzOW5DZXZZeWVVa3lZUk4KWjUzazdoaytJS1FDSVFDbk05TnVGKzlTakIzNDFacGZ5ays2NEpWdkpSM3BhcmVaejdMd2lhNm9kdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K",
 | 
			
		||||
    "KUBE_CERT":"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJrVENDQVRlZ0F3SUJBZ0lJWUxWNkFPQkdrU1F3Q2dZSUtvWkl6ajBFQXdJd0l6RWhNQjhHQTFVRUF3d1kKYXpOekxXTnNhV1Z1ZEMxallVQXhOekl6TVRFeU1ETTJNQjRYRFRJME1EZ3dPREV3TVRNMU5sb1hEVEkxTURndwpPREV3TVRNMU5sb3dNREVYTUJVR0ExVUVDaE1PYzNsemRHVnRPbTFoYzNSbGNuTXhGVEFUQmdOVkJBTVRESE41CmMzUmxiVHBoWkcxcGJqQlpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDlBd0VIQTBJQUJGQ2Q1MFdPeWdlQ2syQzcKV2FrOWY4MVAvSkJieVRIajRWOXBsTEo0ck5HeHFtSjJOb2xROFYxdUx5RjBtOTQ2Nkc0RmRDQ2dqaXFVSk92Swp3NVRPNnd5alNEQkdNQTRHQTFVZER3RUIvd1FFQXdJRm9EQVRCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0RBakFmCkJnTlZIU01FR0RBV2dCVFJkOFI5cXVWK2pjeUVmL0ovT1hQSzMyS09XekFLQmdncWhrak9QUVFEQWdOSUFEQkYKQWlFQTArbThqTDBJVldvUTZ0dnB4cFo4NVlMalF1SmpwdXM0aDdnSXRxS3NmUVVDSUI2M2ZNdzFBMm5OVWU1TgpIUGZOcEQwSEtwcVN0Wnk4djIyVzliYlJUNklZCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJlRENDQVIyZ0F3SUJBZ0lCQURBS0JnZ3Foa2pPUFFRREFqQWpNU0V3SHdZRFZRUUREQmhyTTNNdFkyeHAKWlc1MExXTmhRREUzTWpNeE1USXdNell3SGhjTk1qUXdPREE0TVRBeE16VTJXaGNOTXpRd09EQTJNVEF4TXpVMgpXakFqTVNFd0h3WURWUVFEREJock0zTXRZMnhwWlc1MExXTmhRREUzTWpNeE1USXdNell3V1RBVEJnY3Foa2pPClBRSUJCZ2dxaGtqT1BRTUJCd05DQUFRc3hXWk9pbnIrcVp4TmFEQjVGMGsvTDF5cE01VHAxOFRaeU92ektJazQKRTFsZWVqUm9STW0zNmhPeVljbnN3d3JoNnhSUnBpMW5RdGhyMzg0S0Z6MlBvMEl3UURBT0JnTlZIUThCQWY4RQpCQU1DQXFRd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVTBYZkVmYXJsZm8zTWhIL3lmemx6Cnl0OWlqbHN3Q2dZSUtvWkl6ajBFQXdJRFNRQXdSZ0loQUxJL2dNYnNMT3MvUUpJa3U2WHVpRVMwTEE2cEJHMXgKcnBlTnpGdlZOekZsQWlFQW1wdjBubjZqN3M0MVI0QzFNMEpSL0djNE53MHdldlFmZWdEVGF1R2p3cFk9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K",
 | 
			
		||||
    "KUBE_DATA": "LS0tLS1CRUdJTiBFQyBQUklWQVRFIEtFWS0tLS0tCk1IY0NBUUVFSU5ZS1BFb1dhd1NKUzJlRW5oWmlYMk5VZlY1ZlhKV2krSVNnV09TNFE5VTlvQW9HQ0NxR1NNNDkKQXdFSG9VUURRZ0FFVUozblJZN0tCNEtUWUx0WnFUMS96VS84a0Z2Sk1lUGhYMm1Vc25pczBiR3FZblkyaVZEeApYVzR2SVhTYjNqcm9iZ1YwSUtDT0twUWs2OHJEbE03ckRBPT0KLS0tLS1FTkQgRUMgUFJJVkFURSBLRVktLS0tLQo="
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										44
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										44
									
								
								go.mod
									
									
									
									
									
								
							@@ -1,57 +1,87 @@
 | 
			
		||||
module oc-datacenter
 | 
			
		||||
 | 
			
		||||
go 1.22.0
 | 
			
		||||
go 1.23.0
 | 
			
		||||
 | 
			
		||||
toolchain go1.22.4
 | 
			
		||||
toolchain go1.23.3
 | 
			
		||||
 | 
			
		||||
require (
 | 
			
		||||
	cloud.o-forge.io/core/oc-lib v0.0.0-20250110163958-fd1c579ec418
 | 
			
		||||
	cloud.o-forge.io/core/oc-lib v0.0.0-20250213085018-271cc2caa026
 | 
			
		||||
	github.com/beego/beego/v2 v2.3.1
 | 
			
		||||
	go.mongodb.org/mongo-driver v1.17.1
 | 
			
		||||
	k8s.io/api v0.32.1
 | 
			
		||||
	k8s.io/apimachinery v0.32.1
 | 
			
		||||
	k8s.io/client-go v0.32.1
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
require (
 | 
			
		||||
	github.com/beorn7/perks v1.0.1 // indirect
 | 
			
		||||
	github.com/biter777/countries v1.7.5 // indirect
 | 
			
		||||
	github.com/cespare/xxhash/v2 v2.3.0 // indirect
 | 
			
		||||
	github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
 | 
			
		||||
	github.com/emicklei/go-restful/v3 v3.11.0 // indirect
 | 
			
		||||
	github.com/fxamacker/cbor/v2 v2.7.0 // indirect
 | 
			
		||||
	github.com/gabriel-vasile/mimetype v1.4.6 // indirect
 | 
			
		||||
	github.com/go-logr/logr v1.4.2 // indirect
 | 
			
		||||
	github.com/go-openapi/jsonpointer v0.21.0 // indirect
 | 
			
		||||
	github.com/go-openapi/jsonreference v0.20.2 // indirect
 | 
			
		||||
	github.com/go-openapi/swag v0.23.0 // indirect
 | 
			
		||||
	github.com/go-playground/locales v0.14.1 // indirect
 | 
			
		||||
	github.com/go-playground/universal-translator v0.18.1 // indirect
 | 
			
		||||
	github.com/go-playground/validator/v10 v10.22.1 // indirect
 | 
			
		||||
	github.com/gogo/protobuf v1.3.2 // indirect
 | 
			
		||||
	github.com/golang/protobuf v1.5.4 // indirect
 | 
			
		||||
	github.com/golang/snappy v0.0.4 // indirect
 | 
			
		||||
	github.com/google/gnostic-models v0.6.8 // indirect
 | 
			
		||||
	github.com/google/go-cmp v0.6.0 // indirect
 | 
			
		||||
	github.com/google/gofuzz v1.2.0 // indirect
 | 
			
		||||
	github.com/google/uuid v1.6.0 // indirect
 | 
			
		||||
	github.com/goraz/onion v0.1.3 // indirect
 | 
			
		||||
	github.com/hashicorp/golang-lru v1.0.2 // indirect
 | 
			
		||||
	github.com/josharian/intern v1.0.0 // indirect
 | 
			
		||||
	github.com/json-iterator/go v1.1.12 // indirect
 | 
			
		||||
	github.com/klauspost/compress v1.17.11 // indirect
 | 
			
		||||
	github.com/kr/text v0.2.0 // indirect
 | 
			
		||||
	github.com/leodido/go-urn v1.4.0 // indirect
 | 
			
		||||
	github.com/mailru/easyjson v0.7.7 // indirect
 | 
			
		||||
	github.com/mattn/go-colorable v0.1.13 // indirect
 | 
			
		||||
	github.com/mattn/go-isatty v0.0.20 // indirect
 | 
			
		||||
	github.com/mitchellh/mapstructure v1.5.0 // indirect
 | 
			
		||||
	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
 | 
			
		||||
	github.com/modern-go/reflect2 v1.0.2 // indirect
 | 
			
		||||
	github.com/montanaflynn/stats v0.7.1 // indirect
 | 
			
		||||
	github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
 | 
			
		||||
	github.com/nats-io/nats.go v1.37.0 // indirect
 | 
			
		||||
	github.com/nats-io/nkeys v0.4.7 // indirect
 | 
			
		||||
	github.com/nats-io/nuid v1.0.1 // indirect
 | 
			
		||||
	github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
 | 
			
		||||
	github.com/pkg/errors v0.9.1 // indirect
 | 
			
		||||
	github.com/prometheus/client_golang v1.20.5 // indirect
 | 
			
		||||
	github.com/prometheus/client_model v0.6.1 // indirect
 | 
			
		||||
	github.com/prometheus/common v0.60.1 // indirect
 | 
			
		||||
	github.com/prometheus/procfs v0.15.1 // indirect
 | 
			
		||||
	github.com/robfig/cron/v3 v3.0.1 // indirect
 | 
			
		||||
	github.com/rogpeppe/go-internal v1.11.0 // indirect
 | 
			
		||||
	github.com/robfig/cron v1.2.0 // indirect
 | 
			
		||||
	github.com/rs/zerolog v1.33.0 // indirect
 | 
			
		||||
	github.com/shiena/ansicolor v0.0.0-20230509054315-a9deabde6e02 // indirect
 | 
			
		||||
	github.com/smartystreets/goconvey v1.7.2 // indirect
 | 
			
		||||
	github.com/x448/float16 v0.8.4 // indirect
 | 
			
		||||
	github.com/xdg-go/pbkdf2 v1.0.0 // indirect
 | 
			
		||||
	github.com/xdg-go/scram v1.1.2 // indirect
 | 
			
		||||
	github.com/xdg-go/stringprep v1.0.4 // indirect
 | 
			
		||||
	github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect
 | 
			
		||||
	golang.org/x/crypto v0.28.0 // indirect
 | 
			
		||||
	golang.org/x/net v0.30.0 // indirect
 | 
			
		||||
	golang.org/x/oauth2 v0.23.0 // indirect
 | 
			
		||||
	golang.org/x/sync v0.8.0 // indirect
 | 
			
		||||
	golang.org/x/sys v0.26.0 // indirect
 | 
			
		||||
	golang.org/x/term v0.25.0 // indirect
 | 
			
		||||
	golang.org/x/text v0.19.0 // indirect
 | 
			
		||||
	golang.org/x/time v0.7.0 // indirect
 | 
			
		||||
	google.golang.org/protobuf v1.35.1 // indirect
 | 
			
		||||
	gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
 | 
			
		||||
	gopkg.in/inf.v0 v0.9.1 // indirect
 | 
			
		||||
	gopkg.in/yaml.v3 v3.0.1 // indirect
 | 
			
		||||
	k8s.io/klog/v2 v2.130.1 // indirect
 | 
			
		||||
	k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f // indirect
 | 
			
		||||
	k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect
 | 
			
		||||
	sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect
 | 
			
		||||
	sigs.k8s.io/structured-merge-diff/v4 v4.4.2 // indirect
 | 
			
		||||
	sigs.k8s.io/yaml v1.4.0 // indirect
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										116
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										116
									
								
								go.sum
									
									
									
									
									
								
							@@ -1,10 +1,12 @@
 | 
			
		||||
cloud.o-forge.io/core/oc-lib v0.0.0-20250110163958-fd1c579ec418 h1:24nc5qA6AkV6pIbJJeRASeUZmWuGkl+FO/r2oXazJ8w=
 | 
			
		||||
cloud.o-forge.io/core/oc-lib v0.0.0-20250110163958-fd1c579ec418/go.mod h1:ya7Q+zHhaKM+XF6sAJ+avqHEVzaMnFJQih2X3TlTlGo=
 | 
			
		||||
cloud.o-forge.io/core/oc-lib v0.0.0-20250213085018-271cc2caa026 h1:CYwpofGfpAhMDrT6jqvu9NI/tcgxCD8PKJZDKEfTvVI=
 | 
			
		||||
cloud.o-forge.io/core/oc-lib v0.0.0-20250213085018-271cc2caa026/go.mod h1:2roQbUpv3a6mTIr5oU1ux31WbN8YucyyQvCQ0FqwbcE=
 | 
			
		||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 | 
			
		||||
github.com/beego/beego/v2 v2.3.1 h1:7MUKMpJYzOXtCUsTEoXOxsDV/UcHw6CPbaWMlthVNsc=
 | 
			
		||||
github.com/beego/beego/v2 v2.3.1/go.mod h1:5cqHsOHJIxkq44tBpRvtDe59GuVRVv/9/tyVDxd5ce4=
 | 
			
		||||
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/biter777/countries v1.7.5 h1:MJ+n3+rSxWQdqVJU8eBy9RqcdH6ePPn4PJHocVWUa+Q=
 | 
			
		||||
github.com/biter777/countries v1.7.5/go.mod h1:1HSpZ526mYqKJcpT5Ti1kcGQ0L0SrXWIaptUWjFfv2E=
 | 
			
		||||
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
 | 
			
		||||
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
 | 
			
		||||
github.com/coreos/etcd v3.3.17+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
 | 
			
		||||
@@ -17,10 +19,24 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1
 | 
			
		||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
			
		||||
github.com/elazarl/go-bindata-assetfs v1.0.1 h1:m0kkaHRKEu7tUIUFVwhGGGYClXvyl4RE03qmvRTNfbw=
 | 
			
		||||
github.com/elazarl/go-bindata-assetfs v1.0.1/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4=
 | 
			
		||||
github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g=
 | 
			
		||||
github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
 | 
			
		||||
github.com/etcd-io/etcd v3.3.17+incompatible/go.mod h1:cdZ77EstHBwVtD6iTgzgvogwcjo9m4iOqoijouPJ4bs=
 | 
			
		||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
 | 
			
		||||
github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E=
 | 
			
		||||
github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ=
 | 
			
		||||
github.com/gabriel-vasile/mimetype v1.4.6 h1:3+PzJTKLkvgjeTbts6msPJt4DixhT4YtFNf1gtGe3zc=
 | 
			
		||||
github.com/gabriel-vasile/mimetype v1.4.6/go.mod h1:JX1qVKqZd40hUPpAfiNTe0Sne7hdfKSbOqqmkq8GCXc=
 | 
			
		||||
github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
 | 
			
		||||
github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
 | 
			
		||||
github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs=
 | 
			
		||||
github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ=
 | 
			
		||||
github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY=
 | 
			
		||||
github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE=
 | 
			
		||||
github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k=
 | 
			
		||||
github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14=
 | 
			
		||||
github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE=
 | 
			
		||||
github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ=
 | 
			
		||||
github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
 | 
			
		||||
github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
 | 
			
		||||
github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
 | 
			
		||||
@@ -29,12 +45,25 @@ github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJn
 | 
			
		||||
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
 | 
			
		||||
github.com/go-playground/validator/v10 v10.22.1 h1:40JcKH+bBNGFczGuoBYgX4I6m/i27HYW8P9FDk5PbgA=
 | 
			
		||||
github.com/go-playground/validator/v10 v10.22.1/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM=
 | 
			
		||||
github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
 | 
			
		||||
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
 | 
			
		||||
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
 | 
			
		||||
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
 | 
			
		||||
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
 | 
			
		||||
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
 | 
			
		||||
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
 | 
			
		||||
github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
 | 
			
		||||
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 | 
			
		||||
github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I=
 | 
			
		||||
github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U=
 | 
			
		||||
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 | 
			
		||||
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
 | 
			
		||||
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 | 
			
		||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 | 
			
		||||
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
 | 
			
		||||
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 | 
			
		||||
github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo=
 | 
			
		||||
github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
 | 
			
		||||
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
 | 
			
		||||
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
			
		||||
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
 | 
			
		||||
@@ -44,13 +73,22 @@ github.com/goraz/onion v0.1.3/go.mod h1:XEmz1XoBz+wxTgWB8NwuvRm4RAu3vKxvrmYtzK+X
 | 
			
		||||
github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=
 | 
			
		||||
github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
 | 
			
		||||
github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
 | 
			
		||||
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
 | 
			
		||||
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
 | 
			
		||||
github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
 | 
			
		||||
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
 | 
			
		||||
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
 | 
			
		||||
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
 | 
			
		||||
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
 | 
			
		||||
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
 | 
			
		||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 | 
			
		||||
github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc=
 | 
			
		||||
github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0=
 | 
			
		||||
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
 | 
			
		||||
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
 | 
			
		||||
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
 | 
			
		||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 | 
			
		||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
 | 
			
		||||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
 | 
			
		||||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
 | 
			
		||||
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
 | 
			
		||||
@@ -58,6 +96,8 @@ github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+
 | 
			
		||||
github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
 | 
			
		||||
github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
 | 
			
		||||
github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
 | 
			
		||||
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
 | 
			
		||||
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
 | 
			
		||||
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
 | 
			
		||||
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
 | 
			
		||||
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
 | 
			
		||||
@@ -68,9 +108,12 @@ github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh
 | 
			
		||||
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
 | 
			
		||||
github.com/mitchellh/mapstructure v1.5.0/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 h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
 | 
			
		||||
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/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
 | 
			
		||||
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
 | 
			
		||||
github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE=
 | 
			
		||||
github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow=
 | 
			
		||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
 | 
			
		||||
@@ -82,7 +125,12 @@ github.com/nats-io/nkeys v0.4.7/go.mod h1:kqXRgRDPlGy7nGaEDMuYzmiJCIAAWDK0IMBtDm
 | 
			
		||||
github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw=
 | 
			
		||||
github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
 | 
			
		||||
github.com/ogier/pflag v0.0.1/go.mod h1:zkFki7tvTa0tafRvTBIZTvzYyAu6kQhPZFnshFFPE+g=
 | 
			
		||||
github.com/onsi/ginkgo/v2 v2.21.0 h1:7rg/4f3rB88pb5obDgNZrNHrQ4e6WpjonchcpuBRnZM=
 | 
			
		||||
github.com/onsi/ginkgo/v2 v2.21.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo=
 | 
			
		||||
github.com/onsi/gomega v1.35.1 h1:Cwbd75ZBPxFSuZ6T+rN/WCb/gOc6YgFBXLlZLhC7Ds4=
 | 
			
		||||
github.com/onsi/gomega v1.35.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog=
 | 
			
		||||
github.com/pelletier/go-toml v1.6.0/go.mod h1:5N711Q9dKgbdkxHL+MEfF31hpT7l0S0s/t2kKREewys=
 | 
			
		||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
 | 
			
		||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 | 
			
		||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 | 
			
		||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
 | 
			
		||||
@@ -95,10 +143,10 @@ github.com/prometheus/common v0.60.1 h1:FUas6GcOw66yB/73KC+BOZoFJmbo/1pojoILArPA
 | 
			
		||||
github.com/prometheus/common v0.60.1/go.mod h1:h0LYf1R1deLSKtD4Vdg8gy4RuOvENW2J/h19V5NADQw=
 | 
			
		||||
github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
 | 
			
		||||
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
 | 
			
		||||
github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
 | 
			
		||||
github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
 | 
			
		||||
github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=
 | 
			
		||||
github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
 | 
			
		||||
github.com/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ=
 | 
			
		||||
github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k=
 | 
			
		||||
github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=
 | 
			
		||||
github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
 | 
			
		||||
github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
 | 
			
		||||
github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8=
 | 
			
		||||
github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss=
 | 
			
		||||
@@ -111,10 +159,19 @@ github.com/smartystreets/assertions v1.2.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYl
 | 
			
		||||
github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
 | 
			
		||||
github.com/smartystreets/goconvey v1.7.2 h1:9RBaZCeXEQ3UselpuwUQHltGVXvdwm6cv1hgR6gDIPg=
 | 
			
		||||
github.com/smartystreets/goconvey v1.7.2/go.mod h1:Vw0tHAZW6lzCRk3xgdin6fKYcG+G3Pg9vgXWeJpQFMM=
 | 
			
		||||
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
 | 
			
		||||
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
 | 
			
		||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
			
		||||
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
 | 
			
		||||
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
 | 
			
		||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 | 
			
		||||
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 | 
			
		||||
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
 | 
			
		||||
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
 | 
			
		||||
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
 | 
			
		||||
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
 | 
			
		||||
github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
 | 
			
		||||
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
 | 
			
		||||
github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c=
 | 
			
		||||
github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
 | 
			
		||||
github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY=
 | 
			
		||||
@@ -123,29 +180,42 @@ github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6
 | 
			
		||||
github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM=
 | 
			
		||||
github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 h1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM=
 | 
			
		||||
github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI=
 | 
			
		||||
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 | 
			
		||||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 | 
			
		||||
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
 | 
			
		||||
go.mongodb.org/mongo-driver v1.17.1 h1:Wic5cJIwJgSpBhe3lx3+/RybR5PiYRMpVFgO7cOHyIM=
 | 
			
		||||
go.mongodb.org/mongo-driver v1.17.1/go.mod h1:wwWm/+BuOddhcq3n68LKRmgk2wXzmF6s0SFOa0GINL4=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20191112222119-e1110fd1c708/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 | 
			
		||||
golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw=
 | 
			
		||||
golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U=
 | 
			
		||||
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 | 
			
		||||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 | 
			
		||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
 | 
			
		||||
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-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
			
		||||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
			
		||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 | 
			
		||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 | 
			
		||||
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
 | 
			
		||||
golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4=
 | 
			
		||||
golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU=
 | 
			
		||||
golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs=
 | 
			
		||||
golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
 | 
			
		||||
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-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
 | 
			
		||||
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20191115151921-52ab43148777/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-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
@@ -157,23 +227,57 @@ golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo=
 | 
			
		||||
golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 | 
			
		||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 | 
			
		||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 | 
			
		||||
golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24=
 | 
			
		||||
golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M=
 | 
			
		||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
			
		||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 | 
			
		||||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
 | 
			
		||||
golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
 | 
			
		||||
golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM=
 | 
			
		||||
golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
 | 
			
		||||
golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ=
 | 
			
		||||
golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
 | 
			
		||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
			
		||||
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
			
		||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
			
		||||
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
			
		||||
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
 | 
			
		||||
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
 | 
			
		||||
golang.org/x/tools v0.26.0 h1:v/60pFQmzmT9ExmjDv2gGIfi3OqfKoEP6I5+umXlbnQ=
 | 
			
		||||
golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0=
 | 
			
		||||
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/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
			
		||||
google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA=
 | 
			
		||||
google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
 | 
			
		||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
 | 
			
		||||
gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4=
 | 
			
		||||
gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M=
 | 
			
		||||
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
 | 
			
		||||
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
 | 
			
		||||
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.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
			
		||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 | 
			
		||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
			
		||||
k8s.io/api v0.32.1 h1:f562zw9cy+GvXzXf0CKlVQ7yHJVYzLfL6JAS4kOAaOc=
 | 
			
		||||
k8s.io/api v0.32.1/go.mod h1:/Yi/BqkuueW1BgpoePYBRdDYfjPF5sgTr5+YqDZra5k=
 | 
			
		||||
k8s.io/apimachinery v0.32.1 h1:683ENpaCBjma4CYqsmZyhEzrGz6cjn1MY/X2jB2hkZs=
 | 
			
		||||
k8s.io/apimachinery v0.32.1/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE=
 | 
			
		||||
k8s.io/client-go v0.32.1 h1:otM0AxdhdBIaQh7l1Q0jQpmo7WOFIk5FFa4bg6YMdUU=
 | 
			
		||||
k8s.io/client-go v0.32.1/go.mod h1:aTTKZY7MdxUaJ/KiUs8D+GssR9zJZi77ZqtzcGXIiDg=
 | 
			
		||||
k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
 | 
			
		||||
k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
 | 
			
		||||
k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f h1:GA7//TjRY9yWGy1poLzYYJJ4JRdzg3+O6e8I+e+8T5Y=
 | 
			
		||||
k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f/go.mod h1:R/HEjbvWI0qdfb8viZUeVZm0X6IZnxAydC7YU42CMw4=
 | 
			
		||||
k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro=
 | 
			
		||||
k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
 | 
			
		||||
sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8=
 | 
			
		||||
sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo=
 | 
			
		||||
sigs.k8s.io/structured-merge-diff/v4 v4.4.2 h1:MdmvkGuXi/8io6ixD5wud3vOLwc1rj0aNqRlpuvjmwA=
 | 
			
		||||
sigs.k8s.io/structured-merge-diff/v4 v4.4.2/go.mod h1:N8f93tFZh9U6vpxwRArLiikrE5/2tiu1w1AGfACIGE4=
 | 
			
		||||
sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=
 | 
			
		||||
sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										28
									
								
								infrastructure/interface.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								infrastructure/interface.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,28 @@
 | 
			
		||||
package infrastructure
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"oc-datacenter/conf"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type Infrastructure interface {
 | 
			
		||||
	CreateNamespace(ctx context.Context, ns string) error
 | 
			
		||||
	DeleteNamespace(ctx context.Context, ns string) error
 | 
			
		||||
	GetToken(ctx context.Context, ns string, duration int) (string, error)
 | 
			
		||||
	CreateServiceAccount(ctx context.Context, ns string) error
 | 
			
		||||
	CreateRoleBinding(ctx context.Context, ns string, roleBinding string, role string) error
 | 
			
		||||
	CreateRole(ctx context.Context, ns string, role string, groups [][]string, resources [][]string, verbs [][]string) error
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var _service = map[string]func() (Infrastructure, error){
 | 
			
		||||
	"kubernetes": NewKubernetesService,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewService() (Infrastructure, error) {
 | 
			
		||||
	service, ok := _service[conf.GetConfig().Mode]
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return nil, errors.New("service not found")
 | 
			
		||||
	}
 | 
			
		||||
	return service()
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										158
									
								
								infrastructure/kubernetes.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										158
									
								
								infrastructure/kubernetes.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,158 @@
 | 
			
		||||
package infrastructure
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"oc-datacenter/conf"
 | 
			
		||||
 | 
			
		||||
	authv1 "k8s.io/api/authentication/v1"
 | 
			
		||||
	v1 "k8s.io/api/core/v1"
 | 
			
		||||
	rbacv1 "k8s.io/api/rbac/v1"
 | 
			
		||||
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
			
		||||
	"k8s.io/client-go/kubernetes"
 | 
			
		||||
	"k8s.io/client-go/rest"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type KubernetesService struct {
 | 
			
		||||
	Set *kubernetes.Clientset
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewKubernetesService() (Infrastructure, error) {
 | 
			
		||||
	config := &rest.Config{
 | 
			
		||||
		Host: conf.GetConfig().KubeHost + ":" + conf.GetConfig().KubePort,
 | 
			
		||||
		TLSClientConfig: rest.TLSClientConfig{
 | 
			
		||||
			CAData:   []byte(conf.GetConfig().KubeCA),
 | 
			
		||||
			CertData: []byte(conf.GetConfig().KubeCert),
 | 
			
		||||
			KeyData:  []byte(conf.GetConfig().KubeData),
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
	// Create clientset
 | 
			
		||||
	clientset, err := kubernetes.NewForConfig(config)
 | 
			
		||||
	fmt.Println("NewForConfig", clientset, err)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, errors.New("Error creating Kubernetes client: " + err.Error())
 | 
			
		||||
	}
 | 
			
		||||
	if clientset == nil {
 | 
			
		||||
		return nil, errors.New("Error creating Kubernetes client: clientset is nil")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return &KubernetesService{
 | 
			
		||||
		Set: clientset,
 | 
			
		||||
	}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (k *KubernetesService) CreateNamespace(ctx context.Context, ns string) error {
 | 
			
		||||
	// Define the namespace
 | 
			
		||||
	namespace := &v1.Namespace{
 | 
			
		||||
		ObjectMeta: metav1.ObjectMeta{
 | 
			
		||||
			Name: ns,
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
	// Create the namespace
 | 
			
		||||
	fmt.Println("Creating namespace...", k.Set)
 | 
			
		||||
	if _, err := k.Set.CoreV1().Namespaces().Create(ctx, namespace, metav1.CreateOptions{}); err != nil {
 | 
			
		||||
		return errors.New("Error creating namespace: " + err.Error())
 | 
			
		||||
	}
 | 
			
		||||
	fmt.Println("Namespace created successfully!")
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (k *KubernetesService) CreateServiceAccount(ctx context.Context, ns string) error {
 | 
			
		||||
	// Create the ServiceAccount object
 | 
			
		||||
	serviceAccount := &v1.ServiceAccount{
 | 
			
		||||
		ObjectMeta: metav1.ObjectMeta{
 | 
			
		||||
			Name:      "sa-" + ns,
 | 
			
		||||
			Namespace: ns,
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
	// Create the ServiceAccount in the specified namespace
 | 
			
		||||
	_, err := k.Set.CoreV1().ServiceAccounts(ns).Create(ctx, serviceAccount, metav1.CreateOptions{})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return errors.New("Failed to create ServiceAccount: " + err.Error())
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (k *KubernetesService) CreateRole(ctx context.Context, ns string, role string, groups [][]string, resources [][]string, verbs [][]string) error {
 | 
			
		||||
	// Create the Role object
 | 
			
		||||
	if len(groups) != len(resources) || len(resources) != len(verbs) {
 | 
			
		||||
		return errors.New("Invalid input: groups, resources, and verbs must have the same length")
 | 
			
		||||
	}
 | 
			
		||||
	rules := []rbacv1.PolicyRule{}
 | 
			
		||||
	for i, group := range groups {
 | 
			
		||||
		rules = append(rules, rbacv1.PolicyRule{
 | 
			
		||||
			APIGroups: group,
 | 
			
		||||
			Resources: resources[i],
 | 
			
		||||
			Verbs:     verbs[i],
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
	r := &rbacv1.Role{
 | 
			
		||||
		ObjectMeta: metav1.ObjectMeta{
 | 
			
		||||
			Name:      role,
 | 
			
		||||
			Namespace: ns,
 | 
			
		||||
		},
 | 
			
		||||
		Rules: rules,
 | 
			
		||||
	}
 | 
			
		||||
	// Create the Role in the specified namespace
 | 
			
		||||
	_, err := k.Set.RbacV1().Roles(ns).Create(ctx, r, metav1.CreateOptions{})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return errors.New("Failed to create Role: " + err.Error())
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (k *KubernetesService) CreateRoleBinding(ctx context.Context, ns string, roleBinding string, role string) error {
 | 
			
		||||
	// Create the RoleBinding object
 | 
			
		||||
	rb := &rbacv1.RoleBinding{
 | 
			
		||||
		ObjectMeta: metav1.ObjectMeta{
 | 
			
		||||
			Name:      roleBinding,
 | 
			
		||||
			Namespace: ns,
 | 
			
		||||
		},
 | 
			
		||||
		Subjects: []rbacv1.Subject{
 | 
			
		||||
			{
 | 
			
		||||
				Kind:      "ServiceAccount",
 | 
			
		||||
				Name:      "sa-" + ns,
 | 
			
		||||
				Namespace: ns,
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		RoleRef: rbacv1.RoleRef{
 | 
			
		||||
			Kind:     "Role",
 | 
			
		||||
			Name:     role,
 | 
			
		||||
			APIGroup: "rbac.authorization.k8s.io",
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
	// Create the RoleBinding in the specified namespace
 | 
			
		||||
	_, err := k.Set.RbacV1().RoleBindings(ns).Create(ctx, rb, metav1.CreateOptions{})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return errors.New("Failed to create RoleBinding: " + err.Error())
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (k *KubernetesService) DeleteNamespace(ctx context.Context, ns string) error {
 | 
			
		||||
	// Delete the namespace
 | 
			
		||||
	if err := k.Set.CoreV1().Namespaces().Delete(ctx, ns, metav1.DeleteOptions{}); err != nil {
 | 
			
		||||
		return errors.New("Error deleting namespace: " + err.Error())
 | 
			
		||||
	}
 | 
			
		||||
	fmt.Println("Namespace deleted successfully!")
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (k *KubernetesService) GetToken(ctx context.Context, ns string, duration int) (string, error) {
 | 
			
		||||
	// Define TokenRequest (valid for 1 hour)
 | 
			
		||||
	d := int64(duration)
 | 
			
		||||
	tokenRequest := &authv1.TokenRequest{
 | 
			
		||||
		Spec: authv1.TokenRequestSpec{
 | 
			
		||||
			ExpirationSeconds: &d, // 1 hour validity
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
	// Generate the token
 | 
			
		||||
	token, err := k.Set.CoreV1().
 | 
			
		||||
		ServiceAccounts(ns).
 | 
			
		||||
		CreateToken(ctx, "sa-"+ns, tokenRequest, metav1.CreateOptions{})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return "", errors.New("Failed to create token for ServiceAccount: " + err.Error())
 | 
			
		||||
	}
 | 
			
		||||
	return token.Status.Token, nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										17
									
								
								main.go
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								main.go
									
									
									
									
									
								
							@@ -1,6 +1,8 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/base64"
 | 
			
		||||
	"oc-datacenter/conf"
 | 
			
		||||
	_ "oc-datacenter/routers"
 | 
			
		||||
 | 
			
		||||
	oclib "cloud.o-forge.io/core/oc-lib"
 | 
			
		||||
@@ -17,7 +19,22 @@ func main() {
 | 
			
		||||
 | 
			
		||||
	// Load the right config file
 | 
			
		||||
	o := oclib.GetConfLoader()
 | 
			
		||||
	conf.GetConfig().Mode = o.GetStringDefault("MODE", "kubernetes")
 | 
			
		||||
	conf.GetConfig().KubeHost = o.GetStringDefault("KUBERNETES_SERVICE_HOST", "")
 | 
			
		||||
	conf.GetConfig().KubePort = o.GetStringDefault("KUBERNETES_SERVICE_PORT", "6443")
 | 
			
		||||
 | 
			
		||||
	sDec, err := base64.StdEncoding.DecodeString(o.GetStringDefault("KUBE_CA", ""))
 | 
			
		||||
	if err == nil {
 | 
			
		||||
		conf.GetConfig().KubeCA = string(sDec)
 | 
			
		||||
	}
 | 
			
		||||
	sDec, err = base64.StdEncoding.DecodeString(o.GetStringDefault("KUBE_CERT", ""))
 | 
			
		||||
	if err == nil {
 | 
			
		||||
		conf.GetConfig().KubeCert = string(sDec)
 | 
			
		||||
	}
 | 
			
		||||
	sDec, err = base64.StdEncoding.DecodeString(o.GetStringDefault("KUBE_DATA", ""))
 | 
			
		||||
	if err == nil {
 | 
			
		||||
		conf.GetConfig().KubeData = string(sDec)
 | 
			
		||||
	}
 | 
			
		||||
	// feed the library with the loaded config
 | 
			
		||||
	oclib.SetConfig(
 | 
			
		||||
		o.GetStringDefault("MONGO_URL", "mongodb://127.0.0.1:27017"),
 | 
			
		||||
 
 | 
			
		||||
@@ -34,6 +34,15 @@ func init() {
 | 
			
		||||
            Filters: nil,
 | 
			
		||||
            Params: nil})
 | 
			
		||||
 | 
			
		||||
    beego.GlobalControllerRouter["oc-datacenter/controllers:BookingController"] = append(beego.GlobalControllerRouter["oc-datacenter/controllers:BookingController"],
 | 
			
		||||
        beego.ControllerComments{
 | 
			
		||||
            Method: "Put",
 | 
			
		||||
            Router: `/:id`,
 | 
			
		||||
            AllowHTTPMethods: []string{"put"},
 | 
			
		||||
            MethodParams: param.Make(),
 | 
			
		||||
            Filters: nil,
 | 
			
		||||
            Params: nil})
 | 
			
		||||
 | 
			
		||||
    beego.GlobalControllerRouter["oc-datacenter/controllers:BookingController"] = append(beego.GlobalControllerRouter["oc-datacenter/controllers:BookingController"],
 | 
			
		||||
        beego.ControllerComments{
 | 
			
		||||
            Method: "Check",
 | 
			
		||||
@@ -52,6 +61,42 @@ func init() {
 | 
			
		||||
            Filters: nil,
 | 
			
		||||
            Params: nil})
 | 
			
		||||
 | 
			
		||||
    beego.GlobalControllerRouter["oc-datacenter/controllers:BookingController"] = append(beego.GlobalControllerRouter["oc-datacenter/controllers:BookingController"],
 | 
			
		||||
        beego.ControllerComments{
 | 
			
		||||
            Method: "ExecutionSearch",
 | 
			
		||||
            Router: `/search/execution/:id`,
 | 
			
		||||
            AllowHTTPMethods: []string{"get"},
 | 
			
		||||
            MethodParams: param.Make(),
 | 
			
		||||
            Filters: nil,
 | 
			
		||||
            Params: nil})
 | 
			
		||||
 | 
			
		||||
    beego.GlobalControllerRouter["oc-datacenter/controllers:DatacenterController"] = append(beego.GlobalControllerRouter["oc-datacenter/controllers:DatacenterController"],
 | 
			
		||||
        beego.ControllerComments{
 | 
			
		||||
            Method: "GetAll",
 | 
			
		||||
            Router: `/`,
 | 
			
		||||
            AllowHTTPMethods: []string{"get"},
 | 
			
		||||
            MethodParams: param.Make(),
 | 
			
		||||
            Filters: nil,
 | 
			
		||||
            Params: nil})
 | 
			
		||||
 | 
			
		||||
    beego.GlobalControllerRouter["oc-datacenter/controllers:DatacenterController"] = append(beego.GlobalControllerRouter["oc-datacenter/controllers:DatacenterController"],
 | 
			
		||||
        beego.ControllerComments{
 | 
			
		||||
            Method: "Get",
 | 
			
		||||
            Router: `/:id`,
 | 
			
		||||
            AllowHTTPMethods: []string{"get"},
 | 
			
		||||
            MethodParams: param.Make(),
 | 
			
		||||
            Filters: nil,
 | 
			
		||||
            Params: nil})
 | 
			
		||||
 | 
			
		||||
    beego.GlobalControllerRouter["oc-datacenter/controllers:SessionController"] = append(beego.GlobalControllerRouter["oc-datacenter/controllers:SessionController"],
 | 
			
		||||
        beego.ControllerComments{
 | 
			
		||||
            Method: "GetToken",
 | 
			
		||||
            Router: `/token/:id/:duration`,
 | 
			
		||||
            AllowHTTPMethods: []string{"get"},
 | 
			
		||||
            MethodParams: param.Make(),
 | 
			
		||||
            Filters: nil,
 | 
			
		||||
            Params: nil})
 | 
			
		||||
 | 
			
		||||
    beego.GlobalControllerRouter["oc-datacenter/controllers:VersionController"] = append(beego.GlobalControllerRouter["oc-datacenter/controllers:VersionController"],
 | 
			
		||||
        beego.ControllerComments{
 | 
			
		||||
            Method: "GetAll",
 | 
			
		||||
 
 | 
			
		||||
@@ -15,6 +15,14 @@ import (
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	ns := beego.NewNamespace("/oc/",
 | 
			
		||||
		beego.NSInclude(
 | 
			
		||||
			&controllers.DatacenterController{},
 | 
			
		||||
		),
 | 
			
		||||
		beego.NSNamespace("/session",
 | 
			
		||||
			beego.NSInclude(
 | 
			
		||||
				&controllers.SessionController{},
 | 
			
		||||
			),
 | 
			
		||||
		),
 | 
			
		||||
		beego.NSNamespace("/booking",
 | 
			
		||||
			beego.NSInclude(
 | 
			
		||||
				&controllers.BookingController{},
 | 
			
		||||
 
 | 
			
		||||
@@ -15,6 +15,28 @@
 | 
			
		||||
    },
 | 
			
		||||
    "basePath": "/oc/",
 | 
			
		||||
    "paths": {
 | 
			
		||||
        "/": {
 | 
			
		||||
            "get": {
 | 
			
		||||
                "tags": [
 | 
			
		||||
                    "oc-datacenter/controllersDatacenterController"
 | 
			
		||||
                ],
 | 
			
		||||
                "description": "find booking by id\n\u003cbr\u003e",
 | 
			
		||||
                "operationId": "DatacenterController.GetAll",
 | 
			
		||||
                "parameters": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "in": "query",
 | 
			
		||||
                        "name": "is_draft",
 | 
			
		||||
                        "description": "draft wished",
 | 
			
		||||
                        "type": "string"
 | 
			
		||||
                    }
 | 
			
		||||
                ],
 | 
			
		||||
                "responses": {
 | 
			
		||||
                    "200": {
 | 
			
		||||
                        "description": "{booking} models.booking"
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "/booking/": {
 | 
			
		||||
            "get": {
 | 
			
		||||
                "tags": [
 | 
			
		||||
@@ -22,6 +44,14 @@
 | 
			
		||||
                ],
 | 
			
		||||
                "description": "find booking by id\n\u003cbr\u003e",
 | 
			
		||||
                "operationId": "BookingController.GetAll",
 | 
			
		||||
                "parameters": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "in": "query",
 | 
			
		||||
                        "name": "is_draft",
 | 
			
		||||
                        "description": "draft wished",
 | 
			
		||||
                        "type": "string"
 | 
			
		||||
                    }
 | 
			
		||||
                ],
 | 
			
		||||
                "responses": {
 | 
			
		||||
                    "200": {
 | 
			
		||||
                        "description": "{booking} models.booking"
 | 
			
		||||
@@ -33,7 +63,7 @@
 | 
			
		||||
                    "booking"
 | 
			
		||||
                ],
 | 
			
		||||
                "description": "create booking\n\u003cbr\u003e",
 | 
			
		||||
                "operationId": "BookingController.Post",
 | 
			
		||||
                "operationId": "BookingController.Post.",
 | 
			
		||||
                "parameters": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "in": "body",
 | 
			
		||||
@@ -44,6 +74,12 @@
 | 
			
		||||
                            "type": "string"
 | 
			
		||||
                        },
 | 
			
		||||
                        "type": "string"
 | 
			
		||||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
                        "in": "query",
 | 
			
		||||
                        "name": "is_draft",
 | 
			
		||||
                        "description": "draft wished",
 | 
			
		||||
                        "type": "string"
 | 
			
		||||
                    }
 | 
			
		||||
                ],
 | 
			
		||||
                "responses": {
 | 
			
		||||
@@ -83,6 +119,12 @@
 | 
			
		||||
                        "description": "2006-01-02T15:04:05",
 | 
			
		||||
                        "type": "string",
 | 
			
		||||
                        "default": "the booking end date"
 | 
			
		||||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
                        "in": "query",
 | 
			
		||||
                        "name": "is_draft",
 | 
			
		||||
                        "description": "draft wished",
 | 
			
		||||
                        "type": "string"
 | 
			
		||||
                    }
 | 
			
		||||
                ],
 | 
			
		||||
                "responses": {
 | 
			
		||||
@@ -95,6 +137,35 @@
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "/booking/search/execution/{id}": {
 | 
			
		||||
            "get": {
 | 
			
		||||
                "tags": [
 | 
			
		||||
                    "booking"
 | 
			
		||||
                ],
 | 
			
		||||
                "description": "search bookings by execution\n\u003cbr\u003e",
 | 
			
		||||
                "operationId": "BookingController.Search",
 | 
			
		||||
                "parameters": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "in": "path",
 | 
			
		||||
                        "name": "id",
 | 
			
		||||
                        "description": "id execution",
 | 
			
		||||
                        "required": true,
 | 
			
		||||
                        "type": "string"
 | 
			
		||||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
                        "in": "query",
 | 
			
		||||
                        "name": "is_draft",
 | 
			
		||||
                        "description": "draft wished",
 | 
			
		||||
                        "type": "string"
 | 
			
		||||
                    }
 | 
			
		||||
                ],
 | 
			
		||||
                "responses": {
 | 
			
		||||
                    "200": {
 | 
			
		||||
                        "description": "{workspace} models.workspace"
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "/booking/search/{start_date}/{end_date}": {
 | 
			
		||||
            "get": {
 | 
			
		||||
                "tags": [
 | 
			
		||||
@@ -116,6 +187,12 @@
 | 
			
		||||
                        "description": "the word search you want to get",
 | 
			
		||||
                        "required": true,
 | 
			
		||||
                        "type": "string"
 | 
			
		||||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
                        "in": "query",
 | 
			
		||||
                        "name": "is_draft",
 | 
			
		||||
                        "description": "draft wished",
 | 
			
		||||
                        "type": "string"
 | 
			
		||||
                    }
 | 
			
		||||
                ],
 | 
			
		||||
                "responses": {
 | 
			
		||||
@@ -146,6 +223,64 @@
 | 
			
		||||
                        "description": "{booking} models.booking"
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "put": {
 | 
			
		||||
                "tags": [
 | 
			
		||||
                    "booking"
 | 
			
		||||
                ],
 | 
			
		||||
                "description": "create computes\n\u003cbr\u003e",
 | 
			
		||||
                "operationId": "BookingController.Update",
 | 
			
		||||
                "parameters": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "in": "path",
 | 
			
		||||
                        "name": "id",
 | 
			
		||||
                        "description": "the compute id you want to get",
 | 
			
		||||
                        "required": true,
 | 
			
		||||
                        "type": "string"
 | 
			
		||||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
                        "in": "body",
 | 
			
		||||
                        "name": "body",
 | 
			
		||||
                        "description": "The compute content",
 | 
			
		||||
                        "required": true,
 | 
			
		||||
                        "schema": {
 | 
			
		||||
                            "$ref": "#/definitions/models.compute"
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                ],
 | 
			
		||||
                "responses": {
 | 
			
		||||
                    "200": {
 | 
			
		||||
                        "description": "{compute} models.compute"
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "/session/token/{id}/{duration}": {
 | 
			
		||||
            "get": {
 | 
			
		||||
                "tags": [
 | 
			
		||||
                    "session"
 | 
			
		||||
                ],
 | 
			
		||||
                "description": "find booking by id\n\u003cbr\u003e",
 | 
			
		||||
                "operationId": "SessionController.GetToken",
 | 
			
		||||
                "parameters": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "in": "path",
 | 
			
		||||
                        "name": "id",
 | 
			
		||||
                        "description": "id of the datacenter",
 | 
			
		||||
                        "type": "string"
 | 
			
		||||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
                        "in": "path",
 | 
			
		||||
                        "name": "duration",
 | 
			
		||||
                        "description": "duration of the token",
 | 
			
		||||
                        "type": "string"
 | 
			
		||||
                    }
 | 
			
		||||
                ],
 | 
			
		||||
                "responses": {
 | 
			
		||||
                    "200": {
 | 
			
		||||
                        "description": "{booking} models.booking"
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "/version/": {
 | 
			
		||||
@@ -175,15 +310,52 @@
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "/{id}": {
 | 
			
		||||
            "get": {
 | 
			
		||||
                "tags": [
 | 
			
		||||
                    "oc-datacenter/controllersDatacenterController"
 | 
			
		||||
                ],
 | 
			
		||||
                "description": "find booking by id\n\u003cbr\u003e",
 | 
			
		||||
                "operationId": "DatacenterController.Get",
 | 
			
		||||
                "parameters": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "in": "path",
 | 
			
		||||
                        "name": "id",
 | 
			
		||||
                        "description": "the id you want to get",
 | 
			
		||||
                        "required": true,
 | 
			
		||||
                        "type": "string"
 | 
			
		||||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
                        "in": "query",
 | 
			
		||||
                        "name": "is_draft",
 | 
			
		||||
                        "description": "draft wished",
 | 
			
		||||
                        "type": "string"
 | 
			
		||||
                    }
 | 
			
		||||
                ],
 | 
			
		||||
                "responses": {
 | 
			
		||||
                    "200": {
 | 
			
		||||
                        "description": "{booking} models.booking"
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "definitions": {
 | 
			
		||||
        "models.compute": {
 | 
			
		||||
            "title": "compute",
 | 
			
		||||
            "type": "object"
 | 
			
		||||
        },
 | 
			
		||||
        "models.object": {
 | 
			
		||||
            "title": "object",
 | 
			
		||||
            "type": "object"
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "tags": [
 | 
			
		||||
        {
 | 
			
		||||
            "name": "oc-datacenter/controllersDatacenterController",
 | 
			
		||||
            "description": "Operations about workspace\n"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "booking",
 | 
			
		||||
            "description": "Operations about workspace\n"
 | 
			
		||||
 
 | 
			
		||||
@@ -12,6 +12,43 @@ info:
 | 
			
		||||
    url: https://www.gnu.org/licenses/agpl-3.0.html
 | 
			
		||||
basePath: /oc/
 | 
			
		||||
paths:
 | 
			
		||||
  /:
 | 
			
		||||
    get:
 | 
			
		||||
      tags:
 | 
			
		||||
      - oc-datacenter/controllersDatacenterController
 | 
			
		||||
      description: |-
 | 
			
		||||
        find booking by id
 | 
			
		||||
        <br>
 | 
			
		||||
      operationId: DatacenterController.GetAll
 | 
			
		||||
      parameters:
 | 
			
		||||
      - in: query
 | 
			
		||||
        name: is_draft
 | 
			
		||||
        description: draft wished
 | 
			
		||||
        type: string
 | 
			
		||||
      responses:
 | 
			
		||||
        "200":
 | 
			
		||||
          description: '{booking} models.booking'
 | 
			
		||||
  /{id}:
 | 
			
		||||
    get:
 | 
			
		||||
      tags:
 | 
			
		||||
      - oc-datacenter/controllersDatacenterController
 | 
			
		||||
      description: |-
 | 
			
		||||
        find booking by id
 | 
			
		||||
        <br>
 | 
			
		||||
      operationId: DatacenterController.Get
 | 
			
		||||
      parameters:
 | 
			
		||||
      - in: path
 | 
			
		||||
        name: id
 | 
			
		||||
        description: the id you want to get
 | 
			
		||||
        required: true
 | 
			
		||||
        type: string
 | 
			
		||||
      - in: query
 | 
			
		||||
        name: is_draft
 | 
			
		||||
        description: draft wished
 | 
			
		||||
        type: string
 | 
			
		||||
      responses:
 | 
			
		||||
        "200":
 | 
			
		||||
          description: '{booking} models.booking'
 | 
			
		||||
  /booking/:
 | 
			
		||||
    get:
 | 
			
		||||
      tags:
 | 
			
		||||
@@ -20,6 +57,11 @@ paths:
 | 
			
		||||
        find booking by id
 | 
			
		||||
        <br>
 | 
			
		||||
      operationId: BookingController.GetAll
 | 
			
		||||
      parameters:
 | 
			
		||||
      - in: query
 | 
			
		||||
        name: is_draft
 | 
			
		||||
        description: draft wished
 | 
			
		||||
        type: string
 | 
			
		||||
      responses:
 | 
			
		||||
        "200":
 | 
			
		||||
          description: '{booking} models.booking'
 | 
			
		||||
@@ -29,7 +71,7 @@ paths:
 | 
			
		||||
      description: |-
 | 
			
		||||
        create booking
 | 
			
		||||
        <br>
 | 
			
		||||
      operationId: BookingController.Post
 | 
			
		||||
      operationId: BookingController.Post.
 | 
			
		||||
      parameters:
 | 
			
		||||
      - in: body
 | 
			
		||||
        name: booking
 | 
			
		||||
@@ -38,6 +80,10 @@ paths:
 | 
			
		||||
        schema:
 | 
			
		||||
          type: string
 | 
			
		||||
        type: string
 | 
			
		||||
      - in: query
 | 
			
		||||
        name: is_draft
 | 
			
		||||
        description: draft wished
 | 
			
		||||
        type: string
 | 
			
		||||
      responses:
 | 
			
		||||
        "200":
 | 
			
		||||
          description: ""
 | 
			
		||||
@@ -60,6 +106,28 @@ paths:
 | 
			
		||||
      responses:
 | 
			
		||||
        "200":
 | 
			
		||||
          description: '{booking} models.booking'
 | 
			
		||||
    put:
 | 
			
		||||
      tags:
 | 
			
		||||
      - booking
 | 
			
		||||
      description: |-
 | 
			
		||||
        create computes
 | 
			
		||||
        <br>
 | 
			
		||||
      operationId: BookingController.Update
 | 
			
		||||
      parameters:
 | 
			
		||||
      - in: path
 | 
			
		||||
        name: id
 | 
			
		||||
        description: the compute id you want to get
 | 
			
		||||
        required: true
 | 
			
		||||
        type: string
 | 
			
		||||
      - in: body
 | 
			
		||||
        name: body
 | 
			
		||||
        description: The compute content
 | 
			
		||||
        required: true
 | 
			
		||||
        schema:
 | 
			
		||||
          $ref: '#/definitions/models.compute'
 | 
			
		||||
      responses:
 | 
			
		||||
        "200":
 | 
			
		||||
          description: '{compute} models.compute'
 | 
			
		||||
  /booking/check/{id}/{start_date}/{end_date}:
 | 
			
		||||
    get:
 | 
			
		||||
      tags:
 | 
			
		||||
@@ -83,6 +151,10 @@ paths:
 | 
			
		||||
        description: 2006-01-02T15:04:05
 | 
			
		||||
        type: string
 | 
			
		||||
        default: the booking end date
 | 
			
		||||
      - in: query
 | 
			
		||||
        name: is_draft
 | 
			
		||||
        description: draft wished
 | 
			
		||||
        type: string
 | 
			
		||||
      responses:
 | 
			
		||||
        "200":
 | 
			
		||||
          description: ""
 | 
			
		||||
@@ -107,9 +179,54 @@ paths:
 | 
			
		||||
        description: the word search you want to get
 | 
			
		||||
        required: true
 | 
			
		||||
        type: string
 | 
			
		||||
      - in: query
 | 
			
		||||
        name: is_draft
 | 
			
		||||
        description: draft wished
 | 
			
		||||
        type: string
 | 
			
		||||
      responses:
 | 
			
		||||
        "200":
 | 
			
		||||
          description: '{workspace} models.workspace'
 | 
			
		||||
  /booking/search/execution/{id}:
 | 
			
		||||
    get:
 | 
			
		||||
      tags:
 | 
			
		||||
      - booking
 | 
			
		||||
      description: |-
 | 
			
		||||
        search bookings by execution
 | 
			
		||||
        <br>
 | 
			
		||||
      operationId: BookingController.Search
 | 
			
		||||
      parameters:
 | 
			
		||||
      - in: path
 | 
			
		||||
        name: id
 | 
			
		||||
        description: id execution
 | 
			
		||||
        required: true
 | 
			
		||||
        type: string
 | 
			
		||||
      - in: query
 | 
			
		||||
        name: is_draft
 | 
			
		||||
        description: draft wished
 | 
			
		||||
        type: string
 | 
			
		||||
      responses:
 | 
			
		||||
        "200":
 | 
			
		||||
          description: '{workspace} models.workspace'
 | 
			
		||||
  /session/token/{id}/{duration}:
 | 
			
		||||
    get:
 | 
			
		||||
      tags:
 | 
			
		||||
      - session
 | 
			
		||||
      description: |-
 | 
			
		||||
        find booking by id
 | 
			
		||||
        <br>
 | 
			
		||||
      operationId: SessionController.GetToken
 | 
			
		||||
      parameters:
 | 
			
		||||
      - in: path
 | 
			
		||||
        name: id
 | 
			
		||||
        description: id of the datacenter
 | 
			
		||||
        type: string
 | 
			
		||||
      - in: path
 | 
			
		||||
        name: duration
 | 
			
		||||
        description: duration of the token
 | 
			
		||||
        type: string
 | 
			
		||||
      responses:
 | 
			
		||||
        "200":
 | 
			
		||||
          description: '{booking} models.booking'
 | 
			
		||||
  /version/:
 | 
			
		||||
    get:
 | 
			
		||||
      tags:
 | 
			
		||||
@@ -133,10 +250,16 @@ paths:
 | 
			
		||||
        "200":
 | 
			
		||||
          description: ""
 | 
			
		||||
definitions:
 | 
			
		||||
  models.compute:
 | 
			
		||||
    title: compute
 | 
			
		||||
    type: object
 | 
			
		||||
  models.object:
 | 
			
		||||
    title: object
 | 
			
		||||
    type: object
 | 
			
		||||
tags:
 | 
			
		||||
- name: oc-datacenter/controllersDatacenterController
 | 
			
		||||
  description: |
 | 
			
		||||
    Operations about workspace
 | 
			
		||||
- name: booking
 | 
			
		||||
  description: |
 | 
			
		||||
    Operations about workspace
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user