Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
config.go 3.26 KiB
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"
	filesystemPathToStores          = "filesystemPathToStores"
)

// 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

// FilesystemPathToStores determines in which folder the stores should be saved
var FilesystemPathToStores = "stores_testing"

// 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)
	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)

	FilesystemPathToStores = getStringFromViper(filesystemPathToStores)
	if FilesystemPathToStores == "" {
		FilesystemPathToStores = "stores"
	}

	return nil
}

// 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
	}
}