Skip to content
Snippets Groups Projects
config.go 2.93 KiB
Newer Older
  • Learn to ignore specific revisions
  • package config
    
    import (
    	"os"
    	"time"
    
    	"github.com/google/uuid"
    	"github.com/sirupsen/logrus"
    	log "github.com/sirupsen/logrus"
    	"github.com/spf13/viper"
    )
    
    const (
    	defaultTimeOutDuration10minutes = time.Minute * 10
    	basePNDUUIDKey                  = "basePNDUUID"
    	baseSouthBoundTypeKey           = "baseSouthBoundType"
    	baseSouthBoundUUIDKey           = "baseSouthBoundUUID"
    	changeTimeoutKey                = "GOSDN_CHANGE_TIMEOUT"
    
    	databaseConnectionKey           = "databaseConnection"
    
    )
    
    // BasePndUUID is an uuid for the base PND
    var BasePndUUID uuid.UUID
    
    // BaseSouthBoundType is the type of the base SBI
    var BaseSouthBoundType int32
    
    // BaseSouthBoundUUID is an uuid for the base SBI
    var BaseSouthBoundUUID uuid.UUID
    
    // ChangeTimeout is the default timeout for a change
    var ChangeTimeout time.Duration
    
    // LogLevel ist the default log level
    var LogLevel logrus.Level
    
    
    // DatabaseConnection holds the credentials and address of the used database
    var DatabaseConnection string
    
    
    // Init gets called on module import
    func Init() {
    
    	err := InitializeConfig()
    	if err != nil {
    		log.Error("failed initialization of module import", err)
    	}
    
    }
    
    // InitializeConfig loads the configuration
    func InitializeConfig() error {
    	var err error
    
    	basePNDUUIDFromViper, err := getUUIDFromViper(basePNDUUIDKey)
    	if err != nil {
    		return err
    	}
    
    	BasePndUUID = basePNDUUIDFromViper
    
    	baseSouthBoundUUIDFromViper, err := getUUIDFromViper(baseSouthBoundUUIDKey)
    	if err != nil {
    		return err
    	}
    
    	BaseSouthBoundUUID = baseSouthBoundUUIDFromViper
    
    	BaseSouthBoundType = viper.GetInt32(baseSouthBoundTypeKey)
    
    Fabian Seidl's avatar
    Fabian Seidl committed
    	if BaseSouthBoundType != 1 {
    		BaseSouthBoundType = 1
    		viper.Set(baseSouthBoundTypeKey, 1)
    
    		if err := viper.WriteConfig(); err != nil {
    			return err
    		}
    
    	}
    
    	err = setChangeTimeout()
    	if err != nil {
    		return err
    	}
    
    	setLogLevel()
    
    
    	DatabaseConnection = getStringFromViper(databaseConnectionKey)
    
    
    // UseDatabase enables other modules to decide if they should use
    // a database as backend.
    func UseDatabase() bool {
    	return len(DatabaseConnection) != 0
    }
    
    
    func getUUIDFromViper(viperKey string) (uuid.UUID, error) {
    	UUIDAsString := viper.GetString(viperKey)
    	if UUIDAsString == "" {
    		newUUID := uuid.New()
    		viper.Set(viperKey, newUUID.String())
    
    		if err := viper.WriteConfig(); err != nil {
    			return uuid.Nil, err
    		}
    
    
    		return newUUID, nil
    	}
    
    	parsedUUID, err := uuid.Parse(UUIDAsString)
    	if err != nil {
    		return uuid.Nil, err
    	}
    
    	return parsedUUID, nil
    }
    
    
    func getStringFromViper(viperKey string) string {
    	stringFromViper := viper.GetString(viperKey)
    
    	return stringFromViper
    }
    
    
    func setChangeTimeout() error {
    	e := os.Getenv(changeTimeoutKey)
    	if e != "" {
    		changeTimeout, err := time.ParseDuration(e)
    		if err != nil {
    			log.Fatal(err)
    		}
    		ChangeTimeout = changeTimeout
    	} else {
    		ChangeTimeout = time.Minute * 10
    	}
    
    	return nil
    }
    
    func setLogLevel() {
    	if os.Getenv("GOSDN_LOG") == "nolog" {
    		LogLevel = logrus.PanicLevel
    	} else {
    		LogLevel = logrus.InfoLevel
    	}
    }