@@ -22,13 +22,18 @@ package features
2222
2323import (
2424 "fmt"
25+ "os"
2526 "sync"
2627
2728 "github.com/spf13/cobra"
2829
2930 "github.com/arangodb/go-driver"
31+
32+ "github.com/arangodb/kube-arangodb/pkg/util"
3033)
3134
35+ const prefixArg = "deployment.feature"
36+
3237var features = map [string ]Feature {}
3338var featuresLock sync.Mutex
3439var enableAll = false
@@ -54,6 +59,9 @@ var internalCMD = &cobra.Command{
5459 Run : cmdRun ,
5560}
5661
62+ // Init initializes all registered features.
63+ // If a feature is not provided via process's argument, then it is taken from environment variable
64+ // or from enabled by default setting.
5765func Init (cmd * cobra.Command ) error {
5866 featuresLock .Lock ()
5967 defer featuresLock .Unlock ()
@@ -62,7 +70,8 @@ func Init(cmd *cobra.Command) error {
6270
6371 f := cmd .Flags ()
6472
65- f .BoolVar (& enableAll , "deployment.feature.all" , false , "Enable ALL Features" )
73+ featureArgName := GetFeatureArgName ("all" )
74+ f .BoolVar (& enableAll , featureArgName , isEnabledFeatureFromEnv (featureArgName ), "Enable ALL Features" )
6675
6776 for _ , feature := range features {
6877 z := ""
@@ -79,21 +88,25 @@ func Init(cmd *cobra.Command) error {
7988 }
8089 }
8190
82- featureName := fmt .Sprintf ("deployment.feature.%s" , feature .Name ())
83- f .BoolVar (feature .EnabledPointer (), featureName , feature .EnabledByDefault (), z )
91+ featureArgName = GetFeatureArgName (feature .Name ())
92+ enabled := feature .EnabledByDefault () || isEnabledFeatureFromEnv (featureArgName )
93+ f .BoolVar (feature .EnabledPointer (), featureArgName , enabled , z )
94+
8495 if ok , reason := feature .Deprecated (); ok {
85- if err := f .MarkDeprecated (featureName , reason ); err != nil {
96+ if err := f .MarkDeprecated (featureArgName , reason ); err != nil {
8697 return err
8798 }
8899 }
89100
90101 if feature .Hidden () {
91- if err := f .MarkHidden (featureName ); err != nil {
102+ if err := f .MarkHidden (featureArgName ); err != nil {
92103 return err
93104 }
94105 }
95106 }
96107
108+ f .StringVar (& configMapName , "features-config-map-name" , DefaultFeaturesConfigMap , "Name of the Feature Map ConfigMap" )
109+
97110 return nil
98111}
99112
@@ -127,6 +140,39 @@ func cmdRun(_ *cobra.Command, _ []string) {
127140 }
128141}
129142
143+ // Supported returns false when:
144+ // - feature is disabled.
145+ // - a given version is lower than minimum feature version.
146+ // - feature expects enterprise but a given enterprise arg is not true.
130147func Supported (f Feature , v driver.Version , enterprise bool ) bool {
131- return f .Enabled () && ((f .EnterpriseRequired () && enterprise ) || ! f .EnterpriseRequired ()) && v .CompareTo (f .Version ()) >= 0
148+ if ! f .Enabled () {
149+ return false
150+ }
151+
152+ if f .EnterpriseRequired () && ! enterprise {
153+ // This feature requires enterprise version but current version is not enterprise.
154+ return false
155+ }
156+
157+ return v .CompareTo (f .Version ()) >= 0
158+ }
159+
160+ // GetFeatureMap returns all features' arguments names.
161+ func GetFeatureMap () map [string ]bool {
162+ args := make (map [string ]bool , len (features ))
163+ for _ , f := range features {
164+ args [GetFeatureArgName (f .Name ())] = f .Enabled ()
165+ }
166+
167+ return args
168+ }
169+
170+ // GetFeatureArgName returns feature process argument name.
171+ func GetFeatureArgName (featureName string ) string {
172+ return fmt .Sprintf ("%s.%s" , prefixArg , featureName )
173+ }
174+
175+ // isEnabledFeatureFromEnv returns true if argument is enabled as an environment variable.
176+ func isEnabledFeatureFromEnv (arg string ) bool {
177+ return os .Getenv (util .NormalizeEnv (arg )) == Enabled
132178}
0 commit comments