Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitaly.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Steinhardt <psteinhardt@gitlab.com>2021-09-14 12:48:59 +0300
committerPatrick Steinhardt <psteinhardt@gitlab.com>2021-09-20 15:16:41 +0300
commit0a9d2c1a1ecf072942d2ef1c22c9ee74aaa0df5f (patch)
tree53ea028f3b01b87501a6a85f24da69ec81d6fafd
parent00cc183dad6e18d7aab4db7172b46095a1799e90 (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.go15
-rw-r--r--internal/metadata/featureflag/featureflag.go14
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
}