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.
185 lines
5.4 KiB
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
|
|
|
|
}
|
|
|