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.
 
 
cyclops-4-hpc/services/billing/server/main.go

176 lines
4.3 KiB

package main
import (
"crypto/tls"
"encoding/json"
"flag"
"fmt"
"log"
"net/http"
"os"
"strconv"
"strings"
"time"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
"github.com/spf13/viper"
"github.com/Cyclops-Labs/cyclops-4-hpc.git/services/billing/restapi"
"github.com/Cyclops-Labs/cyclops-4-hpc.git/services/billing/server/dbManager"
l "gitlab.com/cyclops-utilities/logging"
)
var (
cfg configuration
version string
service string
)
// dbStart handles the initialization of the dbManager returning a pointer to
// the DbParameter to be able to use the dbManager methods.
// Parameters:
// - models: variadic interface{} containing all the models that need to be
// migrated to the db.
// Returns:
// - DbParameter reference.
func dbStart(models ...interface{}) *dbManager.DbParameter {
connStr := "user=" + cfg.DB.Username + " password=" + cfg.DB.Password +
" dbname=" + cfg.DB.DbName + " sslmode=" + cfg.DB.SSLMode +
" host=" + cfg.DB.Host + " port=" + strconv.Itoa(cfg.DB.Port)
return dbManager.New(connStr, models...)
}
// getBasePath function is to get the base URL of the server.
// Returns:
// - String with the value of the base URL of the server.
func getBasePath() string {
type jsonBasePath struct {
BasePath string
}
bp := jsonBasePath{}
e := json.Unmarshal(restapi.SwaggerJSON, &bp)
if e != nil {
l.Warning.Printf("[MAIN] Unmarshalling of the basepath failed: %v\n", e)
}
return bp.BasePath
}
func init() {
confFile := flag.String("conf", "./config", "configuration file path (without toml extension)")
flag.Parse()
//placeholder code as the default value will ensure this situation will never arise
if len(*confFile) == 0 {
fmt.Printf("Usage: %v -conf=/path/to/configuration/file\n", strings.Title(service))
os.Exit(0)
}
// err := gcfg.ReadFileInto(&cfg, *confFile)
viper.SetConfigName(*confFile) // name of config file (without extension)
viper.SetConfigType("toml")
viper.AddConfigPath(".") // path to look for the config file in
err := viper.ReadInConfig() // Find and read the config file
if err != nil {
// TODO(murp) - differentiate between file not found and formatting error in
// config file)
fmt.Printf("[MAIN] Failed to parse configuration data: %v\nCorrect usage: %v -conf=/path/to/configuration/file\n", err, strings.Title(service))
os.Exit(1)
}
cfg = parseConfig()
e := l.InitLogger(cfg.General.LogFile, cfg.General.LogLevel, cfg.General.LogToConsole)
if e != nil {
fmt.Printf("[MAIN] Initialization of the logger failed. Error: %v\n", e)
}
l.Info.Printf("Cyclops Labs %v Manager version %v initialized\n", strings.Title(service), version)
dumpConfig(cfg)
}
func main() {
//Getting the service handler and prometheus register
h, r, e := getService()
if e != nil {
log.Fatal(e)
}
if cfg.Prometheus.MetricsExport {
l.Info.Printf("[MAIN] Starting to serve Prometheus Metrics, access server on https://localhost:%v/%v\n", cfg.Prometheus.MetricsPort, cfg.Prometheus.MetricsRoute)
go func() {
http.Handle(cfg.Prometheus.MetricsRoute, promhttp.HandlerFor(r, promhttp.HandlerOpts{}))
log.Fatal(http.ListenAndServe(":"+cfg.Prometheus.MetricsPort, nil))
}()
}
serviceLocation := ":" + strconv.Itoa(cfg.General.ServerPort)
if cfg.General.HTTPSEnabled {
c := &tls.Config{
MinVersion: tls.VersionTLS12,
CurvePreferences: []tls.CurveID{tls.CurveP521, tls.CurveP384, tls.CurveP256},
PreferServerCipherSuites: true,
}
srv := &http.Server{
Addr: serviceLocation,
Handler: h,
TLSConfig: c,
TLSNextProto: make(map[string]func(*http.Server, *tls.Conn, http.Handler), 0),
}
l.Info.Printf("[MAIN] Starting to serve %v, access server on https://localhost%v\n", strings.Title(service), serviceLocation)
metricTime.With(prometheus.Labels{"type": "Service (HTTPS) start time"}).Set(float64(time.Now().Unix()))
log.Fatal(srv.ListenAndServeTLS(cfg.General.CertificateFile, cfg.General.CertificateKey))
} else {
l.Info.Printf("[MAIN] Starting to serve %v, access server on http://localhost%v\n", strings.Title(service), serviceLocation)
metricTime.With(prometheus.Labels{"type": "Service (HTTP) start time"}).Set(float64(time.Now().Unix()))
// Run the standard http server
log.Fatal(http.ListenAndServe(serviceLocation, h))
}
}