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.

331 lines
9.6 KiB

package planManager
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/plan_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
)
// PlanManager is the struct defined to group and contain all the methods
// that interact with the plan 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 PlanManager struct {
basePath string
db *dbManager.DbParameter
monit *statusManager.StatusManager
}
// New is the function to create the struct PlanManager.
// 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:
// - PlanManager: struct to interact with PlanManager subsystem functionalities.
func New(db *dbManager.DbParameter, monit *statusManager.StatusManager, bp string) *PlanManager {
l.Trace.Printf("[PlanManager] Generating new planManager.\n")
monit.InitEndpoint("plan")
return &PlanManager{
basePath: bp,
db: db,
monit: monit,
}
}
// CreatePlan (Swagger func) is the function behind the (POST) endpoint /plan
// Its job is to add a new plan in the system.
func (m *PlanManager) CreatePlan(ctx context.Context, params plan_management.CreatePlanParams) middleware.Responder {
l.Trace.Printf("[PlanManager] CreatePlan endpoint invoked.\n")
callTime := time.Now()
m.monit.APIHit("plan", callTime)
id, state, e := m.db.CreatePlan(params.Plan)
if e != nil {
s := "Problem creating the new Plan: " + e.Error()
errorReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "POST", "route": "/plan"}).Inc()
m.monit.APIHitDone("plan", callTime)
return plan_management.NewCreatePlanInternalServerError().WithPayload(&errorReturn)
}
if state == statusDuplicated {
s := "The Plan already exists in the system."
conflictReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "409", "method": "POST", "route": "/plan"}).Inc()
m.monit.APIHitDone("plan", callTime)
return plan_management.NewCreatePlanConflict().WithPayload(&conflictReturn)
}
link := m.basePath + "/plan/" + id
createReturn := models.ItemCreatedResponse{
ID: id,
Link: link,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "201", "method": "GET", "route": "/plan"}).Inc()
m.monit.APIHitDone("plan", callTime)
return plan_management.NewCreatePlanCreated().WithPayload(&createReturn)
}
// GetCompletePlan (Swagger func) is the function behind the (GET) endpoint
// /plan/complete/{id}
// Its job is to retrieve the full information related to a plan provided its ID.
func (m *PlanManager) GetCompletePlan(ctx context.Context, params plan_management.GetCompletePlanParams) middleware.Responder {
l.Trace.Printf("[PlanManager] GetCompletePlan endpoint invoked.\n")
callTime := time.Now()
m.monit.APIHit("plan", callTime)
plan, e := m.db.GetCompletePlan(params.ID)
if e != nil {
s := "Problem retrieving the Plan from the system: " + e.Error()
errorReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "GET", "route": "/plan/complete/" + params.ID}).Inc()
m.monit.APIHitDone("plan", callTime)
return plan_management.NewGetCompletePlanInternalServerError().WithPayload(&errorReturn)
}
if plan != nil {
m.db.Metrics["api"].With(prometheus.Labels{"code": "200", "method": "GET", "route": "/plan/complete/" + params.ID}).Inc()
m.monit.APIHitDone("plan", callTime)
return plan_management.NewGetCompletePlanOK().WithPayload(plan)
}
s := "The Plan doesn't exists in the system."
missingReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "404", "method": "GET", "route": "/plan/complete/" + params.ID}).Inc()
m.monit.APIHitDone("plan", callTime)
return plan_management.NewGetCompletePlanNotFound().WithPayload(&missingReturn)
}
// GetPlan (Swagger func) is the function behind the (GET) endpoint /plan/{id}
// Its job is to retrieve the information related to a plan provided its ID.
func (m *PlanManager) GetPlan(ctx context.Context, params plan_management.GetPlanParams) middleware.Responder {
l.Trace.Printf("[PlanManager] GetPlan endpoint invoked.\n")
callTime := time.Now()
m.monit.APIHit("plan", callTime)
plan, e := m.db.GetPlan(params.ID)
if e != nil {
s := "Problem retrieving the Plan from the system: " + e.Error()
errorReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "GET", "route": "/plan/" + params.ID}).Inc()
m.monit.APIHitDone("plan", callTime)
return plan_management.NewGetPlanInternalServerError().WithPayload(&errorReturn)
}
if plan != nil {
m.db.Metrics["api"].With(prometheus.Labels{"code": "200", "method": "GET", "route": "/plan/" + params.ID}).Inc()
m.monit.APIHitDone("plan", callTime)
return plan_management.NewGetPlanOK().WithPayload(plan)
}
s := "The Plan doesn't exists in the system."
missingReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "404", "method": "GET", "route": "/plan/" + params.ID}).Inc()
m.monit.APIHitDone("plan", callTime)
return plan_management.NewGetPlanNotFound().WithPayload(&missingReturn)
}
// ListCompletePlans (Swagger func) is the function behind the (GET) endpoint
// /plan/complete
// Its job is to retrieve the full information, including linked skus, related
// to a plan provided its ID.
func (m *PlanManager) ListCompletePlans(ctx context.Context, params plan_management.ListCompletePlansParams) middleware.Responder {
l.Trace.Printf("[PlanManager] ListCompletePlans endpoint invoked.\n")
callTime := time.Now()
m.monit.APIHit("plan", callTime)
plans, e := m.db.ListCompletePlans()
if e != nil {
s := "Problem retrieving the Plan from the system: " + e.Error()
errorReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "GET", "route": "/plan/complete"}).Inc()
m.monit.APIHitDone("plan", callTime)
return plan_management.NewListCompletePlansInternalServerError().WithPayload(&errorReturn)
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "200", "method": "GET", "route": "/plan/complete"}).Inc()
m.monit.APIHitDone("plan", callTime)
return plan_management.NewListCompletePlansOK().WithPayload(plans)
}
// ListPlans (Swagger func) is the function behind the (GET) endpoint /plan
// Its job is to retrieve the information related to a plan provided its ID.
func (m *PlanManager) ListPlans(ctx context.Context, params plan_management.ListPlansParams) middleware.Responder {
l.Trace.Printf("[PlanManager] ListPlans endpoint invoked.\n")
callTime := time.Now()
m.monit.APIHit("plan", callTime)
plans, e := m.db.ListPlans()
if e != nil {
s := "Problem retrieving the Plan from the system: " + e.Error()
errorReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "GET", "route": "/plan"}).Inc()
m.monit.APIHitDone("plan", callTime)
return plan_management.NewListPlansInternalServerError().WithPayload(&errorReturn)
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "200", "method": "GET", "route": "/plan"}).Inc()
m.monit.APIHitDone("plan", callTime)
return plan_management.NewListPlansOK().WithPayload(plans)
}
// UpdatePlan (Swagger func) is the function behind the (PUT) endpoint /plan/{id}
// Its job is to update the plan linked to the provided ID with the new plan data.
func (m *PlanManager) UpdatePlan(ctx context.Context, params plan_management.UpdatePlanParams) middleware.Responder {
l.Trace.Printf("[PlanManager] UpdatePlan endpoint invoked.\n")
callTime := time.Now()
m.monit.APIHit("plan", callTime)
state, e := m.db.UpdatePlan(params.ID, params.Plan)
if e != nil {
s := "Problem retrieving the Plan from the system: " + e.Error()
errorReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "PUT", "route": "/plan/" + params.ID}).Inc()
m.monit.APIHitDone("plan", callTime)
return plan_management.NewUpdatePlanInternalServerError().WithPayload(&errorReturn)
}
if state == statusMissing {
s := "The Plan doesn't exists in the system."
missingReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "404", "method": "PUT", "route": "/plan/" + params.ID}).Inc()
m.monit.APIHitDone("plan", callTime)
return plan_management.NewUpdatePlanNotFound().WithPayload(&missingReturn)
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "200", "method": "PUT", "route": "/plan/" + params.ID}).Inc()
m.monit.APIHitDone("plan", callTime)
return plan_management.NewUpdatePlanOK().WithPayload(params.Plan)
}