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.

291 lines
7.6 KiB

package eventManager
import (
"context"
"strings"
"time"
"github.com/go-openapi/runtime/middleware"
"github.com/prometheus/client_golang/prometheus"
"github.com/Cyclops-Labs/cyclops-4-hpc.git/services/eventsengine/models"
"github.com/Cyclops-Labs/cyclops-4-hpc.git/services/eventsengine/restapi/operations/event_management"
"github.com/Cyclops-Labs/cyclops-4-hpc.git/services/eventsengine/server/dbManager"
"github.com/Cyclops-Labs/cyclops-4-hpc.git/services/eventsengine/server/statusManager"
l "gitlab.com/cyclops-utilities/logging"
)
const (
bigBang = int64(0)
endOfTime = int64(32503680000)
)
// EventManager is the struct defined to group and contain all the methods
// that interact with the events endpoints.
// 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 EventManager struct {
db *dbManager.DbParameter
monit *statusManager.StatusManager
filters []string
}
// New is the function to create the struct EventManager.
// 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:
// - EventManager: struct to interact with EventManager subsystem functionalities.
func New(db *dbManager.DbParameter, monit *statusManager.StatusManager, filters []string) *EventManager {
l.Trace.Printf("[EventManager] Generating new EventManager.\n")
monit.InitEndpoint("event")
return &EventManager{
db: db,
monit: monit,
filters: filters,
}
}
// AddEvent (Swagger func) is the function behind the (POST) API Endpoint
// /event
// Its job is to include in the system the information given by the new event.
func (m *EventManager) AddEvent(ctx context.Context, params event_management.AddEventParams) middleware.Responder {
l.Trace.Printf("[EventManager] AddEvent endpoint invoked.\n")
callTime := time.Now()
m.monit.APIHit("event", callTime)
for _, f := range m.filters {
if f != "" && strings.Contains(params.Event.ResourceName, f) {
l.Warning.Printf("Ignoring event: %v", params.Event.ResourceName)
s := "Event resource is blacklisted, event ignored."
errorReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "POST", "route": "/event"}).Inc()
m.monit.APIHitDone("event", callTime)
return event_management.NewAddEventInternalServerError().WithPayload(&errorReturn)
}
}
e := m.db.AddEvent(*params.Event)
if e != nil {
s := "Error registering the event: " + e.Error()
errorReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "POST", "route": "/event"}).Inc()
m.monit.APIHitDone("event", callTime)
return event_management.NewAddEventInternalServerError().WithPayload(&errorReturn)
}
createdReturn := models.ItemCreatedResponse{
Message: "New Event registered in the system.",
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "201", "method": "POST", "route": "/event"}).Inc()
m.monit.APIHitDone("event", callTime)
return event_management.NewAddEventCreated().WithPayload(&createdReturn)
}
// GetState (Swagger func) is the function behind the (GET) API Endpoint
// /event/status/{id}
// Its job is to get the actual state of the provided account.
func (m *EventManager) GetState(ctx context.Context, params event_management.GetStateParams) middleware.Responder {
l.Trace.Printf("[EventManager] GetState endpoint invoked.\n")
callTime := time.Now()
m.monit.APIHit("event", callTime)
state, e := m.db.GetState(params.Account)
if e != nil {
s := "Retrieval of the associated states failed: " + e.Error()
errorReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "GET", "route": "/event/status/" + params.Account}).Inc()
m.monit.APIHitDone("event", callTime)
return event_management.NewGetStateInternalServerError().WithPayload(&errorReturn)
}
if state != nil {
m.db.Metrics["api"].With(prometheus.Labels{"code": "200", "method": "GET", "route": "/event/status/" + params.Account}).Inc()
m.monit.APIHitDone("event", callTime)
return event_management.NewGetStateOK().WithPayload(state)
}
s := "The Account doesn't exists in the system."
missingReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "404", "method": "GET", "route": "/event/status/" + params.Account}).Inc()
m.monit.APIHitDone("event", callTime)
return event_management.NewGetStateNotFound().WithPayload(&missingReturn)
}
// GetHistory (Swagger func) is the function behind the (GET) API Endpoint
// /event/history/{id}
// Its job is to provide the history of changes in the state of the provided
// account.
func (m *EventManager) GetHistory(ctx context.Context, params event_management.GetHistoryParams) middleware.Responder {
l.Trace.Printf("[EventManager] GetHistory endpoint invoked.\n")
callTime := time.Now()
m.monit.APIHit("event", callTime)
ty, rg := string(""), string("")
from, to := bigBang, endOfTime
if params.Resource != nil {
ty = *params.Resource
}
if params.Region != nil {
rg = *params.Region
}
if params.From != nil {
from = *params.From
}
if params.To != nil {
to = *params.To
}
history, e := m.db.GetHistory(params.Account, ty, rg, from, to)
if e != nil {
s := "Problem retrieving the history of the event: " + e.Error()
errorReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "GET", "route": "/event/history/" + params.Account}).Inc()
m.monit.APIHitDone("event", callTime)
return event_management.NewGetHistoryInternalServerError().WithPayload(&errorReturn)
}
if history != nil {
m.db.Metrics["api"].With(prometheus.Labels{"code": "200", "method": "GET", "route": "/event/history/" + params.Account}).Inc()
m.monit.APIHitDone("event", callTime)
return event_management.NewGetHistoryOK().WithPayload(history)
}
s := "The Usage doesn't exists in the system."
missingReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "404", "method": "GET", "route": "/event/history/" + params.Account}).Inc()
m.monit.APIHitDone("event", callTime)
return event_management.NewGetHistoryNotFound().WithPayload(&missingReturn)
}
// ListState (Swagger func) is the function behind the (GET) API Endpoint
// /event/status
// Its job is to get the actual state of the provided account.
func (m *EventManager) ListStates(ctx context.Context, params event_management.ListStatesParams) middleware.Responder {
l.Trace.Printf("[EventManager] ListState endpoint invoked.\n")
callTime := time.Now()
m.monit.APIHit("event", callTime)
var metric, region string
if params.Resource != nil {
metric = *params.Resource
}
if params.Region != nil {
region = *params.Region
}
state, e := m.db.ListState(metric, region)
if e != nil {
s := "List of accounts states failed: " + e.Error()
errorReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "GET", "route": "/event/status"}).Inc()
m.monit.APIHitDone("event", callTime)
return event_management.NewListStatesInternalServerError().WithPayload(&errorReturn)
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "200", "method": "GET", "route": "/event/status"}).Inc()
m.monit.APIHitDone("event", callTime)
return event_management.NewListStatesOK().WithPayload(state)
}