package config import ( "fmt" "kube-forge/internal/files" "kube-forge/internal/logging" "path/filepath" "github.com/ilyakaznacheev/cleanenv" ) var ( ConfigFile string Output string Password string Verbose bool ) type Host struct { Hostname string `yaml:"hostname"` Ip string `yaml:"ip"` Roles []string `yaml:"roles"` User string `yaml:"user"` Password string `yaml:"password"` } type Config struct { BaseDir string InventoryDir string Verbose bool KubeconfigFile string Forks string `yaml:"forks" env-default:"10"` InstallationName string `yaml:"installation_name" env-default:"cluster.local"` Credentials struct { User string `yaml:"user"` Password string `yaml:"password"` AskSudoPassword bool `yaml:"ask_sudo_password"` PrivateKeyFile string `yaml:"private_key_file"` } `yaml:"credentials"` Hosts struct { Masters []Host `yaml:"master"` Workers []Host `yaml:"worker"` } `yaml:"hosts"` Orchestrator Orchestrator `yaml:"orchestrator"` Modules struct { Additional Additional `yaml:"additional"` } `yaml:"modules"` } var instance *Config func createConfig(configFile string, out string, password string, verbose bool) *Config { instance = &Config{} if err := cleanenv.ReadConfig(configFile, instance); err != nil { helper, _ := cleanenv.GetDescription(instance, nil) panic(fmt.Sprintf("%s\n%s", helper, err)) } instance.BaseDir = files.CreateTempDir() instance.InventoryDir = filepath.Join(instance.BaseDir, "inventory") files.CreateDirWithAllParents(instance.InventoryDir) if out != "" { files.CreateDirWithAllParents(out) instance.KubeconfigFile = filepath.Join(out, "k8s-admin.conf") } else { instance.KubeconfigFile = filepath.Join(files.GetWorkingDir(), "k8s-admin.conf") } if password != "" { instance.Credentials.Password = password } instance.Verbose = verbose err := validateConfig(*instance) if err != nil { logging.Log.Fatal(err.Error()) } return instance } func GetConfig() *Config { if instance == nil { createConfig(ConfigFile, Output, Password, Verbose) } return instance }