Skip to content

Commit dd04cd5

Browse files
committed
add kube_config extender and scheduler
Signed-off-by: Mikhail Scherba <[email protected]>
1 parent 1c6c4e3 commit dd04cd5

File tree

8 files changed

+144
-20
lines changed

8 files changed

+144
-20
lines changed

pkg/kube_config_manager/kube_config_manager.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -72,13 +72,13 @@ func NewKubeConfigManager(ctx context.Context, bk backend.ConfigHandler, runtime
7272
}
7373
}
7474

75-
func (kcm *KubeConfigManager) IsModuleEnabled(moduleName string) bool {
75+
func (kcm *KubeConfigManager) IsModuleEnabled(moduleName string) *bool {
7676
moduleConfig, found := kcm.currentConfig.Modules[moduleName]
7777
if !found {
78-
return false
78+
return nil
7979
}
8080

81-
return moduleConfig.IsEnabled != nil && *moduleConfig.IsEnabled
81+
return moduleConfig.IsEnabled
8282
}
8383

8484
func (kcm *KubeConfigManager) Init() error {

pkg/module_manager/module_manager.go

+13-5
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import (
2929
"github.com/flant/addon-operator/pkg/module_manager/models/moduleset"
3030
"github.com/flant/addon-operator/pkg/module_manager/scheduler"
3131
"github.com/flant/addon-operator/pkg/module_manager/scheduler/extenders/dynamically_enabled"
32+
"github.com/flant/addon-operator/pkg/module_manager/scheduler/extenders/kube_config"
3233
"github.com/flant/addon-operator/pkg/module_manager/scheduler/extenders/static"
3334
"github.com/flant/addon-operator/pkg/task"
3435
"github.com/flant/addon-operator/pkg/utils"
@@ -69,7 +70,7 @@ type DirectoryConfig struct {
6970

7071
type KubeConfigManager interface {
7172
SaveConfigValues(key string, values utils.Values) error
72-
IsModuleEnabled(moduleName string) bool
73+
IsModuleEnabled(moduleName string) *bool
7374
UpdateModuleConfig(moduleName string) error
7475
SafeReadConfig(handler func(config *config.KubeConfig))
7576
}
@@ -503,6 +504,9 @@ func (mm *ModuleManager) Init() error {
503504
mm.moduleScheduler.AddExtender(dynamicExtender)
504505
}
505506

507+
kubeConfigExtender := kube_config.NewExtender(mm.dependencies.KubeConfigManager)
508+
mm.moduleScheduler.AddExtender(kubeConfigExtender)
509+
506510
return mm.registerModules()
507511
}
508512

@@ -1291,8 +1295,10 @@ func (mm *ModuleManager) RegisterModule(moduleSource, modulePath string) error {
12911295
if !mm.IsModuleEnabled(moduleName) {
12921296
// update(upsert) module config in moduleset
12931297
mm.modules.Add(basicModule)
1294-
// if module is disabled in the module kube config - exit
1295-
if !mm.dependencies.KubeConfigManager.IsModuleEnabled(moduleName) {
1298+
// get kube config for the module to check if it has enabled: true
1299+
moduleKubeConfigEnabled := mm.dependencies.KubeConfigManager.IsModuleEnabled(moduleName)
1300+
// if module isn't explicitly enabled in the module kube config - exit
1301+
if moduleKubeConfigEnabled == nil || (moduleKubeConfigEnabled != nil && !*moduleKubeConfigEnabled) {
12961302
return nil
12971303
}
12981304
mm.AddEnabledModuleByConfigName(moduleName)
@@ -1365,8 +1371,10 @@ func (mm *ModuleManager) RegisterModule(moduleSource, modulePath string) error {
13651371
EventType: events.ModuleRegistered,
13661372
})
13671373

1368-
// if module is disabled in the module kube config - exit
1369-
if !mm.dependencies.KubeConfigManager.IsModuleEnabled(moduleName) {
1374+
// get kube config for the module to check if it has enabled: true
1375+
moduleKubeConfigEnabled := mm.dependencies.KubeConfigManager.IsModuleEnabled(moduleName)
1376+
// if module isn't explicitly enabled in the module kube config - exit
1377+
if moduleKubeConfigEnabled == nil || (moduleKubeConfigEnabled != nil && !*moduleKubeConfigEnabled) {
13701378
return nil
13711379
}
13721380
mm.AddEnabledModuleByConfigName(moduleName)

pkg/module_manager/module_manager_hooks.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,9 @@ func (mm *ModuleManager) registerGlobalModule(globalValues utils.Values) (*dynam
8484
gm := modules.NewGlobalModule(mm.GlobalHooksDir, globalValues, mm.ValuesValidator, &dep)
8585
mm.global = gm
8686

87-
// catch dynamin Enabled patches from global hooks
87+
// applies a scheduler extender to follow which modules get enabled/disabled by dynamic patches
8888
dynamicExtender := dynamically_enabled.NewExtender()
89+
// catch dynamin Enabled patches from global hooks
8990
go mm.runDynamicEnabledLoop(dynamicExtender)
9091

9192
return dynamicExtender, mm.registerGlobalHooks(gm)

pkg/module_manager/scheduler/extenders/dynamically_enabled/dynamic.go

+9-1
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package dynamically_enabled
22

33
import (
4+
"sync"
5+
46
log "github.com/sirupsen/logrus"
57
)
68

79
type Extender struct {
10+
l sync.RWMutex
811
modulesStatus map[string]bool
912
}
1013

@@ -17,21 +20,26 @@ func NewExtender() *Extender {
1720
}
1821

1922
func (e *Extender) UpdateStatus(moduleName, operation string) {
23+
e.l.Lock()
2024
switch operation {
2125
case "add":
2226
e.modulesStatus[moduleName] = true
2327
case "remove":
2428
delete(e.modulesStatus, moduleName)
2529
default:
26-
log.Warn("Unknown patch operation: %s", operation)
30+
log.Warnf("Unknown patch operation: %s", operation)
2731
}
32+
e.l.Unlock()
2833
}
2934

3035
func (e Extender) Name() string {
3136
return "DynamicallyEnabled"
3237
}
3338

3439
func (e Extender) Filter(moduleName string) *bool {
40+
e.l.RLock()
41+
defer e.l.RUnlock()
42+
3543
if val, found := e.modulesStatus[moduleName]; found {
3644
return &val
3745
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package kube_config
2+
3+
type kubeConfigManager interface {
4+
IsModuleEnabled(moduleName string) *bool
5+
}
6+
7+
type Extender struct {
8+
kubeConfigManager kubeConfigManager
9+
}
10+
11+
func NewExtender(kcm kubeConfigManager) *Extender {
12+
e := &Extender{
13+
kubeConfigManager: kcm,
14+
}
15+
16+
return e
17+
}
18+
19+
func (e Extender) Name() string {
20+
return "KubeConfig"
21+
}
22+
23+
func (e Extender) Filter(moduleName string) *bool {
24+
return e.kubeConfigManager.IsModuleEnabled(moduleName)
25+
}
26+
27+
func (e Extender) Order() error {
28+
return nil
29+
}

pkg/module_manager/scheduler/extenders/static/static_test.go

+9-7
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ fooBarEnabled: false
4040
# FE Bundle "Default"
4141
flantIntegrationEnabled: true
4242
monitoringApplicationsEnabled: true
43+
l2LoadBalancerEnabled: false
4344
`
4445

4546
tmp, err := os.CreateTemp(t.TempDir(), "values-*.yaml")
@@ -52,13 +53,14 @@ monitoringApplicationsEnabled: true
5253
assert.NoError(t, err)
5354

5455
expected := map[string]bool{
55-
"admissionPolicyEngine": true,
56-
"certManager": true,
57-
"chrony": true,
58-
"nodeLocalDns": true,
59-
"fooBar": false,
60-
"flantIntegration": true,
61-
"monitoringApplications": true,
56+
"admission-policy-engine": true,
57+
"cert-manager": true,
58+
"chrony": true,
59+
"node-local-dns": true,
60+
"foo-bar": false,
61+
"flant-integration": true,
62+
"monitoring-applications": true,
63+
"l2-load-balancer": false,
6264
}
6365

6466
assert.Equal(t, expected, e.modulesStatus)

pkg/module_manager/scheduler/scheduler.go

+15-3
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,42 @@ package scheduler
22

33
import (
44
"sync"
5+
6+
log "github.com/sirupsen/logrus"
57
)
68

79
type Scheduler struct {
810
extenders []Extender
911

10-
l sync.Mutex
12+
l sync.Mutex
13+
moduleStatus map[string]*bool
1114
// result *interface{}
1215
// newResult *interface{}
1316
}
1417

1518
func NewScheduler() *Scheduler {
16-
return &Scheduler{extenders: make([]Extender, 0)}
19+
return &Scheduler{
20+
extenders: make([]Extender, 0),
21+
moduleStatus: make(map[string]*bool),
22+
}
1723
}
1824

1925
func (s *Scheduler) AddExtender(ext Extender) {
2026
s.extenders = append(s.extenders, ext)
2127
}
2228

2329
func (s *Scheduler) Run(moduleNames []string) {
30+
s.l.Lock()
2431
for _, ex := range s.extenders {
32+
log.Infof("Applying %s extender", ex.Name())
2533
for _, moduleName := range moduleNames {
26-
ex.Filter(moduleName)
34+
filterResult := ex.Filter(moduleName)
35+
if _, ok := s.moduleStatus[moduleName]; !ok || filterResult != nil {
36+
s.moduleStatus[moduleName] = filterResult
37+
}
2738
}
2839
}
40+
s.l.Unlock()
2941
}
3042

3143
type Extender interface {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package scheduler
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"testing"
7+
8+
"github.com/flant/addon-operator/pkg/module_manager/scheduler/extenders/static"
9+
"github.com/stretchr/testify/assert"
10+
"github.com/stretchr/testify/require"
11+
)
12+
13+
func TestRun(t *testing.T) {
14+
15+
values := `
16+
# Default global values section
17+
# todo remove duplicate config values they should be in global-hooks/openapi/config-values.yaml only
18+
# now we have strange behaviour in template tests
19+
# probably, test helm render does not get defaults from global-hooks/openapi/config-values.yaml
20+
global:
21+
modules:
22+
ingressClass: nginx
23+
placement: {}
24+
https:
25+
mode: CertManager
26+
certManager:
27+
clusterIssuerName: letsencrypt
28+
resourcesRequests:
29+
everyNode:
30+
cpu: 300m
31+
memory: 512Mi
32+
# CE Bundle "Default"
33+
admissionPolicyEngineEnabled: true
34+
certManagerEnabled: true
35+
chronyEnabled: true
36+
37+
# BE Bundle "Default"
38+
nodeLocalDnsEnabled: true
39+
40+
# EE Bundle "Default"
41+
fooBarEnabled: false
42+
43+
# FE Bundle "Default"
44+
flantIntegrationEnabled: true
45+
monitoringApplicationsEnabled: true
46+
l2LoadBalancerEnabled: false
47+
`
48+
modules := []string{"admission-policy-engine", "cert-manager", "chrony", "node-local-dns", "foo-bar", "flant-integration", "monitoring-applications", "ingress-nginx", "l2-load-balancer"}
49+
50+
tmp, err := os.CreateTemp(t.TempDir(), "values-*.yaml")
51+
require.NoError(t, err)
52+
53+
err = os.WriteFile(tmp.Name(), []byte(values), 0x600)
54+
require.NoError(t, err)
55+
56+
e, err := static.NewExtender(tmp.Name())
57+
assert.NoError(t, err)
58+
59+
s := NewScheduler()
60+
s.AddExtender(e)
61+
s.Run(modules)
62+
63+
fmt.Println(s.moduleStatus)
64+
}

0 commit comments

Comments
 (0)