Skip to content

Commit 7ad5d27

Browse files
authored
[Feature] Add Feature dependency (#1357)
1 parent 544833f commit 7ad5d27

File tree

5 files changed

+71
-12
lines changed

5 files changed

+71
-12
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
## [master](https://github.com/arangodb/kube-arangodb/tree/master) (N/A)
44
- (Feature) Backup lifetime - remove Backup once its lifetime has been reached
5+
- (Feature) Add Feature dependency
56

67
## [1.2.31](https://github.com/arangodb/kube-arangodb/tree/1.2.31) (2023-07-14)
78
- (Improvement) Block traffic on the services if there is more than 1 active leader in ActiveFailover mode

cmd/cmd.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -304,9 +304,12 @@ func executeMain(cmd *cobra.Command, args []string) {
304304

305305
podNameParts := strings.Split(name, "-")
306306
operatorID := podNameParts[len(podNameParts)-1]
307-
logging.Global().RegisterWrappers(func(in *zerolog.Event) *zerolog.Event {
308-
return in.Str("operator-id", operatorID)
309-
})
307+
308+
if operatorID != "" {
309+
logging.Global().RegisterWrappers(func(in *zerolog.Event) *zerolog.Event {
310+
return in.Str("operator-id", operatorID)
311+
})
312+
}
310313

311314
logger.Info("nice to meet you")
312315

pkg/deployment/features/features.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
package features
2222

2323
import (
24+
"sort"
25+
2426
"github.com/arangodb/go-driver"
2527

2628
api "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1"
@@ -32,11 +34,30 @@ const (
3234
Disabled = "false"
3335
)
3436

37+
type Features []Feature
38+
39+
func (f Features) Get(name string) (Feature, bool) {
40+
for _, feature := range features {
41+
if feature.Name() == name {
42+
return feature, true
43+
}
44+
}
45+
46+
return nil, false
47+
}
48+
49+
func (f Features) Sort() {
50+
sort.Slice(f, func(i, j int) bool {
51+
return f[i].Name() < f[j].Name()
52+
})
53+
}
54+
3555
var _ Feature = &feature{}
3656

3757
type Feature interface {
3858
Name() string
3959
Description() string
60+
Dependencies() []Feature
4061
Version() driver.Version
4162
EnterpriseRequired() bool
4263
OperatorEnterpriseRequired() bool
@@ -56,6 +77,19 @@ type feature struct {
5677
deprecated string
5778
constValue *bool
5879
hidden bool
80+
dependencies []Feature
81+
}
82+
83+
func (f feature) Dependencies() []Feature {
84+
if len(f.dependencies) == 0 {
85+
return nil
86+
}
87+
88+
q := make([]Feature, len(f.dependencies))
89+
90+
copy(q, f.dependencies)
91+
92+
return q
5993
}
6094

6195
func (f feature) ImageSupported(i *api.ImageInfo) bool {
@@ -82,6 +116,12 @@ func (f feature) Enabled() bool {
82116
}
83117
}
84118

119+
for _, dep := range f.dependencies {
120+
if !dep.Enabled() {
121+
return false
122+
}
123+
}
124+
85125
if f.constValue != nil {
86126
return *f.constValue
87127
}

pkg/deployment/features/graceful.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ var optionalGracefulShutdown = &feature{
4141
enterpriseRequired: false,
4242
enabledByDefault: false,
4343
hidden: true,
44+
45+
dependencies: []Feature{gracefulShutdown},
4446
}
4547

4648
func GracefulShutdown() Feature {

pkg/deployment/features/local.go

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ package features
2323
import (
2424
"fmt"
2525
"os"
26+
"strings"
2627
"sync"
2728

2829
"github.com/spf13/cobra"
@@ -34,23 +35,21 @@ import (
3435

3536
const prefixArg = "deployment.feature"
3637

37-
var features = map[string]Feature{}
38+
var features Features
3839
var featuresLock sync.Mutex
3940
var enableAll = false
4041

4142
func registerFeature(f Feature) {
4243
featuresLock.Lock()
4344
defer featuresLock.Unlock()
4445

45-
if f == nil {
46-
panic("Feature cannot be nil")
47-
}
48-
49-
if _, ok := features[f.Name()]; ok {
46+
if _, ok := features.Get(f.Name()); ok {
5047
panic("Feature already registered")
5148
}
5249

53-
features[f.Name()] = f
50+
features = append(features, f)
51+
52+
features.Sort()
5453
}
5554

5655
var internalCMD = &cobra.Command{
@@ -67,8 +66,8 @@ func Iterate(iterator Iterator) {
6766
featuresLock.Lock()
6867
defer featuresLock.Unlock()
6968

70-
for name, feature := range features {
71-
iterator(name, feature)
69+
for _, feature := range features {
70+
iterator(feature.Name(), feature)
7271
}
7372
}
7473

@@ -130,6 +129,13 @@ func cmdRun(_ *cobra.Command, _ []string) {
130129
for _, feature := range features {
131130
println(fmt.Sprintf("Feature: %s", feature.Name()))
132131
println(fmt.Sprintf("Description: %s", feature.Description()))
132+
if deps := feature.Dependencies(); len(deps) > 0 {
133+
names := make([]string, len(deps))
134+
for id := range names {
135+
names[id] = deps[id].Name()
136+
}
137+
println(fmt.Sprintf("Dependencies: %s", strings.Join(names, ", ")))
138+
}
133139
if feature.EnabledByDefault() {
134140
println("Enabled: true")
135141
} else {
@@ -155,6 +161,7 @@ func cmdRun(_ *cobra.Command, _ []string) {
155161

156162
// Supported returns false when:
157163
// - feature is disabled.
164+
// - any feature dependency is disabled.
158165
// - a given version is lower than minimum feature version.
159166
// - feature expects enterprise but a given enterprise arg is not true.
160167
func Supported(f Feature, v driver.Version, enterprise bool) bool {
@@ -167,6 +174,12 @@ func Supported(f Feature, v driver.Version, enterprise bool) bool {
167174
return false
168175
}
169176

177+
for _, dependency := range f.Dependencies() {
178+
if !Supported(dependency, v, enterprise) {
179+
return false
180+
}
181+
}
182+
170183
return v.CompareTo(f.Version()) >= 0
171184
}
172185

0 commit comments

Comments
 (0)