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.
290 lines
7.6 KiB
290 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)
|
|
|
|
}
|
|
|