diff --git a/pkg/services/featuremgmt/static_provider_test.go b/pkg/services/featuremgmt/static_provider_test.go index 2ec9e9f6e4a..c3245f7dd97 100644 --- a/pkg/services/featuremgmt/static_provider_test.go +++ b/pkg/services/featuremgmt/static_provider_test.go @@ -230,10 +230,7 @@ func makeFlags(tt struct { } config := map[string]memprovider.InMemoryFlag{ - tt.name: { - Key: tt.name, - Variants: map[string]any{"": tt.configValue}, - }, + tt.name: setting.NewInMemoryFlag(tt.name, tt.configValue), } return config, []FeatureFlag{orig} diff --git a/pkg/setting/setting_feature_toggles.go b/pkg/setting/setting_feature_toggles.go index 6525b6f5856..872159d950f 100644 --- a/pkg/setting/setting_feature_toggles.go +++ b/pkg/setting/setting_feature_toggles.go @@ -13,7 +13,7 @@ import ( ) // DefaultVariantName a placeholder name for config-based Feature Flags -const DefaultVariantName = "" +const DefaultVariantName = "default" // Deprecated: should use `featuremgmt.FeatureToggles` func (cfg *Cfg) readFeatureToggles(iniFile *ini.File) error { @@ -42,7 +42,7 @@ func ReadFeatureTogglesFromInitFile(featureTogglesSection *ini.Section) (map[str // parse the comma separated list in `enable`. featuresTogglesStr := valueAsString(featureTogglesSection, "enable", "") for _, feature := range util.SplitString(featuresTogglesStr) { - featureToggles[feature] = memprovider.InMemoryFlag{Key: feature, Variants: map[string]any{DefaultVariantName: true}} + featureToggles[feature] = memprovider.InMemoryFlag{Key: feature, DefaultVariant: DefaultVariantName, Variants: map[string]any{DefaultVariantName: true}} } // read all other settings under [feature_toggles]. If a toggle is @@ -66,19 +66,23 @@ func ParseFlag(name, value string) (memprovider.InMemoryFlag, error) { var structure map[string]any if integer, err := strconv.Atoi(value); err == nil { - return memprovider.InMemoryFlag{Key: name, Variants: map[string]any{DefaultVariantName: integer}}, nil + return NewInMemoryFlag(name, integer), nil } if float, err := strconv.ParseFloat(value, 64); err == nil { - return memprovider.InMemoryFlag{Key: name, Variants: map[string]any{DefaultVariantName: float}}, nil + return NewInMemoryFlag(name, float), nil } if err := json.Unmarshal([]byte(value), &structure); err == nil { - return memprovider.InMemoryFlag{Key: name, Variants: map[string]any{DefaultVariantName: structure}}, nil + return NewInMemoryFlag(name, structure), nil } if boolean, err := strconv.ParseBool(value); err == nil { - return memprovider.InMemoryFlag{Key: name, Variants: map[string]any{DefaultVariantName: boolean}}, nil + return NewInMemoryFlag(name, boolean), nil } - return memprovider.InMemoryFlag{Key: name, Variants: map[string]any{DefaultVariantName: value}}, nil + return NewInMemoryFlag(name, value), nil +} + +func NewInMemoryFlag(name string, value any) memprovider.InMemoryFlag { + return memprovider.InMemoryFlag{Key: name, DefaultVariant: DefaultVariantName, Variants: map[string]any{DefaultVariantName: value}} } func AsStringMap(m map[string]memprovider.InMemoryFlag) map[string]string { @@ -90,7 +94,7 @@ func AsStringMap(m map[string]memprovider.InMemoryFlag) map[string]string { } func serializeFlagValue(flag memprovider.InMemoryFlag) string { - value, _ := flag.Variants[DefaultVariantName] + value, _ := flag.Variants[flag.DefaultVariant] switch castedValue := value.(type) { case bool: diff --git a/pkg/setting/setting_feature_toggles_test.go b/pkg/setting/setting_feature_toggles_test.go index 6e1cb78aa84..a80b3d41151 100644 --- a/pkg/setting/setting_feature_toggles_test.go +++ b/pkg/setting/setting_feature_toggles_test.go @@ -22,8 +22,8 @@ func TestFeatureToggles(t *testing.T) { "enable": "feature1,feature2", }, expectedToggles: map[string]memprovider.InMemoryFlag{ - "feature1": {Key: "feature1", Variants: map[string]any{"": true}}, - "feature2": {Key: "feature2", Variants: map[string]any{"": true}}, + "feature1": NewInMemoryFlag("feature1", true), + "feature2": NewInMemoryFlag("feature2", true), }, }, { @@ -33,9 +33,9 @@ func TestFeatureToggles(t *testing.T) { "feature3": "true", }, expectedToggles: map[string]memprovider.InMemoryFlag{ - "feature1": {Key: "feature1", Variants: map[string]any{"": true}}, - "feature2": {Key: "feature2", Variants: map[string]any{"": true}}, - "feature3": {Key: "feature3", Variants: map[string]any{"": true}}, + "feature1": NewInMemoryFlag("feature1", true), + "feature2": NewInMemoryFlag("feature2", true), + "feature3": NewInMemoryFlag("feature3", true), }, }, { @@ -45,8 +45,8 @@ func TestFeatureToggles(t *testing.T) { "feature2": "false", }, expectedToggles: map[string]memprovider.InMemoryFlag{ - "feature1": {Key: "feature1", Variants: map[string]any{"": true}}, - "feature2": {Key: "feature2", Variants: map[string]any{"": false}}, + "feature1": NewInMemoryFlag("feature1", true), + "feature2": NewInMemoryFlag("feature2", false), }, }, { @@ -57,12 +57,12 @@ func TestFeatureToggles(t *testing.T) { "feature5": "t", "feature6": "T", }, expectedToggles: map[string]memprovider.InMemoryFlag{ - "feature1": {Key: "feature1", Variants: map[string]any{"": 1}}, - "feature2": {Key: "feature2", Variants: map[string]any{"": 1.0}}, - "feature3": {Key: "feature3", Variants: map[string]any{"": map[string]any{"foo": "bar"}}}, - "feature4": {Key: "feature4", Variants: map[string]any{"": "bar"}}, - "feature5": {Key: "feature5", Variants: map[string]any{"": true}}, - "feature6": {Key: "feature6", Variants: map[string]any{"": true}}, + "feature1": NewInMemoryFlag("feature1", 1), + "feature2": NewInMemoryFlag("feature2", 1.0), + "feature3": NewInMemoryFlag("feature3", map[string]any{"foo": "bar"}), + "feature4": NewInMemoryFlag("feature4", "bar"), + "feature5": NewInMemoryFlag("feature5", true), + "feature6": NewInMemoryFlag("feature6", true), }, }, } @@ -88,14 +88,14 @@ func TestFeatureToggles(t *testing.T) { func TestFlagValueSerialization(t *testing.T) { testCases := []memprovider.InMemoryFlag{ - {Key: "int", Variants: map[string]any{"": 1}}, - {Key: "1.0f", Variants: map[string]any{"": 1.0}}, - {Key: "1.01f", Variants: map[string]any{"": 1.01}}, - {Key: "1.10f", Variants: map[string]any{"": 1.10}}, - {Key: "struct", Variants: map[string]any{"": map[string]any{"foo": "bar"}}}, - {Key: "string", Variants: map[string]any{"": "bar"}}, - {Key: "true", Variants: map[string]any{"": true}}, - {Key: "false", Variants: map[string]any{"": false}}, + NewInMemoryFlag("int", 1), + NewInMemoryFlag("1.0f", 1.0), + NewInMemoryFlag("1.01f", 1.01), + NewInMemoryFlag("1.10f", 1.10), + NewInMemoryFlag("struct", map[string]any{"foo": "bar"}), + NewInMemoryFlag("string", "bar"), + NewInMemoryFlag("true", true), + NewInMemoryFlag("false", false), } for _, tt := range testCases {