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.
 
 
cyclops-4-hpc/extensions/lexis/server/service.go

185 lines
5.4 KiB

package main
import (
"net/http"
"net/url"
"strings"
httptransport "github.com/go-openapi/runtime/client"
"github.com/prometheus/client_golang/prometheus"
"github.com/rs/cors"
"github.com/Cyclops-Labs/cyclops-4-hpc.git/extensions/lexis/restapi"
"github.com/Cyclops-Labs/cyclops-4-hpc.git/extensions/lexis/server/dbManager"
"github.com/Cyclops-Labs/cyclops-4-hpc.git/extensions/lexis/server/statusManager"
"github.com/Cyclops-Labs/cyclops-4-hpc.git/extensions/lexis/server/syncManager"
"github.com/Cyclops-Labs/cyclops-4-hpc.git/extensions/lexis/server/triggerManager"
csClient "github.com/Cyclops-Labs/cyclops-4-hpc.git/services/credit-system/client"
cusClient "github.com/Cyclops-Labs/cyclops-4-hpc.git/services/customerdb/client"
pmClient "github.com/Cyclops-Labs/cyclops-4-hpc.git/services/plan-manager/client"
udrClient "github.com/Cyclops-Labs/cyclops-4-hpc.git/services/udr/client"
l "gitlab.com/cyclops-utilities/logging"
)
// getService is the uService instantiation function. A sample of the elements
// that need to be personalized for a new uService are provided.
// Returns:
// - hadler: return the http.handler with the swagger and (optionally) the CORS
// configured according to the config provided
// - e: in case of any error it's propagated to the invoker
func getService() (handler http.Handler, register *prometheus.Registry, e error) {
l.Trace.Printf("[MAIN] Intializing service [ %v ] handler\n", strings.Title(service))
// TABLE0,1,n have to be customized
db := dbStart()
mon := statusManager.New(db)
// Prometheus Metrics linked to dbParameter
db.Metrics, register = prometheusStart()
// cache linked to the dbParameter
db.Cache = cacheStart(db.Metrics["cache"])
// In case of needed, here is where kafka support is started
// The functions needs to be customized accordingly to the needs of the service
// And the parts of the service that might need to send messages need to get
// the channel
// _ = kafkaStart(db, mon)
//bp := getBasePath()
db.Configs.CreditSystem = csClient.Config{
URL: &url.URL{
Host: cfg.General.Services["creditsystem"],
Path: cusClient.DefaultBasePath,
Scheme: "http",
},
AuthInfo: httptransport.APIKeyAuth(cfg.APIKey.Key, cfg.APIKey.Place, cfg.APIKey.Token),
}
db.Configs.CustomerDB = cusClient.Config{
URL: &url.URL{
Host: cfg.General.Services["customerdb"],
Path: cusClient.DefaultBasePath,
Scheme: "http",
},
AuthInfo: httptransport.APIKeyAuth(cfg.APIKey.Key, cfg.APIKey.Place, cfg.APIKey.Token),
}
db.Configs.PlanManager = pmClient.Config{
URL: &url.URL{
Host: cfg.General.Services["planmanager"],
Path: pmClient.DefaultBasePath,
Scheme: "http",
},
AuthInfo: httptransport.APIKeyAuth(cfg.APIKey.Key, cfg.APIKey.Place, cfg.APIKey.Token),
}
db.Configs.UDR = udrClient.Config{
URL: &url.URL{
Host: cfg.General.Services["udr"],
Path: pmClient.DefaultBasePath,
Scheme: "http",
},
AuthInfo: httptransport.APIKeyAuth(cfg.APIKey.Key, cfg.APIKey.Place, cfg.APIKey.Token),
}
db.Configs.OpenStack = dbManager.OpenStackConfig{
Domain: cfg.OpenStack.Domain,
Filters: cfg.OpenStack.Filters,
Keystone: cfg.OpenStack.Keystone,
Password: cfg.OpenStack.Password,
Project: cfg.OpenStack.Project,
Regions: cfg.OpenStack.Regions,
Username: cfg.OpenStack.User,
}
// Parts of the service HERE
syncer := syncManager.New(db, mon)
trigger := triggerManager.New(db, mon)
// Initiate the http handler, with the objects that are implementing the business logic.
h, e := restapi.Handler(restapi.Config{
StatusManagementAPI: mon,
SyncManagementAPI: syncer,
TriggerManagementAPI: trigger,
Logger: l.Info.Printf,
AuthKeycloak: AuthKeycloak,
AuthAPIKeyHeader: AuthAPIKey,
AuthAPIKeyParam: AuthAPIKey,
})
if e != nil {
return
}
handler = h
// CORS
if cfg.General.CORSEnabled {
l.Trace.Printf("[MAIN] Enabling CORS for the service [ %v ]\n", strings.Title(service))
handler = cors.New(
cors.Options{
Debug: (cfg.General.LogLevel == "DEBUG") || (cfg.General.LogLevel == "TRACE"),
AllowedOrigins: cfg.General.CORSOrigins,
AllowedHeaders: cfg.General.CORSHeaders,
AllowedMethods: cfg.General.CORSMethods,
}).Handler(h)
}
return
}
// kafkaStart handles the initialization of the kafka service.
// This is a sample function with the most basic usage of the kafka service, it
// should be redefined to match the needs of the service.
// Parameters:
// - db: DbPAramenter reference for interaction with the db.
// - mon: statusManager parameter reference to interact with the statusManager
// subsystem
// Returns:
// - ch: a interface{} channel to be able to send thing through the kafka topic generated.
func kafkaStart(db *dbManager.DbParameter, mon *statusManager.StatusManager) (ch chan interface{}) {
l.Trace.Printf("[MAIN] Intializing Kafka\n")
f := func(db *dbManager.DbParameter, model interface{}) (e error) {
////if e = db.ProcessCDR(*model.(*cdrModels.CReport), ""); e != nil {
//// l.Warning.Printf("[KAFKA] There was an error while apliying the linked function. Error: %v\n", e)
////} else {
//// l.Trace.Printf("[KAFKA] Aplication of the linked function done succesfully.\n")
////}
return
}
ch = make(chan interface{})
handler := kafkaHandlerConf{
in: []kafkaPackage{
{
topic: cfg.Kafka.TopicsIn[0],
model: nil,
function: f,
saveDB: false,
},
},
}
kafkaHandler(db, mon, handler)
return
}