Repository navigation
Expand file tree
/
Copy pathfeatures.go
More file actions
73 lines (64 loc) · 1.68 KB
/
Copy pathfeatures.go
File metadata and controls
73 lines (64 loc) · 1.68 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
// Package features helps enable or disable features.
package features
import (
"fmt"
"slices"
"strings"
"github.com/stackrox/rox/pkg/logging"
)
// A FeatureFlag is a product behavior that can be enabled or disabled using an
// environment variable.
type FeatureFlag interface {
Name() string
EnvVar() string
Enabled() bool
Default() bool
}
var (
// Flags contains all defined FeatureFlags by name.
Flags = make(map[string]FeatureFlag)
log = logging.LoggerForModule()
)
// registerFeature registers and returns a new feature flag, configured with the
// provided options.
// If no option is provided the feature is disabled by default.
func registerFeature(name, envVar string, options ...option) FeatureFlag {
if !strings.HasPrefix(envVar, "ROX_") {
panic(fmt.Sprintf("invalid env var: %s, must start with ROX_", envVar))
}
f := &feature{
name: name,
envVar: envVar,
}
for _, o := range options {
o(f)
}
Flags[f.envVar] = f
return f
}
func sortEnvVars() []string {
sortedEnvVars := make([]string, 0, len(Flags))
for envVar := range Flags {
sortedEnvVars = append(sortedEnvVars, envVar)
}
slices.Sort(sortedEnvVars)
return sortedEnvVars
}
// LogFeatureFlags logs the global state of all features flags.
func LogFeatureFlags() {
data := []interface{}{}
for _, envVar := range sortEnvVars() {
flag := Flags[envVar]
data = append(data, logging.Any(flag.EnvVar(), flag.Enabled()))
}
if len(data) > 0 {
log.Infow("Feature flags", data...)
}
}
func GetFeatureFlagsAsGenericMap() map[string]interface{} {
featureFlagVals := make(map[string]interface{})
for _, feature := range Flags {
featureFlagVals[feature.EnvVar()] = feature.Enabled()
}
return featureFlagVals
}