diff options
author | Patrick Steinhardt <psteinhardt@gitlab.com> | 2022-06-30 12:26:50 +0300 |
---|---|---|
committer | Patrick Steinhardt <psteinhardt@gitlab.com> | 2022-07-06 09:15:22 +0300 |
commit | 139c4ec5ca2f050080577b20e3d14a1b16d97145 (patch) | |
tree | 751f16db844e2a48f1bfd022d7b654557089f38f | |
parent | be54a19d04d6a091b77ddba09267afa9b7a7597b (diff) |
featureflag: Remove now-unused raw feature flagspks-remove-raw-feature-flags
The difference between raw and non-raw feature flags has been really
confusing at times: while a non-raw flag has the format "some_a", a raw
flag has the format "gitaly-feature-some-a". "Raw" in this context thus
refers to the metadata as used in the gRPC context.
To avoid this confusion and make the difference more distinguished and
to improve type safety the preceding commits have replaced all usage of
raw feature flags with actual `FeatureFlag` structures. In case one
needs access to the raw flag one would thus now use `MetadataKey()` to
obtain the raw metadata key.
Hopefully, this should clarify things when we use `FeatureFlags` in all
of our codebase in contrast to using raw ones in some places and non-raw
ones in others.
-rw-r--r-- | internal/metadata/featureflag/context.go | 51 | ||||
-rw-r--r-- | internal/metadata/featureflag/context_test.go | 27 |
2 files changed, 10 insertions, 68 deletions
diff --git a/internal/metadata/featureflag/context.go b/internal/metadata/featureflag/context.go index 25f269d60..950e81c70 100644 --- a/internal/metadata/featureflag/context.go +++ b/internal/metadata/featureflag/context.go @@ -92,57 +92,26 @@ func injectIntoIncomingAndOutgoingContext(ctx context.Context, key string, enabl // by us in case they match the feature flag prefix but don't have a definition. This function also // returns the state of the feature flag *as defined in the context*. This value may be overridden. func FromContext(ctx context.Context) map[FeatureFlag]bool { - rawFlags := RawFromContext(ctx) - - flags := map[FeatureFlag]bool{} - for rawName, value := range rawFlags { - flag, err := FromMetadataKey(rawName) - if err != nil { - continue - } - - flags[flag] = value == "true" - } - - return flags -} - -// Raw contains feature flags and their values in their raw form with header prefix in place -// and values unparsed. -type Raw map[string]string - -// RawFromContext returns a map that contains all feature flags with their values. The feature -// flags are in their raw format with the header prefix in place. If multiple values are set a -// flag, the first occurrence is used. -// -// This is mostly intended for propagating the feature flags by other means than the metadata, -// for example into the hooks through the environment. -func RawFromContext(ctx context.Context) Raw { md, ok := metadata.FromIncomingContext(ctx) if !ok { - return nil + return map[FeatureFlag]bool{} } - featureFlags := map[string]string{} - for key, values := range md { - if !strings.HasPrefix(key, ffPrefix) || len(values) == 0 { + flags := map[FeatureFlag]bool{} + for metadataName, values := range md { + if len(values) == 0 { continue } - featureFlags[key] = values[0] - } - - return featureFlags -} + flag, err := FromMetadataKey(metadataName) + if err != nil { + continue + } -// OutgoingWithRaw returns a new context with raw flags appended into the outgoing -// metadata. -func OutgoingWithRaw(ctx context.Context, flags Raw) context.Context { - for key, value := range flags { - ctx = metadata.AppendToOutgoingContext(ctx, key, value) + flags[flag] = values[0] == "true" } - return ctx + return flags } func rubyHeaderKey(flag string) string { diff --git a/internal/metadata/featureflag/context_test.go b/internal/metadata/featureflag/context_test.go index 0faf564a4..8e4e222da 100644 --- a/internal/metadata/featureflag/context_test.go +++ b/internal/metadata/featureflag/context_test.go @@ -177,30 +177,3 @@ func TestFromContext(t *testing.T) { }, FromContext(ctx)) }) } - -func TestRaw(t *testing.T) { - enabledFlag := FeatureFlag{Name: "enabled-flag"} - disabledFlag := FeatureFlag{Name: "disabled-flag"} - - raw := Raw{ - ffPrefix + enabledFlag.Name: "true", - ffPrefix + disabledFlag.Name: "false", - } - - t.Run("RawFromContext", func(t *testing.T) { - ctx := createContext() - ctx = IncomingCtxWithFeatureFlag(ctx, enabledFlag, true) - ctx = IncomingCtxWithFeatureFlag(ctx, disabledFlag, false) - - require.Equal(t, raw, RawFromContext(ctx)) - }) - - t.Run("OutgoingWithRaw", func(t *testing.T) { - outgoingMD, ok := metadata.FromOutgoingContext(OutgoingWithRaw(createContext(), raw)) - require.True(t, ok) - require.Equal(t, metadata.MD{ - ffPrefix + enabledFlag.Name: {"true"}, - ffPrefix + disabledFlag.Name: {"false"}, - }, outgoingMD) - }) -} |