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/extensions/lexis/server/config.go

258 lines
7.3 KiB

package main
import (
"strings"
"github.com/segmentio/encoding/json"
"github.com/spf13/viper"
l "gitlab.com/cyclops-utilities/logging"
)
// The following structs: apikey, dbConfig, eventsConfig, generalConfig,
// kafkaConfig, and keycloakConfig are part of the configuration struct which
// acts as the main reference for configuration parameters in the system.
type apiKey struct {
Enabled bool `json:"enabled"`
Key string
Place string
Token string `json:"token"`
}
type configuration struct {
APIKey apiKey
Credit creditConfig
DB dbConfig
Events eventsConfig
General generalConfig
Kafka kafkaConfig
Keycloak keycloakConfig `json:"keycloak"`
OpenStack openStackConfig
Plans planConfig
Prometheus prometheusConfig
}
type creditConfig struct {
Usage bool
}
type dbConfig struct {
CacheRetention string
DbName string
Host string
Password string
Port int
SSLMode string
Username string
}
type eventsConfig struct {
Filters []string
}
type generalConfig struct {
CertificateFile string `json:"certificate_file"`
CertificateKey string `json:"certificate_key"`
CORSEnabled bool
CORSHeaders []string
CORSMethods []string
CORSOrigins []string
HTTPSEnabled bool
InsecureSkipVerify bool
LogFile string
LogLevel string
LogToConsole bool
ServerPort int
Services map[string]string
}
type kafkaConfig struct {
Brokers []string
MaxBytes int
MinBytes int
Offset int64
Partition int
TopicsIn []string
TopicsOut []string
TLSEnabled bool
}
type keycloakConfig struct {
ClientID string `json:"client_id"`
ClientSecret string `json:"client_secret"`
Enabled bool `json:"enabled"`
Host string `json:"host"`
Port int `json:"port"`
Realm string `json:"realm"`
RedirectURL string `json:"redirect_url"`
UseHTTP bool `json:"use_http"`
}
type openStackConfig struct {
Domain string
Filters []string
Keystone string
Password string
Project string
Regions []string
User string
}
type planConfig struct {
Default string
}
type prometheusConfig struct {
Host string
MetricsExport bool
MetricsPort string
MetricsRoute string
}
// dumpConfig 's job is to dumps the configuration in JSON format to the log
// system. It makes use of the masking function to keep some secrecy in the log.
// Parameters:
// - c: configuration type containing the config present in the system.
func dumpConfig(c configuration) {
cfgCopy := c
// deal with configuration params that should be masked
cfgCopy.APIKey.Token = masked(c.APIKey.Token, 4)
cfgCopy.DB.Password = masked(c.DB.Password, 4)
cfgCopy.Keycloak.ClientSecret = masked(c.Keycloak.ClientSecret, 4)
cfgCopy.OpenStack.Password = masked(c.OpenStack.Password, 4)
// mmrshalindent creates a string containing newlines; each line starts with
// two spaces and two spaces are added for each indent...
configJSON, _ := json.MarshalIndent(cfgCopy, " ", " ")
l.Info.Printf("[CONFIG] Configuration settings:\n")
l.Info.Printf("%v\n", string(configJSON))
}
// masked 's job is to return asterisks in place of the characters in a
// string with the exception of the last indicated.
// Parameters:
// - s: string to be masked
// - unmaskedChars: int with the amount (counting from the end of the string) of
// characters to keep unmasked.
// Returns:
// - returnString: the s string passed as parameter masked.
func masked(s string, unmaskedChars int) (returnString string) {
if len(s) <= unmaskedChars {
returnString = s
return
}
asteriskString := strings.Repeat("*", (len(s) - unmaskedChars))
returnString = asteriskString + string(s[len(s)-unmaskedChars:])
return
}
// parseConfig handles the filling of the config struct with the data Viper gets
// from the configuration file.
// Returns:
// - c: the configuration struct filled with the relevant parsed configuration.
func parseConfig() (c configuration) {
l.Trace.Printf("[CONFIG] Retrieving configuration.\n")
c = configuration{
APIKey: apiKey{
Enabled: viper.GetBool("apikey.enabled"),
Key: viper.GetString("apikey.key"),
Place: viper.GetString("apikey.place"),
Token: viper.GetString("apikey.token"),
},
Credit: creditConfig{
Usage: viper.GetBool("credit.usageinsteadofcost"),
},
DB: dbConfig{
CacheRetention: viper.GetString("portaldb.cacheretention"),
DbName: viper.GetString("portaldb.dbname"),
Host: viper.GetString("portaldb.host"),
Password: viper.GetString("portaldb.password"),
Port: viper.GetInt("portaldb.port"),
SSLMode: viper.GetString("portaldb.sslmode"),
Username: viper.GetString("portaldb.username"),
},
Events: eventsConfig{
Filters: viper.GetStringSlice("events.filters"),
},
General: generalConfig{
CertificateFile: viper.GetString("general.certificatefile"),
CertificateKey: viper.GetString("general.certificatekey"),
CORSEnabled: viper.GetBool("general.corsenabled"),
CORSHeaders: viper.GetStringSlice("general.corsheaders"),
CORSMethods: viper.GetStringSlice("general.corsmethods"),
CORSOrigins: viper.GetStringSlice("general.corsorigins"),
HTTPSEnabled: viper.GetBool("general.httpsenabled"),
InsecureSkipVerify: viper.GetBool("general.insecureskipverify"),
LogFile: viper.GetString("general.logfile"),
LogLevel: viper.GetString("general.loglevel"),
LogToConsole: viper.GetBool("general.logtoconsole"),
ServerPort: viper.GetInt("general.serverport"),
Services: viper.GetStringMapString("general.services"),
},
Kafka: kafkaConfig{
Brokers: viper.GetStringSlice("kafka.brokers"),
MaxBytes: viper.GetInt("kafka.sizemax"),
MinBytes: viper.GetInt("kafka.sizemin"),
Offset: viper.GetInt64("kafka.offset"),
Partition: viper.GetInt("kafka.partition"),
TopicsIn: viper.GetStringSlice("kafka." + service + "in"),
TopicsOut: viper.GetStringSlice("kafka." + service + "out"),
TLSEnabled: viper.GetBool("kafka.tlsenabled"),
},
Keycloak: keycloakConfig{
ClientID: viper.GetString("keycloak.clientid"),
ClientSecret: viper.GetString("keycloak.clientsecret"),
Enabled: viper.GetBool("keycloak.enabled"),
Host: viper.GetString("keycloak.host"),
Port: viper.GetInt("keycloak.port"),
Realm: viper.GetString("keycloak.realm"),
RedirectURL: viper.GetString("keycloak.redirecturl"),
UseHTTP: viper.GetBool("keycloak.usehttp"),
},
OpenStack: openStackConfig{
Domain: viper.GetString("openstack.domain"),
Filters: viper.GetStringSlice("openstack.filters"),
Keystone: viper.GetString("openstack.keystone"),
Password: viper.GetString("openstack.password"),
Project: viper.GetString("openstack.project"),
Regions: viper.GetStringSlice("openstack.region"),
User: viper.GetString("openstack.user"),
},
Plans: planConfig{
Default: viper.GetString("Plans.default"),
},
Prometheus: prometheusConfig{
Host: viper.GetString("prometheus.host"),
MetricsExport: viper.GetBool("prometheus.metricsexport"),
MetricsPort: viper.GetString("prometheus.metricsport"),
MetricsRoute: viper.GetString("prometheus.metricsroute"),
},
}
return
}