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.
 
 

321 lines
10 KiB

package creditManager
import (
"context"
"fmt"
"net/http"
"time"
"github.com/go-openapi/runtime/middleware"
"github.com/prometheus/client_golang/prometheus"
"github.com/Cyclops-Labs/cyclops-4-hpc.git/services/credit-system/models"
"github.com/Cyclops-Labs/cyclops-4-hpc.git/services/credit-system/restapi/operations/credit_management"
"github.com/Cyclops-Labs/cyclops-4-hpc.git/services/credit-system/server/dbManager"
"github.com/Cyclops-Labs/cyclops-4-hpc.git/services/credit-system/server/statusManager"
l "gitlab.com/cyclops-utilities/logging"
)
// CreditManager is the struct defined to group and contain all the methods
// that interact with the credit endpoint.
// Parameters:
// - 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 CreditManager struct {
db *dbManager.DbParameter
monit *statusManager.StatusManager
}
// New is the function to create the struct CreditManager.
// Parameters:
// - DbParameter: reference pointing to the DbParameter that allows the interaction
// with the DBManager methods.
// - monit: a reference to the StatusManager to be able to interact with the
// status subsystem.
// Returns:
// - CreditManager: struct to interact with CreditManager subsystem functionalities.
func New(db *dbManager.DbParameter, monit *statusManager.StatusManager) *CreditManager {
l.Trace.Printf("[CreditManager] Generating new CreditManager.\n")
monit.InitEndpoint("credit")
return &CreditManager{
db: db,
monit: monit,
}
}
// AddConsumption (Swagger func) is the function behind the (POST) API Endpoint
// /credit/consumed/{id}
// Its job is to add a system consumption in the credit account provided the
// account ID.
func (m *CreditManager) AddConsumption(ctx context.Context, params credit_management.AddConsumptionParams) middleware.Responder {
l.Trace.Printf("[CreditManager] AddConsumption endpoint invoked.\n")
callTime := time.Now()
m.monit.APIHit("credit", time.Now())
creditStatus, e := m.db.AddConsumption(params.ID, params.Amount, params.Medium)
if e != nil {
s := "Problem adding the Comsumption: " + e.Error()
errorReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": fmt.Sprint(http.StatusInternalServerError), "method": params.HTTPRequest.Method, "route": params.HTTPRequest.URL.Path}).Inc()
m.monit.APIHitDone("credit", callTime)
return credit_management.NewAddConsumptionInternalServerError().WithPayload(&errorReturn)
}
if creditStatus != nil {
m.db.Metrics["api"].With(prometheus.Labels{"code": fmt.Sprint(http.StatusOK), "method": params.HTTPRequest.Method, "route": params.HTTPRequest.URL.Path}).Inc()
m.monit.APIHitDone("credit", callTime)
return credit_management.NewAddConsumptionOK().WithPayload(creditStatus)
}
s := "The Account doesn't exists in the system."
missingReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": fmt.Sprint(http.StatusNotFound), "method": params.HTTPRequest.Method, "route": params.HTTPRequest.URL.Path}).Inc()
m.monit.APIHitDone("credit", callTime)
return credit_management.NewAddConsumptionNotFound().WithPayload(&missingReturn)
}
// DecreaseCredit (Swagger func) is the function behind the (POST) API Endpoint
// /credit/available/decrease/{id}
// Its job is to decrease the amount of credit for an account in the system
// provided the account ID.
func (m *CreditManager) DecreaseCredit(ctx context.Context, params credit_management.DecreaseCreditParams) middleware.Responder {
l.Trace.Printf("[CreditManager] DecreaseCredit endpoint invoked.\n")
callTime := time.Now()
m.monit.APIHit("credit", time.Now())
creditStatus, e := m.db.DecreaseCredit(params.ID, params.Amount, params.Medium)
if e != nil {
s := "Problem decreassing the Credit: " + e.Error()
errorReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": fmt.Sprint(http.StatusInternalServerError), "method": params.HTTPRequest.Method, "route": params.HTTPRequest.URL.Path}).Inc()
m.monit.APIHitDone("credit", callTime)
return credit_management.NewDecreaseCreditInternalServerError().WithPayload(&errorReturn)
}
if creditStatus != nil {
m.db.Metrics["api"].With(prometheus.Labels{"code": fmt.Sprint(http.StatusOK), "method": params.HTTPRequest.Method, "route": params.HTTPRequest.URL.Path}).Inc()
m.monit.APIHitDone("credit", callTime)
return credit_management.NewDecreaseCreditOK().WithPayload(creditStatus)
}
s := "The Account doesn't exists in the system."
missingReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": fmt.Sprint(http.StatusNotFound), "method": params.HTTPRequest.Method, "route": params.HTTPRequest.URL.Path}).Inc()
m.monit.APIHitDone("credit", callTime)
return credit_management.NewDecreaseCreditNotFound().WithPayload(&missingReturn)
}
// GetCredit (Swagger func) is the function behind the (GET) API Endpoint
// /account/available/{id}
// Its job is to retrieve the amount of credit available fo an account in the
// system provided the account ID.
func (m *CreditManager) GetCredit(ctx context.Context, params credit_management.GetCreditParams) middleware.Responder {
l.Trace.Printf("[CreditManager] GetCredit endpoint invoked.\n")
callTime := time.Now()
m.monit.APIHit("credit", time.Now())
creditStatus, e := m.db.GetCredit(params.ID)
if e != nil {
s := "Problem getting the Credit Status: " + e.Error()
errorReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": fmt.Sprint(http.StatusInternalServerError), "method": params.HTTPRequest.Method, "route": params.HTTPRequest.URL.Path}).Inc()
m.monit.APIHitDone("credit", callTime)
return credit_management.NewGetCreditInternalServerError().WithPayload(&errorReturn)
}
if creditStatus != nil {
m.db.Metrics["api"].With(prometheus.Labels{"code": fmt.Sprint(http.StatusOK), "method": params.HTTPRequest.Method, "route": params.HTTPRequest.URL.Path}).Inc()
m.monit.APIHitDone("credit", callTime)
return credit_management.NewGetCreditOK().WithPayload(creditStatus)
}
s := "The Account doesn't exists in the system."
missingReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": fmt.Sprint(http.StatusNotFound), "method": params.HTTPRequest.Method, "route": params.HTTPRequest.URL.Path}).Inc()
m.monit.APIHitDone("credit", callTime)
return credit_management.NewGetCreditNotFound().WithPayload(&missingReturn)
}
// GetHistory (Swagger func) is the function behind the (GET) API Endpoint
// /credit/history/{id}
// Its job is to retrieve history of the credit balance for an account in the
// system provided the account ID.
func (m *CreditManager) GetHistory(ctx context.Context, params credit_management.GetHistoryParams) middleware.Responder {
l.Trace.Printf("[CreditManager] GetHistory endpoint invoked.\n")
callTime := time.Now()
m.monit.APIHit("credit", time.Now())
var filter bool
var medium string
if params.FilterSystem != nil {
filter = *params.FilterSystem
} else {
filter = false
}
if params.Medium != nil {
medium = *params.Medium
}
creditStatus, e := m.db.GetHistory(params.ID, filter, medium)
if e != nil {
s := "Problem getting the Credit History: " + e.Error()
errorReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": fmt.Sprint(http.StatusInternalServerError), "method": params.HTTPRequest.Method, "route": params.HTTPRequest.URL.Path}).Inc()
m.monit.APIHitDone("credit", callTime)
return credit_management.NewGetHistoryInternalServerError().WithPayload(&errorReturn)
}
if creditStatus != nil {
m.db.Metrics["api"].With(prometheus.Labels{"code": fmt.Sprint(http.StatusOK), "method": params.HTTPRequest.Method, "route": params.HTTPRequest.URL.Path}).Inc()
m.monit.APIHitDone("credit", callTime)
return credit_management.NewGetHistoryOK().WithPayload(creditStatus)
}
s := "The Account doesn't exists in the system."
missingReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": fmt.Sprint(http.StatusNotFound), "method": params.HTTPRequest.Method, "route": params.HTTPRequest.URL.Path}).Inc()
m.monit.APIHitDone("credit", callTime)
return credit_management.NewGetHistoryNotFound().WithPayload(&missingReturn)
}
// IncreaseCredit (Swagger func) is the function behind the (POST) API Endpoint
// /credit/available/increase/{id}
// Its job is to increase the amount of credit for an account in the system
// provided the account ID.
func (m *CreditManager) IncreaseCredit(ctx context.Context, params credit_management.IncreaseCreditParams) middleware.Responder {
l.Trace.Printf("[CreditManager] IncreaseCredit endpoint invoked.\n")
callTime := time.Now()
m.monit.APIHit("credit", time.Now())
creditStatus, e := m.db.IncreaseCredit(params.ID, params.Amount, params.Medium)
if e != nil {
s := "Problem increassing the Credit: " + e.Error()
errorReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": fmt.Sprint(http.StatusInternalServerError), "method": params.HTTPRequest.Method, "route": params.HTTPRequest.URL.Path}).Inc()
m.monit.APIHitDone("credit", callTime)
return credit_management.NewIncreaseCreditInternalServerError().WithPayload(&errorReturn)
}
if creditStatus != nil {
m.db.Metrics["api"].With(prometheus.Labels{"code": fmt.Sprint(http.StatusOK), "method": params.HTTPRequest.Method, "route": params.HTTPRequest.URL.Path}).Inc()
m.monit.APIHitDone("credit", callTime)
return credit_management.NewIncreaseCreditOK().WithPayload(creditStatus)
}
s := "The Account doesn't exists in the system."
missingReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": fmt.Sprint(http.StatusNotFound), "method": params.HTTPRequest.Method, "route": params.HTTPRequest.URL.Path}).Inc()
m.monit.APIHitDone("credit", callTime)
return credit_management.NewIncreaseCreditNotFound().WithPayload(&missingReturn)
}