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.
 
 

326 lines
9.8 KiB

package bulkManager
import (
"context"
"net/http"
"strings"
"time"
"github.com/go-openapi/runtime/middleware"
"github.com/prometheus/client_golang/prometheus"
"github.com/Cyclops-Labs/cyclops-4-hpc.git/services/billing/models"
"github.com/Cyclops-Labs/cyclops-4-hpc.git/services/billing/restapi/operations/bulk_management"
"github.com/Cyclops-Labs/cyclops-4-hpc.git/services/billing/server/dbManager"
"github.com/Cyclops-Labs/cyclops-4-hpc.git/services/billing/server/statusManager"
l "gitlab.com/cyclops-utilities/logging"
)
// BulkManager is the struct defined to group and contain all the methods
// that interact with the bulk subsystem.
// 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 BulkManager struct {
db *dbManager.DbParameter
monit *statusManager.StatusManager
}
// New is the function to create the struct BulkManager.
// 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.
// Returns:
// - BulkManager: struct to interact with BulkManager subsystem functionalities.
func New(db *dbManager.DbParameter, monit *statusManager.StatusManager) *BulkManager {
l.Trace.Printf("[BulkManager] Generating new bulkManager.\n")
monit.InitEndpoint("bulk")
return &BulkManager{
db: db,
monit: monit,
}
}
func (m *BulkManager) getToken(param *http.Request) (token string) {
if len(param.Header.Get("Authorization")) > 0 {
token = strings.Fields(param.Header.Get("Authorization"))[1]
}
return
}
// GenerateInvoiceForCustomer (Swagger func) is the function behind
// GetBillRun (Swagger func) is the function behind the (GET) endpoint
// /billrun/{id}
// Its job is to provide the requested billruns from the system.
func (m *BulkManager) GetBillRun(ctx context.Context, params bulk_management.GetBillRunParams) middleware.Responder {
l.Trace.Printf("[BulkManager] GetBillRun endpoint invoked.\n")
callTime := time.Now()
m.monit.APIHit("bulk", callTime)
object, e := m.db.GetBillRun(params.ID)
if e != nil {
s := "Problem while retrieving the Billrun from the db: " + e.Error()
errorReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "GET", "route": "/billrun/" + string(params.ID)}).Inc()
m.monit.APIHitDone("bulk", callTime)
return bulk_management.NewGetBillRunInternalServerError().WithPayload(&errorReturn)
}
if object != nil {
m.db.Metrics["api"].With(prometheus.Labels{"code": "200", "method": "GET", "route": "/billrun/" + string(params.ID)}).Inc()
m.monit.APIHitDone("bulk", callTime)
return bulk_management.NewGetBillRunOK().WithPayload(object)
}
s := "The Billrun doesn't exists in the system."
missingReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "404", "method": "GET", "route": "/billrun/" + string(params.ID)}).Inc()
m.monit.APIHitDone("bulk", callTime)
return bulk_management.NewGetBillRunNotFound().WithPayload(&missingReturn)
}
// ListBillRuns (Swagger func) is the function behind the (GET) endpoint
// /billrun
// Its job is to provide a list of all the billruns currently in the system.
func (m *BulkManager) ListBillRuns(ctx context.Context, params bulk_management.ListBillRunsParams) middleware.Responder {
l.Trace.Printf("[BulkManager] ListBillRuns endpoint invoked.\n")
callTime := time.Now()
m.monit.APIHit("bulk", callTime)
object, e := m.db.ListBillRuns(params.Months)
if e != nil {
s := "Problem while retrieving the Billruns from the db: " + e.Error()
errorReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "GET", "route": "/billrun"}).Inc()
m.monit.APIHitDone("bulk", callTime)
return bulk_management.NewListBillRunsInternalServerError().WithPayload(&errorReturn)
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "200", "method": "GET", "route": "/billrun"}).Inc()
m.monit.APIHitDone("bulk", callTime)
return bulk_management.NewListBillRunsOK().WithPayload(object)
}
// ListBillRunsByOrganization (Swagger func) is the function behind the (GET)
// endpoint /billrun/organization/{id}
// Its job is to provide a list of all the billruns currently in the system
// linked to the provided organization.
func (m *BulkManager) ListBillRunsByOrganization(ctx context.Context, params bulk_management.ListBillRunsByOrganizationParams) middleware.Responder {
l.Trace.Printf("[BulkManager] ListBillRuns endpoint invoked.\n")
callTime := time.Now()
m.monit.APIHit("bulk", callTime)
token := m.getToken(params.HTTPRequest)
object, e := m.db.ListBillRunsByOrganization(params.ID, token, params.Months)
if e != nil {
s := "Problem while retrieving the Billruns from the db: " + e.Error()
errorReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "GET", "route": "/billrun/organization/" + params.ID}).Inc()
m.monit.APIHitDone("bulk", callTime)
return bulk_management.NewListBillRunsByOrganizationInternalServerError().WithPayload(&errorReturn)
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "200", "method": "GET", "route": "/billrun/organization/" + params.ID}).Inc()
m.monit.APIHitDone("bulk", callTime)
return bulk_management.NewListBillRunsByOrganizationOK().WithPayload(object)
}
// ReRunAllBillRuns (Swagger func) is the function behind the (PUT) endpoint
// ReRunAllBillRuns (Swagger func) is the function behind the (PUT) endpoint
// /billrun
// Its job is to re-run all the billruns currently not completed in the system.
func (m *BulkManager) ReRunAllBillRuns(ctx context.Context, params bulk_management.ReRunAllBillRunsParams) middleware.Responder {
l.Trace.Printf("[BulkManager] ReRunAllBillRuns endpoint invoked.\n")
callTime := time.Now()
m.monit.APIHit("bulk", callTime)
token := m.getToken(params.HTTPRequest)
state, e := m.db.ReRunBillRun("", params.Months, token)
if e != nil {
s := "Problems while trying to re-run the not finished Billruns: " + e.Error()
errorReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "PUT", "route": "/billrun"}).Inc()
m.monit.APIHitDone("bulk", callTime)
return bulk_management.NewReRunAllBillRunsInternalServerError().WithPayload(&errorReturn)
}
if state == dbManager.StatusMissing {
s := "The Billrun doesn't exists in the system."
missingReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "404", "method": "PUT", "route": "/billrun"}).Inc()
m.monit.APIHitDone("bulk", callTime)
return bulk_management.NewReRunAllBillRunsNotFound().WithPayload(&missingReturn)
}
if state == dbManager.StatusOK {
acceptedReturn := models.ItemCreatedResponse{
Message: "The request has been added to the queue",
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "202", "method": "PUT", "route": "/billrun"}).Inc()
m.monit.APIHitDone("bulk", callTime)
return bulk_management.NewReRunAllBillRunsAccepted().WithPayload(&acceptedReturn)
}
s := "This point shouldn't had been reached, contact Diego. Previous error: " + e.Error()
errorReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "PUT", "route": "/billrun"}).Inc()
m.monit.APIHitDone("bulk", callTime)
return bulk_management.NewReRunAllBillRunsInternalServerError().WithPayload(&errorReturn)
}
// ReRunBillRun (Swagger func) is the function behind the (PUT) endpoint
// /billrun/{id}
// Its job is to rerun the provided billrun currently not completed in the system.
func (m *BulkManager) ReRunBillRun(ctx context.Context, params bulk_management.ReRunBillRunParams) middleware.Responder {
l.Trace.Printf("[BulkManager] ReRunBillRun endpoint invoked.\n")
callTime := time.Now()
m.monit.APIHit("bulk", callTime)
token := m.getToken(params.HTTPRequest)
state, e := m.db.ReRunBillRun(params.ID, nil, token)
if e != nil {
s := "Problem while trying to re-run the not finished Billrun: " + e.Error()
errorReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "PUT", "route": "/billrun/" + string(params.ID)}).Inc()
m.monit.APIHitDone("bulk", callTime)
return bulk_management.NewReRunBillRunInternalServerError().WithPayload(&errorReturn)
}
if state == dbManager.StatusMissing {
s := "The Billrun doesn't exists in the system."
missingReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "404", "method": "PUT", "route": "/billrun/" + string(params.ID)}).Inc()
m.monit.APIHitDone("bulk", callTime)
return bulk_management.NewReRunBillRunNotFound().WithPayload(&missingReturn)
}
if state == dbManager.StatusOK {
acceptedReturn := models.ItemCreatedResponse{
Message: "The request has been added to the queue",
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "202", "method": "PUT", "route": "/billrun/" + string(params.ID)}).Inc()
m.monit.APIHitDone("bulk", callTime)
return bulk_management.NewReRunBillRunAccepted().WithPayload(&acceptedReturn)
}
s := "This point shouldn't had been reached, contact Diego. Previous error: " + e.Error()
errorReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "PUT", "route": "/billrun/" + string(params.ID)}).Inc()
m.monit.APIHitDone("bulk", callTime)
return bulk_management.NewReRunBillRunInternalServerError().WithPayload(&errorReturn)
}