in azureappconfiguration/azureappconfiguration.go [157:231]
func (azappcfg *AzureAppConfiguration) loadKeyValues(ctx context.Context, settingsClient settingsClient) error {
settingsResponse, err := settingsClient.getSettings(ctx)
if err != nil {
return err
}
kvSettings := make(map[string]any, len(settingsResponse.settings))
keyVaultRefs := make(map[string]string)
for _, setting := range settingsResponse.settings {
if setting.Key == nil {
continue
}
trimmedKey := azappcfg.trimPrefix(*setting.Key)
if len(trimmedKey) == 0 {
log.Printf("Key of the setting '%s' is trimmed to the empty string, just ignore it", *setting.Key)
continue
}
if setting.ContentType == nil || setting.Value == nil {
kvSettings[trimmedKey] = setting.Value
continue
}
switch *setting.ContentType {
case featureFlagContentType:
continue // ignore feature flag while getting key value settings
case secretReferenceContentType:
keyVaultRefs[trimmedKey] = *setting.Value
default:
if isJsonContentType(setting.ContentType) {
var v any
if err := json.Unmarshal([]byte(*setting.Value), &v); err != nil {
log.Printf("Failed to unmarshal JSON value: key=%s, error=%s", *setting.Key, err.Error())
continue
}
kvSettings[trimmedKey] = v
} else {
kvSettings[trimmedKey] = setting.Value
}
}
}
var eg errgroup.Group
resolvedSecrets := sync.Map{}
if len(keyVaultRefs) > 0 {
if azappcfg.resolver.credential == nil && azappcfg.resolver.secretResolver == nil {
return fmt.Errorf("no Key Vault credential or SecretResolver configured")
}
for key, kvRef := range keyVaultRefs {
key, kvRef := key, kvRef
eg.Go(func() error {
resolvedSecret, err := azappcfg.resolver.resolveSecret(ctx, kvRef)
if err != nil {
return fmt.Errorf("fail to resolve the Key Vault reference '%s': %s", key, err.Error())
}
resolvedSecrets.Store(key, resolvedSecret)
return nil
})
}
if err := eg.Wait(); err != nil {
return err
}
}
resolvedSecrets.Range(func(key, value interface{}) bool {
kvSettings[key.(string)] = value.(string)
return true
})
azappcfg.keyValues = kvSettings
return nil
}