Cyclops 4 HPC is the purpose built stack to support large HPC centers with resource accounting and billing of cluster as well as cloud resources.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

295 lines
8.8 KiB

package bundleManager
import (
"context"
"time"
"github.com/go-openapi/runtime/middleware"
"github.com/prometheus/client_golang/prometheus"
"github.com/Cyclops-Labs/cyclops-4-hpc.git/services/plan-manager/models"
"github.com/Cyclops-Labs/cyclops-4-hpc.git/services/plan-manager/restapi/operations/bundle_management"
"github.com/Cyclops-Labs/cyclops-4-hpc.git/services/plan-manager/server/dbManager"
"github.com/Cyclops-Labs/cyclops-4-hpc.git/services/plan-manager/server/statusManager"
l "gitlab.com/cyclops-utilities/logging"
)
const (
statusDuplicated = iota
statusFail
statusMissing
statusOK
)
// BundleManager is the struct defined to group and contain all the methods
// that interact with the bundle subsystem.
// Parameters:
// - basePath: a string with the base path of the system.
// - db: a DbParameter reference to be able to use the DBManager methods.
// - monit: a StatusManager reference to be able to use the status subsystem methods.
type BundleManager struct {
basePath string
db *dbManager.DbParameter
monit *statusManager.StatusManager
}
// New is the function to create the struct BundleManager.
// Parameters:
// - DbParameter: reference pointing to the DbParameter that allows the interaction
// with the DBManager methods.
// - StatusParameter: reference poining to the StatusManager that allows the
// interaction with the StatusManager methods.
// - bp: a string containing the base path of the service.
// Returns:
// - BundleManager: struct to interact with BundleManager subsystem functionalities.
func New(db *dbManager.DbParameter, monit *statusManager.StatusManager, bp string) *BundleManager {
l.Trace.Printf("[BundleManager] Generating new bundleManager.\n")
monit.InitEndpoint("bundle")
return &BundleManager{
basePath: bp,
db: db,
monit: monit,
}
}
// CreateSkuBundle (Swagger func) is the function behind the (POST) endpoint /bundle
// Its job is to add a new bundle to the system.
func (m *BundleManager) CreateSkuBundle(ctx context.Context, params bundle_management.CreateSkuBundleParams) middleware.Responder {
l.Trace.Printf("[BundleManager] CreateSkuBundle endpoint invoked.\n")
callTime := time.Now()
m.monit.APIHit("bundle", callTime)
id, state, e := m.db.CreateSkuBundle(params.Bundle)
if e != nil {
s := "Problem creating the new Bundle: " + e.Error()
errorReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "POST", "route": "/sku/bundle"}).Inc()
m.monit.APIHitDone("bundle", callTime)
return bundle_management.NewCreateSkuBundleInternalServerError().WithPayload(&errorReturn)
}
if state == statusDuplicated {
s := "The Bundle already exists in the system."
conflictReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "409", "method": "POST", "route": "/sku/bundle"}).Inc()
m.monit.APIHitDone("bundle", callTime)
return bundle_management.NewCreateSkuBundleConflict().WithPayload(&conflictReturn)
}
link := m.basePath + "/sku/bundle/" + id
createdReturn := models.ItemCreatedResponse{
ID: id,
Link: link,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "201", "method": "POST", "route": "/sku/bundle"}).Inc()
m.monit.APIHitDone("bundle", callTime)
return bundle_management.NewCreateSkuBundleCreated().WithPayload(&createdReturn)
}
// GetSkuBundle (Swagger func) is the function behind the (GET) endpoint /bundle/{id}
// Its job is to retrieve the bundle linked to the provided id.
func (m *BundleManager) GetSkuBundle(ctx context.Context, params bundle_management.GetSkuBundleParams) middleware.Responder {
l.Trace.Printf("[BundleManager] GetSkuBundle endpoint invoked.\n")
callTime := time.Now()
m.monit.APIHit("bundle", callTime)
bundle, e := m.db.GetSkuBundle(params.ID)
if e != nil {
s := "Problem retrieving the Bundle from the system: " + e.Error()
errorReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "GET", "route": "/sku/bundle/" + params.ID}).Inc()
m.monit.APIHitDone("bundle", callTime)
return bundle_management.NewGetSkuBundleInternalServerError().WithPayload(&errorReturn)
}
if bundle != nil {
m.db.Metrics["api"].With(prometheus.Labels{"code": "200", "method": "GET", "route": "/sku/bundle/" + params.ID}).Inc()
m.monit.APIHitDone("bundle", callTime)
return bundle_management.NewGetSkuBundleOK().WithPayload(bundle)
}
s := "The Bundle doesn't exists in the system."
missingReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "404", "method": "GET", "route": "/sku/bundle/" + params.ID}).Inc()
m.monit.APIHitDone("bundle", callTime)
return bundle_management.NewGetSkuBundleNotFound().WithPayload(&missingReturn)
}
// GetSkuBundleByName (Swagger func) is the function behind the (GET) endpoint
// /bundle/name/{name}
// Its job is to retrieve the bundle provided the name of the bundle.
func (m *BundleManager) GetSkuBundleByName(ctx context.Context, params bundle_management.GetSkuBundleByNameParams) middleware.Responder {
l.Trace.Printf("[BundleManager] GetSkuBundleByName endpoint invoked.\n")
callTime := time.Now()
m.monit.APIHit("bundle", callTime)
bundle, e := m.db.GetSkuBundleByName(params.Name)
if e != nil {
s := "Problem retrieving the Bundle from the system: " + e.Error()
errorReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "GET", "route": "/sku/bundle/name/" + params.Name}).Inc()
m.monit.APIHitDone("bundle", callTime)
return bundle_management.NewGetSkuBundleByNameInternalServerError().WithPayload(&errorReturn)
}
if bundle != nil {
m.db.Metrics["api"].With(prometheus.Labels{"code": "200", "method": "GET", "route": "/sku/bundle/name/" + params.Name}).Inc()
m.monit.APIHitDone("bundle", callTime)
return bundle_management.NewGetSkuBundleByNameOK().WithPayload(bundle)
}
s := "The Bundle doesn't exists in the system."
missingReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "404", "method": "GET", "route": "/sku/bundle/name/" + params.Name}).Inc()
m.monit.APIHitDone("bundle", callTime)
return bundle_management.NewGetSkuBundleByNameNotFound().WithPayload(&missingReturn)
}
// ListSkuBundles (Swagger func) is the function behind the (GET) endpoint /bundle
// Its job is to list all the bundles present in the system.
func (m *BundleManager) ListSkuBundles(ctx context.Context, params bundle_management.ListSkuBundlesParams) middleware.Responder {
l.Trace.Printf("[BundleManager] ListSkuBundles endpoint invoked.\n")
callTime := time.Now()
m.monit.APIHit("bundle", callTime)
bundles, e := m.db.ListSkuBundles()
if e != nil {
s := "Problem retrieving Bundles in the system: " + e.Error()
errorReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "GET", "route": "/sku/bundle"}).Inc()
m.monit.APIHitDone("bundle", callTime)
return bundle_management.NewListSkuBundlesInternalServerError().WithPayload(&errorReturn)
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "200", "method": "GET", "route": "/sku/bundle"}).Inc()
m.monit.APIHitDone("bundle", callTime)
return bundle_management.NewListSkuBundlesOK().WithPayload(bundles)
}
// UpdateSkuBundle (Swagger func) is the function behind the (PUT) endpoint
// /sku/bundle/{id}
// Its job is to update the linked Sku bundle to the provided ID with the provided data.
func (m *BundleManager) UpdateSkuBundle(ctx context.Context, params bundle_management.UpdateSkuBundleParams) middleware.Responder {
l.Trace.Printf("[BundleManager] UpdateSkuBundle endpoint invoked.\n")
callTime := time.Now()
m.monit.APIHit("bundle", callTime)
state, e := m.db.UpdateSkuBundle(params.ID, params.Bundle)
if e != nil {
s := "Problem updating Bundle: " + e.Error()
errorReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "PUT", "route": "/sku/bundle/" + params.ID}).Inc()
m.monit.APIHitDone("bundle", callTime)
return bundle_management.NewUpdateSkuBundleInternalServerError().WithPayload(&errorReturn)
}
if state == statusMissing {
s := "The Bundle doesn't exists in the system."
missingReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "404", "method": "PUT", "route": "/sku/bundle/" + params.ID}).Inc()
m.monit.APIHitDone("bundle", callTime)
return bundle_management.NewUpdateSkuBundleNotFound().WithPayload(&missingReturn)
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "200", "method": "PUT", "route": "/sku/bundle/" + params.ID}).Inc()
m.monit.APIHitDone("bundle", callTime)
return bundle_management.NewUpdateSkuBundleOK().WithPayload(params.Bundle)
}