in internal/controller/utils.go [31:153]
func verifyObject(spec acpv1.AzureAppConfigurationProviderSpec) error {
var err error
if spec.Endpoint == nil && spec.ConnectionStringReference == nil {
return loader.NewArgumentError("spec", fmt.Errorf("one of endpoint and connectionStringReference field must be set"))
}
if spec.ConnectionStringReference != nil {
if spec.Endpoint != nil {
return loader.NewArgumentError("spec", fmt.Errorf("both endpoint and connectionStringReference field are set"))
}
if spec.Auth != nil {
return loader.NewArgumentError("spec.auth", fmt.Errorf("auth field is not allowed when connectionStringReference field is set"))
}
}
if spec.Target.ConfigMapData != nil {
if spec.Target.ConfigMapData.Type == acpv1.Default {
if spec.Target.ConfigMapData.Key != "" {
return loader.NewArgumentError("spec.target.configMapData.key", fmt.Errorf("key field is not allowed when type is default"))
}
} else {
if spec.Target.ConfigMapData.Key == "" {
return loader.NewArgumentError("spec.target.configMapData.key", fmt.Errorf("key field is required when type is json, yaml or properties"))
}
}
if spec.Target.ConfigMapData.Separator != nil &&
(spec.Target.ConfigMapData.Type == acpv1.Default ||
spec.Target.ConfigMapData.Type == acpv1.Properties) {
return loader.NewArgumentError("spec.target.configMapData.separator", fmt.Errorf("separator field is not allowed when type is %s", spec.Target.ConfigMapData.Type))
}
}
for i := range spec.Configuration.Selectors {
err = verifySelectorObject(spec.Configuration.Selectors[i])
if err != nil {
return loader.NewArgumentError("spec.configuration.selectors", err)
}
}
if spec.FeatureFlag != nil {
if spec.Target.ConfigMapData == nil || spec.Target.ConfigMapData.Type == acpv1.Default || spec.Target.ConfigMapData.Type == acpv1.Properties {
return loader.NewArgumentError("spec.target.configMapData", fmt.Errorf("configMap data type must be json or yaml when FeatureFlag is set"))
}
if len(spec.FeatureFlag.Selectors) == 0 {
return loader.NewArgumentError("spec.featureFlag.selectors", fmt.Errorf("featureFlag.selectors must be specified when FeatureFlag is set"))
}
// Check if feature flag label filters are valid
for i := range spec.FeatureFlag.Selectors {
err = verifySelectorObject(spec.FeatureFlag.Selectors[i])
if err != nil {
return loader.NewArgumentError("spec.featureFlag.selectors", err)
}
}
// Check if feature flag refresh interval is valid
if spec.FeatureFlag.Refresh != nil {
err = verifyRefreshInterval(spec.FeatureFlag.Refresh.Interval, MinimalFeatureFlagRefreshInterval, "featureFlag.refresh.interval")
if err != nil {
return err
}
}
}
if spec.Endpoint != nil {
err = verifyEndpoint(*spec.Endpoint)
if err != nil {
return err
}
}
err = verifyAuthObject(spec.Auth)
if err != nil {
return err
}
if spec.Secret != nil && spec.Secret.Auth != nil {
err = verifyAuthObject(spec.Secret.Auth.AzureAppConfigurationProviderAuth)
if err != nil {
return err
}
for _, v := range spec.Secret.Auth.KeyVaults {
err = verifyEndpoint(v.Uri)
if err != nil {
return err
}
if v.AzureAppConfigurationProviderAuth == nil {
return loader.NewArgumentError("secret.auth.keyVaults", fmt.Errorf("authentication method must be specified for Key Vault '%s'", v.Uri))
}
err = verifyAuthObject(v.AzureAppConfigurationProviderAuth)
if err != nil {
return err
}
}
}
if spec.Configuration.Refresh != nil {
if spec.Configuration.Refresh.Monitoring != nil {
sentinelMap := make(map[acpv1.Sentinel]bool)
for _, sentinel := range spec.Configuration.Refresh.Monitoring.Sentinels {
if _, ok := sentinelMap[sentinel]; ok {
return loader.NewArgumentError("spec.configuration.refresh.monitoring.keyValues", fmt.Errorf("monitoring duplicated key '%s'", sentinel.Key))
}
sentinelMap[sentinel] = true
}
}
if spec.Configuration.Refresh.Interval != "" {
err = verifyRefreshInterval(spec.Configuration.Refresh.Interval, MinimalSentinelBasedRefreshInterval, "configuration.refresh.interval")
if err != nil {
return err
}
}
}
if spec.Secret != nil && spec.Secret.Refresh != nil {
err = verifyRefreshInterval(spec.Secret.Refresh.Interval, MinimalSecretRefreshInterval, "secret.refresh.interval")
if err != nil {
return err
}
}
return nil
}