Skip to content
Snippets Groups Projects
configs.go 7.3 KiB
Newer Older
  • Learn to ignore specific revisions
  • package config
    
    import (
    
    Olgun Cengiz's avatar
    Olgun Cengiz committed
    	"io/ioutil"
    
    Viktor Popov's avatar
    Viktor Popov committed
    	"os"
    	"path/filepath"
    	"strings"
    
    Olgun Cengiz's avatar
    Olgun Cengiz committed
    	"code.vereign.com/code/viam-apis/clientutils"
    
    Olgun Cengiz's avatar
    Olgun Cengiz committed
    	"code.vereign.com/code/viam-apis/config"
    
    Olgun Cengiz's avatar
    Olgun Cengiz committed
    	"code.vereign.com/code/viam-apis/errors"
    
    
    	"code.vereign.com/code/viam-apis/log"
    
    
    	"code.vereign.com/code/viam-apis/authentication"
    	"github.com/spf13/viper"
    
    
    	_ "github.com/spf13/viper/remote"
    )
    
    Viktor Popov's avatar
    Viktor Popov committed
    
    
    var SystemAuth = &authentication.Authentication{
    	Uuid:    "undefined",
    	Session: "undefined",
    }
    
    
    Olgun Cengiz's avatar
    Olgun Cengiz committed
    type Configuration struct {
    
    Olgun Cengiz's avatar
    Olgun Cengiz committed
    	ListenAddress        string `required:"false" yaml:"listenAddress"`
    	GrpcListenAddress    string `required:"false" yaml:"grpcListenAddress"`
    
    Olgun Cengiz's avatar
    Olgun Cengiz committed
    	SystemAuthentication struct {
    
    Olgun Cengiz's avatar
    Olgun Cengiz committed
    		UUID    string `required:"false" yaml:"viamUUID"`
    		Session string `required:"false" yaml:"viamSession"`
    	} `required:"false" yaml:"systemAuthentication"`
    	DataStorageAgentURL        string `required:"false" yaml:"dataStorageAgentURL"`
    	EntitiesManagementAgentURL string `required:"false" yaml:"entitiesManagementAgentURL"`
    	MaxMessageSize             int    `required:"false" yaml:"maxMessageSize"`
    
    Olgun Cengiz's avatar
    Olgun Cengiz committed
    	Certification              struct {
    
    Olgun Cengiz's avatar
    Olgun Cengiz committed
    		Path                      string              `required:"true" yaml:"path"`
    		CertificateFile           string              `required:"true" yaml:"certificateFile"`
    		CertificatePEM            []byte              `required:"true"`
    		PrivateKeyFile            string              `required:"true" yaml:"privateKeyFile"`
    		PrivateKeyPEM             []byte              `required:"true"`
    		CaCertificateFile         string              `required:"true" yaml:"caCertificateFile"`
    		CaCertificatePEM          []byte              `required:"true"`
    		EncryptionCertificateFile string              `required:"true" yaml:"encryptionCertificateFile"`
    		EncryptionCertificatePEM  []byte              `required:"true"`
    		EncryptionCertificate     []*x509.Certificate `required:"true"`
    		EncryptionPrivateKeyFile  string              `required:"true" yaml:"encryptionPrivateKeyFile"`
    		EncryptionPrivateKeyPEM   []byte              `required:"true"`
    		EncryptionPrivateKey      crypto.Signer       `required:"true"`
    		VereignCertificateFile    string              `required:"true" yaml:"vereignCertificateFile"`
    		VereignCertificatePEM     []byte              `required:"true"`
    	} `required:"true" yaml:"certification"`
    	PrometeusListenAddress  string `required:"false" yaml:"prometeusListenAddress"`
    	MetricEnvironmentPrefix string `required:"false" yaml:"metricEnvironmentPrefix"`
    	ReplaceKey              bool   `required:"false" yaml:"replaceKey"`
    	GlobalLogLevel          string `required:"false" yaml:"globalLogLevel"`
    
    Olgun Cengiz's avatar
    Olgun Cengiz committed
    }
    
    var Config Configuration
    
    
    Olgun Cengiz's avatar
    Olgun Cengiz committed
    // LoadConfigValues loads config values from config file
    func LoadConfigValues(configFile, etcdURL string) error {
    	setConfigValues(configFile, etcdURL)
    
    	calculateConfigValues()
    
    	err := config.CheckConfigValues(Config)
    	if err != nil {
    		log.Fatalf("Exiting due to wrong configuration: %s", err)
    		return err
    	}
    
    	return nil
    }
    
    
    Olgun Cengiz's avatar
    Olgun Cengiz committed
    // SetConfigValues Sets Values For Config Variable
    
    Olgun Cengiz's avatar
    Olgun Cengiz committed
    func setConfigValues(configFile, etcdURL string) {
    
    Olgun Cengiz's avatar
    Olgun Cengiz committed
    	// Set default values for configuration variable
    
    Olgun Cengiz's avatar
    Olgun Cengiz committed
    	// NOTE: Only for 'required:"false"' fields
    
    Olgun Cengiz's avatar
    Olgun Cengiz committed
    	Config.ListenAddress = ":7878"
    	Config.GrpcListenAddress = ":7877"
    	Config.SystemAuthentication.UUID = "viam-system"
    	Config.SystemAuthentication.Session = "viam-session"
    	Config.DataStorageAgentURL = "data-storage-agent:7777"
    	Config.EntitiesManagementAgentURL = "entities-management-agent:7779"
    	Config.MaxMessageSize = 64
    	Config.PrometeusListenAddress = ":2112"
    	Config.MetricEnvironmentPrefix = "staging_data_storage_agent"
    	Config.ReplaceKey = false
    	Config.GlobalLogLevel = "info"
    
    	// Read Config File
    
    Viktor Popov's avatar
    Viktor Popov committed
    	if configFile != "" {
    		configName := strings.Split(filepath.Base(configFile), ".")[0]
    		configDir := filepath.Dir(configFile)
    		viper.SetConfigName(configName)
    		viper.AddConfigPath(configDir)
    		if err := viper.ReadInConfig(); err != nil {
    			log.Printf("can't read config: %v, will use default values", err)
    		}
    	} else {
    		log.Printf("requesting config at "+etcdURL, "/"+os.Getenv("ENV_NAME")+"/"+os.Getenv("CI_PROJECT_NAME")+".json")
    		viper.AddRemoteProvider("etcd", etcdURL, "/"+os.Getenv("ENV_NAME")+"/"+os.Getenv("CI_PROJECT_NAME")+".json")
    		viper.SetConfigType("json")
    
    		if err := viper.ReadRemoteConfig(); err != nil {
    			log.Printf("can't read config: %v, will use default values", err)
    		}
    
    Olgun Cengiz's avatar
    Olgun Cengiz committed
    	// Read Config File
    	if configFile != "" {
    		configName := strings.Split(filepath.Base(configFile), ".")[0]
    		configDir := filepath.Dir(configFile)
    		viper.SetConfigName(configName)
    		viper.AddConfigPath(configDir)
    		if err := viper.ReadInConfig(); err != nil {
    			errors.LogFormat(err, "can't read config, will use default values")
    		}
    	} else {
    		log.Printf("requesting config at "+etcdURL, "/"+os.Getenv("ENV_NAME")+"/"+os.Getenv("CI_PROJECT_NAME")+".json")
    		viper.AddRemoteProvider("etcd", etcdURL, "/"+os.Getenv("ENV_NAME")+"/"+os.Getenv("CI_PROJECT_NAME")+".json")
    		viper.SetConfigType("json")
    
    Olgun Cengiz's avatar
    Olgun Cengiz committed
    		if err := viper.ReadRemoteConfig(); err != nil {
    			errors.LogFormat(err, "can't read config, will use default values")
    		}
    
    Olgun Cengiz's avatar
    Olgun Cengiz committed
    	err := viper.Unmarshal(&Config)
    
    Olgun Cengiz's avatar
    Olgun Cengiz committed
    		log.Printf("unable to decode into config struct, %v", err)
    
    Olgun Cengiz's avatar
    Olgun Cengiz committed
    }
    
    Olgun Cengiz's avatar
    Olgun Cengiz committed
    // CalculateConfigValues calculates config values using provided configuraion
    
    Olgun Cengiz's avatar
    Olgun Cengiz committed
    func calculateConfigValues() {
    
    Olgun Cengiz's avatar
    Olgun Cengiz committed
    	SystemAuth.Uuid = Config.SystemAuthentication.UUID
    	SystemAuth.Session = Config.SystemAuthentication.Session
    
    Olgun Cengiz's avatar
    Olgun Cengiz committed
    	Config.Certification.CertificatePEM = getCertificatePEM()
    	Config.Certification.PrivateKeyPEM = getPrivateKeyPEM()
    	Config.Certification.CaCertificatePEM = getCaCertificatePEM()
    	Config.Certification.VereignCertificatePEM = getVereignCertificatePEM()
    	Config.Certification.EncryptionCertificatePEM = getEncryptionCertificatePEM()
    	Config.Certification.EncryptionPrivateKeyPEM = getEncryptionPrivateKeyPEM()
    
    Olgun Cengiz's avatar
    Olgun Cengiz committed
    	var err error
    	Config.Certification.EncryptionCertificate, Config.Certification.EncryptionPrivateKey, err = clientutils.LoadCertAndKey(Config.Certification.EncryptionCertificatePEM, Config.Certification.EncryptionPrivateKeyPEM)
    	if err != nil {
    		log.Printf("Load Err: %v", err)
    	}
    }
    
    Olgun Cengiz's avatar
    Olgun Cengiz committed
    func getCertificatePEM() []byte {
    	pem, err := ioutil.ReadFile(Config.Certification.Path + "/" + Config.Certification.CertificateFile)
    	if err != nil {
    		errors.Log(err)
    		return []byte("")
    	}
    	return pem
    }
    
    Olgun Cengiz's avatar
    Olgun Cengiz committed
    func getCaCertificatePEM() []byte {
    	pem, err := ioutil.ReadFile(Config.Certification.Path + "/" + Config.Certification.CaCertificateFile)
    	if err != nil {
    		errors.Log(err)
    		return []byte("")
    	}
    	return pem
    
    Olgun Cengiz's avatar
    Olgun Cengiz committed
    func getPrivateKeyPEM() []byte {
    	pem, err := ioutil.ReadFile(Config.Certification.Path + "/" + Config.Certification.PrivateKeyFile)
    	if err != nil {
    		errors.Log(err)
    		return []byte("")
    	}
    	return pem
    
    Olgun Cengiz's avatar
    Olgun Cengiz committed
    func getVereignCertificatePEM() []byte {
    	pem, err := ioutil.ReadFile(Config.Certification.Path + "/" + Config.Certification.CaCertificateFile)
    	if err != nil {
    		errors.Log(err)
    		return []byte("")
    	}
    	return pem
    
    Olgun Cengiz's avatar
    Olgun Cengiz committed
    func getEncryptionCertificatePEM() []byte {
    	pem, err := ioutil.ReadFile(Config.Certification.Path + "/" + Config.Certification.EncryptionCertificateFile)
    	if err != nil {
    		errors.Log(err)
    		return []byte("")
    	}
    	return pem
    
    Olgun Cengiz's avatar
    Olgun Cengiz committed
    func getEncryptionPrivateKeyPEM() []byte {
    	pem, err := ioutil.ReadFile(Config.Certification.Path + "/" + Config.Certification.EncryptionPrivateKeyFile)
    	if err != nil {
    		errors.Log(err)
    		return []byte("")
    	}
    	return pem