diff options
author | Patrick Steinhardt <psteinhardt@gitlab.com> | 2021-09-14 12:48:59 +0300 |
---|---|---|
committer | Patrick Steinhardt <psteinhardt@gitlab.com> | 2021-09-20 15:16:41 +0300 |
commit | 0a9d2c1a1ecf072942d2ef1c22c9ee74aaa0df5f (patch) | |
tree | 53ea028f3b01b87501a6a85f24da69ec81d6fafd | |
parent | 00cc183dad6e18d7aab4db7172b46095a1799e90 (diff) |
featureflag: Expose generation of raw metadata keys
When putting feature flags into the context metadata or extracting them
from it, we need to compute their key based on their name by doing some
smallish transformations. The logic is currently private to the package
though and thus it cannot be reused by other packages.
Implement the `headerKey()` function as receiver of the `FeatureFlag`
struct and expose it such that it's generally available.
-rw-r--r-- | internal/metadata/featureflag/context.go | 15 | ||||
-rw-r--r-- | internal/metadata/featureflag/featureflag.go | 14 |
2 files changed, 13 insertions, 16 deletions
diff --git a/internal/metadata/featureflag/context.go b/internal/metadata/featureflag/context.go index 9ddde3faa..8e8676faa 100644 --- a/internal/metadata/featureflag/context.go +++ b/internal/metadata/featureflag/context.go @@ -26,7 +26,7 @@ func OutgoingCtxWithFeatureFlags(ctx context.Context, flags ...FeatureFlag) cont } for _, flag := range flags { - md.Set(headerKey(flag.Name), "true") + md.Set(flag.MetadataKey(), "true") } return metadata.NewOutgoingContext(ctx, md) @@ -43,7 +43,7 @@ func OutgoingCtxWithDisabledFeatureFlags(ctx context.Context, flags ...FeatureFl } for _, flag := range flags { - md.Set(headerKey(flag.Name), "false") + md.Set(flag.MetadataKey(), "false") } return metadata.NewOutgoingContext(ctx, md) @@ -61,7 +61,7 @@ func OutgoingCtxWithFeatureFlagValue(ctx context.Context, flag FeatureFlag, val md = metadata.New(map[string]string{}) } - md.Set(headerKey(flag.Name), val) + md.Set(flag.MetadataKey(), val) return metadata.NewOutgoingContext(ctx, md) } @@ -70,12 +70,12 @@ func OutgoingCtxWithFeatureFlagValue(ctx context.Context, flag FeatureFlag, val // context. This is NOT meant for use in clients that transfer the context // across process boundaries. func IncomingCtxWithFeatureFlag(ctx context.Context, flag FeatureFlag) context.Context { - return incomingCtxWithFeatureFlagValue(ctx, headerKey(flag.Name), true) + return incomingCtxWithFeatureFlagValue(ctx, flag.MetadataKey(), true) } // IncomingCtxWithDisabledFeatureFlag marks feature flag as disabled in the incoming context. func IncomingCtxWithDisabledFeatureFlag(ctx context.Context, flag FeatureFlag) context.Context { - return incomingCtxWithFeatureFlagValue(ctx, headerKey(flag.Name), false) + return incomingCtxWithFeatureFlagValue(ctx, flag.MetadataKey(), false) } // IncomingCtxWithRubyFeatureFlagValue sets the feature flags status in the context. @@ -167,11 +167,6 @@ func OutgoingWithRaw(ctx context.Context, flags Raw) context.Context { return ctx } -// headerKey returns the feature flag key to be used in the metadata map -func headerKey(flag string) string { - return ffPrefix + strings.ReplaceAll(flag, "_", "-") -} - func rubyHeaderKey(flag string) string { return fmt.Sprintf("gitaly-feature-ruby-%s", strings.ReplaceAll(flag, "_", "-")) } diff --git a/internal/metadata/featureflag/featureflag.go b/internal/metadata/featureflag/featureflag.go index 0d6f0c427..ee54ca734 100644 --- a/internal/metadata/featureflag/featureflag.go +++ b/internal/metadata/featureflag/featureflag.go @@ -3,6 +3,7 @@ package featureflag import ( "context" "strconv" + "strings" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" @@ -56,7 +57,7 @@ func (ff FeatureFlag) IsEnabled(ctx context.Context) bool { return true } - val, ok := getFlagVal(ctx, ff.Name) + val, ok := ff.valueFromContext(ctx) if !ok { return ff.OnByDefault } @@ -73,17 +74,18 @@ func (ff FeatureFlag) IsDisabled(ctx context.Context) bool { return !ff.IsEnabled(ctx) } -func getFlagVal(ctx context.Context, flag string) (string, bool) { - if flag == "" { - return "", false - } +// MetadataKey returns the key of the feature flag as it is present in the metadata map. +func (ff FeatureFlag) MetadataKey() string { + return ffPrefix + strings.ReplaceAll(ff.Name, "_", "-") +} +func (ff FeatureFlag) valueFromContext(ctx context.Context) (string, bool) { md, ok := metadata.FromIncomingContext(ctx) if !ok { return "", false } - val, ok := md[headerKey(flag)] + val, ok := md[ff.MetadataKey()] if !ok { return "", false } |