func()

in internal/loader/configuration_setting_loader.go [369:418]


func (csl *ConfigurationSettingLoader) getFeatureFlagSettings(ctx context.Context) (map[string]interface{}, map[acpv1.Selector][]*azcore.ETag, error) {
	featureFlagFilters := GetFeatureFlagFilters(csl.Spec)
	settingsClient := csl.SettingsClient
	if settingsClient == nil {
		settingsClient = &SelectorSettingsClient{
			selectors: featureFlagFilters,
		}
	}
	settingsResponse, err := csl.ExecuteFailoverPolicy(ctx, settingsClient)
	if err != nil {
		return nil, nil, err
	}

	settingsLength := len(settingsResponse.Settings)
	featureFlagExist := make(map[string]bool, settingsLength)
	deduplicatedFeatureFlags := make([]interface{}, 0)
	clientEndpoint := ""
	if manager, ok := csl.ClientManager.(*ConfigurationClientManager); ok {
		// use primary client endpoint in feature flag reference
		clientEndpoint = manager.StaticClientWrappers[0].Endpoint
	}

	// if settings returned like this: [{"id": "Beta"...}, {"id": "Alpha"...}, {"id": "Beta"...}], we need to deduplicate it to [{"id": "Alpha"...}, {"id": "Beta"...}], the last one wins
	for i := settingsLength - 1; i >= 0; i-- {
		key := *settingsResponse.Settings[i].Key
		if featureFlagExist[key] {
			continue
		}
		featureFlagExist[key] = true
		var out map[string]interface{}
		err := json.Unmarshal([]byte(*settingsResponse.Settings[i].Value), &out)
		if err != nil {
			return nil, nil, fmt.Errorf("failed to unmarshal feature flag settings: %s", err.Error())
		}
		populateTelemetryMetadata(out, settingsResponse.Settings[i], clientEndpoint)
		deduplicatedFeatureFlags = append(deduplicatedFeatureFlags, out)
	}

	// reverse the deduplicateFeatureFlags to keep the order
	for i, j := 0, len(deduplicatedFeatureFlags)-1; i < j; i, j = i+1, j-1 {
		deduplicatedFeatureFlags[i], deduplicatedFeatureFlags[j] = deduplicatedFeatureFlags[j], deduplicatedFeatureFlags[i]
	}

	// featureFlagSection = {"feature_flags": [{...}, {...}]}
	var featureFlagSection = map[string]interface{}{
		FeatureFlagSectionName: deduplicatedFeatureFlags,
	}

	return featureFlagSection, settingsResponse.Etags, nil
}