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.

105 lines
3.2 KiB

package triggerManager
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/trigger_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"
)
// TriggerManager is the struct defined to group and contain all the methods
// that interact with the trigger 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.
// - BasePath: a string with the base path of the system.
type TriggerManager struct {
db *dbManager.DbParameter
monit *statusManager.StatusManager
BasePath string
}
// New is the function to create the struct TriggerManager.
// 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:
// - TriggerManager: struct to interact with TriggerManager subsystem functionalities.
func New(db *dbManager.DbParameter, monit *statusManager.StatusManager, bp string) *TriggerManager {
l.Trace.Printf("[TriggerManager] Generating new triggerManager.\n")
monit.InitEndpoint("trigger")
return &TriggerManager{
db: db,
monit: monit,
BasePath: bp,
}
}
// getToken job is to extract the Keycloak Bearer token from the http header.
// Parameters:
// - param: a pointer to the http.Request object from which extract.
// Returns:
// - token: a string containing the extracted token or an empty one in case of
// no token available.
func (m *TriggerManager) getToken(param *http.Request) (token string) {
if len(param.Header.Get("Authorization")) > 0 {
token = strings.Fields(param.Header.Get("Authorization"))[1]
}
return
}
// PeriodicRun (Swagger func) is the function behind the (GET)
// /trigger/periodicrun endpoint.
// It is a dummy function for reference.
func (m *TriggerManager) PeriodicRun(ctx context.Context, params trigger_management.PeriodicRunParams) middleware.Responder {
l.Trace.Printf("[Trigger] Periodic endpoint invoked.\n")
callTime := time.Now()
m.monit.APIHit("trigger", callTime)
token := m.getToken(params.HTTPRequest)
if params.Today != nil {
go m.db.InvoicesGeneration(map[string]interface{}{"today": *params.Today}, token)
} else {
go m.db.InvoicesGeneration(nil, token)
}
acceptedReturn := models.ItemCreatedResponse{
APILink: m.BasePath + "/billrun",
Message: "The autonomous periodic run for billing generation has been started...",
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "202", "method": "GET", "route": "/trigger/periodicrun"}).Inc()
m.monit.APIHitDone("trigger", callTime)
return trigger_management.NewPeriodicRunAccepted().WithPayload(&acceptedReturn)
}