pkg/config/types.go (116 lines of code) (raw):

package config import ( "fmt" "strings" ) type configProviderImpl struct { config string schema string } // Configuration is the top-level container for all values for all services. See an example at: https://github.com/Azure/ARO-HCP/blob/main/config/config.yaml type Configuration map[string]any func (v Configuration) GetByPath(path string) (any, bool) { keys := strings.Split(path, ".") var current any = v for _, key := range keys { if m, ok := current.(Configuration); ok { current, ok = m[key] if !ok { return nil, false } } else { return nil, false } } return current, true } func NewConfigurationOverrides() ConfigurationOverrides { return &configurationOverrides{} } type ConfigurationOverrides interface { GetDefaults() Configuration GetCloudOverrides(cloud string) Configuration GetDeployEnvOverrides(cloud, deployEnv string) Configuration GetRegionOverrides(cloud, deployEnv, region string) Configuration GetRegions(cloud, deployEnv string) []string GetSchema() string HasSchema() bool HasCloud(cloud string) bool HasDeployEnv(cloud, deployEnv string) bool } type configurationOverrides struct { Schema string `yaml:"$schema"` Defaults Configuration `yaml:"defaults"` // key is the cloud alias Overrides map[string]*struct { Defaults Configuration `yaml:"defaults"` // key is the deploy env Overrides map[string]*struct { Defaults Configuration `yaml:"defaults"` // key is the region name Overrides map[string]Configuration `yaml:"regions"` } `yaml:"environments"` } `yaml:"clouds"` } func (vo *configurationOverrides) GetSchema() string { return vo.Schema } func (vo *configurationOverrides) HasSchema() bool { return vo.Schema != "" } func (vo *configurationOverrides) GetDefaults() Configuration { return vo.Defaults } func (vo *configurationOverrides) HasCloud(cloud string) bool { _, ok := vo.Overrides[cloud] return ok } func (vo *configurationOverrides) GetCloudOverrides(cloud string) Configuration { if cloudOverride, ok := vo.Overrides[cloud]; ok { return cloudOverride.Defaults } return Configuration{} } func (vo *configurationOverrides) HasDeployEnv(cloud, deployEnv string) bool { if cloudOverride, ok := vo.Overrides[cloud]; ok { _, ok := cloudOverride.Overrides[deployEnv] return ok } return false } func (vo *configurationOverrides) GetDeployEnvOverrides(cloud, deployEnv string) Configuration { if cloudOverride, ok := vo.Overrides[cloud]; ok { if deployEnvOverride, ok := cloudOverride.Overrides[deployEnv]; ok { return deployEnvOverride.Defaults } } return Configuration{} } func (vo *configurationOverrides) GetRegions(cloud, deployEnv string) []string { deployEnvOverrides, err := vo.getAllDeployEnvRegionOverrides(cloud, deployEnv) if err != nil { return []string{} } regions := make([]string, 0, len(deployEnvOverrides)) for region := range deployEnvOverrides { regions = append(regions, region) } return regions } func (vo *configurationOverrides) getAllDeployEnvRegionOverrides(cloud, deployEnv string) (map[string]Configuration, error) { if cloudOverride, ok := vo.Overrides[cloud]; ok { if deployEnvOverride, ok := cloudOverride.Overrides[deployEnv]; ok { return deployEnvOverride.Overrides, nil } else { return nil, fmt.Errorf("deploy env %s not found under cloud %s in config", deployEnv, cloud) } } return nil, fmt.Errorf("cloud %s not found in config", cloud) } func (vo *configurationOverrides) GetRegionOverrides(cloud, deployEnv, region string) Configuration { regionOverrides, err := vo.getAllDeployEnvRegionOverrides(cloud, deployEnv) if err != nil { return Configuration{} } if regionOverrides, ok := regionOverrides[region]; ok { return regionOverrides } else { return Configuration{} } }