diff --git a/config/client.go b/config/client.go index 54b2a36529..efeec23cda 100644 --- a/config/client.go +++ b/config/client.go @@ -334,5 +334,9 @@ func GenerateLimitedClientConfig(c *model.Config, telemetryID string, license *m } } + for key, value := range featureFlagsToMap(c.FeatureFlags) { + props["FeatureFlag"+key] = value + } + return props } diff --git a/config/client_test.go b/config/client_test.go index 7c60a21013..31d8d733e8 100644 --- a/config/client_test.go +++ b/config/client_test.go @@ -257,6 +257,19 @@ func TestGetLimitedClientConfig(t *testing.T) { "PasswordRequireSymbol": "false", }, }, + { + "Feature Flags", + &model.Config{ + FeatureFlags: &model.FeatureFlags{ + TestFeature: "myvalue", + }, + }, + "", + nil, + map[string]string{ + "FeatureFlagTestFeature": "myvalue", + }, + }, } for _, testCase := range testCases { diff --git a/config/feature_flags.go b/config/feature_flags.go index 0dc07561a3..bfc93e9893 100644 --- a/config/feature_flags.go +++ b/config/feature_flags.go @@ -88,6 +88,24 @@ func featureFlagsFromMap(featuresMap map[string]string, baseFeatureFlags model.F return baseFeatureFlags } +// featureFlagsToMap returns the feature flags as a map[string]string +// Currently assumes that all feature flags are strings for now. +func featureFlagsToMap(featureFlags *model.FeatureFlags) map[string]string { + refStructVal := reflect.ValueOf(*featureFlags) + refStructType := reflect.TypeOf(*featureFlags) + ret := make(map[string]string) + for i := 0; i < refStructVal.NumField(); i++ { + refFieldVal := refStructVal.Field(i) + refFieldType := refStructType.Field(i) + if !refFieldVal.IsValid() { + continue + } + ret[refFieldType.Name] = refFieldVal.String() + } + + return ret +} + func getStructFields(s interface{}) []string { structType := reflect.TypeOf(s) fieldNames := make([]string, 0, structType.NumField()) diff --git a/config/feature_flags_test.go b/config/feature_flags_test.go index 125a9cc9bb..3acf2372e9 100644 --- a/config/feature_flags_test.go +++ b/config/feature_flags_test.go @@ -73,3 +73,27 @@ func TestFeatureFlagsFromMap(t *testing.T) { }) } } + +func TestFeatureFlagsToMap(t *testing.T) { + for name, tc := range map[string]struct { + Flags model.FeatureFlags + TestFeatureValue string + }{ + "empty": { + TestFeatureValue: "", + Flags: model.FeatureFlags{}, + }, + "simple value": { + TestFeatureValue: "expectedvalue", + Flags: model.FeatureFlags{TestFeature: "expectedvalue"}, + }, + "empty value": { + TestFeatureValue: "", + Flags: model.FeatureFlags{TestFeature: ""}, + }, + } { + t.Run(name, func(t *testing.T) { + require.Equal(t, tc.TestFeatureValue, featureFlagsToMap(&tc.Flags)["TestFeature"]) + }) + } +}