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.
 
 

246 lines
7.2 KiB

package main
import (
"encoding/json"
"strings"
"github.com/spf13/viper"
l "gitlab.com/cyclops-utilities/logging"
)
// The following structs are part of the configuration struct which
// acts as the main reference for configuration parameters in the system.
type apiKey struct {
Enabled bool
Key string
Place string
Token string
}
type configuration struct {
APIKey apiKey
General generalConfig
Heappe heappeConfig
Kafka kafkaConfig
Keycloak keycloakConfig
Lieutenant lieutenantConfig
OpenStack openStackConfig
Prometheus prometheusConfig
RGW rgwConfig
NameFilters []string
ProjectFilters []string
Services map[string]string
}
type generalConfig struct {
InsecureSkipVerify bool
LogFile string
LogLevel string
LogToConsole bool
ObjectsPeriodicity int
Periodicity int
PrometheusPeriodicity int
}
type heappeConfig struct {
Username string
Password string
GroupResourceUsageReportURI string
AuthenticateUserPasswordURI string
}
type kafkaConfig struct {
Brokers []string
MaxBytes int
MinBytes int
Offset int64
Partition int
TLSEnabled bool
TopicUDR string
TopicEEngine string
}
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 lieutenantConfig struct {
Host string
Token string
}
type openStackConfig struct {
Domain string
Keystone string
Password string
Project string
Region string
User string
}
type prometheusConfig struct {
Host string
MetricsExport bool
MetricsPort string
MetricsRoute string
}
type rgwConfig struct {
AccessKeyID string
AdminPath string
Region string
SecretAccessKey string
ServerURL 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.Heappe.Username = masked(c.Heappe.Username, 4)
cfgCopy.Heappe.Password = masked(c.Heappe.Password, 4)
cfgCopy.Keycloak.ClientSecret = masked(c.Keycloak.ClientSecret, 4)
cfgCopy.Lieutenant.Token = masked(c.Lieutenant.Token, 4)
cfgCopy.OpenStack.Password = masked(c.OpenStack.Password, 4)
cfgCopy.RGW.AccessKeyID = masked(c.RGW.AccessKeyID, 4)
cfgCopy.RGW.SecretAccessKey = masked(c.RGW.SecretAccessKey, 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"),
},
General: generalConfig{
InsecureSkipVerify: viper.GetBool("general.insecureskipverify"),
LogFile: viper.GetString("general.logfile"),
LogLevel: viper.GetString("general.loglevel"),
LogToConsole: viper.GetBool("general.logtoconsole"),
ObjectsPeriodicity: viper.GetInt("general.objectsperiodicity"),
Periodicity: viper.GetInt("general.periodicity"),
PrometheusPeriodicity: viper.GetInt("general.prometheusperiodicity"),
},
Heappe: heappeConfig{
Username: viper.GetString("heappe.username"),
Password: viper.GetString("heappe.password"),
GroupResourceUsageReportURI: viper.GetString("heappe.groupResourceUsageReportUri"),
AuthenticateUserPasswordURI: viper.GetString("heappe.authenticateUserPasswordUri"),
},
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"),
TLSEnabled: viper.GetBool("kafka.tlsenabled"),
TopicUDR: viper.GetString("kafka.topicudr"),
TopicEEngine: viper.GetString("kafka.topiceengine"),
},
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"),
},
Lieutenant: lieutenantConfig{
Host: viper.GetString("lieutenant.host"),
Token: viper.GetString("lieutenant.token"),
},
OpenStack: openStackConfig{
Domain: viper.GetString("openstack.domain"),
Keystone: viper.GetString("openstack.keystone"),
Password: viper.GetString("openstack.password"),
Project: viper.GetString("openstack.project"),
Region: viper.GetString("openstack.region"),
User: viper.GetString("openstack.user"),
},
Prometheus: prometheusConfig{
Host: viper.GetString("prometheus.host"),
MetricsExport: viper.GetBool("prometheus.metricsexport"),
MetricsPort: viper.GetString("prometheus.metricsport"),
MetricsRoute: viper.GetString("prometheus.metricsroute"),
},
RGW: rgwConfig{
AccessKeyID: viper.GetString("rgw.accesskey"),
AdminPath: viper.GetString("rgw.adminpath"),
Region: viper.GetString("rgw.region"),
SecretAccessKey: viper.GetString("rgw.secretaccesskey"),
ServerURL: viper.GetString("rgw.serverurl"),
},
NameFilters: viper.GetStringSlice("events.namefilters"),
ProjectFilters: viper.GetStringSlice("events.projectfilters"),
Services: viper.GetStringMapString("services"),
}
return
}