Skip to content

Commit 90f32db

Browse files
committed
kubelet-config: refactor features to generate map at a higher level
Signed-off-by: Peter Hunt <[email protected]>
1 parent 6815d08 commit 90f32db

5 files changed

+48
-22
lines changed

Diff for: pkg/controller/kubelet-config/kubelet_config_bootstrap.go

+7-1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,12 @@ func RunKubeletBootstrap(templateDir string, kubeletConfigs []*mcfgv1.KubeletCon
2626
if nodeConfig == nil {
2727
nodeConfig = createNewDefaultNodeconfig()
2828
}
29+
30+
featureGates, err := generateFeatureMap(featureGateAccess, openshiftOnlyFeatureGates...)
31+
if err != nil {
32+
return nil, fmt.Errorf("could not generate features map: %w", err)
33+
}
34+
2935
for _, kubeletConfig := range kubeletConfigs {
3036
// use selector since label matching part of a KubeletConfig is not handled during the bootstrap
3137
selector, err := metav1.LabelSelectorAsSelector(kubeletConfig.Spec.MachineConfigPoolSelector)
@@ -41,7 +47,7 @@ func RunKubeletBootstrap(templateDir string, kubeletConfigs []*mcfgv1.KubeletCon
4147
}
4248
role := pool.Name
4349

44-
originalKubeConfig, err := generateOriginalKubeletConfigWithFeatureGates(controllerConfig, templateDir, role, featureGateAccess, apiServer)
50+
originalKubeConfig, err := generateOriginalKubeletConfigWithFeatureGates(controllerConfig, templateDir, role, featureGates, apiServer)
4551
if err != nil {
4652
return nil, err
4753
}

Diff for: pkg/controller/kubelet-config/kubelet_config_controller.go

+7-7
Original file line numberDiff line numberDiff line change
@@ -420,7 +420,7 @@ func (ctrl *Controller) handleFeatureErr(err error, key string) {
420420

421421
// generateOriginalKubeletConfigWithFeatureGates generates a KubeletConfig and ensure the correct feature gates are set
422422
// based on the given FeatureGate.
423-
func generateOriginalKubeletConfigWithFeatureGates(cc *mcfgv1.ControllerConfig, templatesDir, role string, featureGateAccess featuregates.FeatureGateAccess, apiServer *configv1.APIServer) (*kubeletconfigv1beta1.KubeletConfiguration, error) {
423+
func generateOriginalKubeletConfigWithFeatureGates(cc *mcfgv1.ControllerConfig, templatesDir, role string, featureGates map[string]bool, apiServer *configv1.APIServer) (*kubeletconfigv1beta1.KubeletConfiguration, error) {
424424
originalKubeletIgn, err := generateOriginalKubeletConfigIgn(cc, templatesDir, role, apiServer)
425425
if err != nil {
426426
return nil, fmt.Errorf("could not generate the original Kubelet config ignition: %w", err)
@@ -437,11 +437,6 @@ func generateOriginalKubeletConfigWithFeatureGates(cc *mcfgv1.ControllerConfig,
437437
return nil, fmt.Errorf("could not deserialize the Kubelet source: %w", err)
438438
}
439439

440-
featureGates, err := generateFeatureMap(featureGateAccess, openshiftOnlyFeatureGates...)
441-
if err != nil {
442-
return nil, fmt.Errorf("could not generate features map: %w", err)
443-
}
444-
445440
// Merge in Feature Gates.
446441
// If they are the same, this will be a no-op
447442
if err := mergo.Merge(&originalKubeConfig.FeatureGates, featureGates, mergo.WithOverride); err != nil {
@@ -634,7 +629,12 @@ func (ctrl *Controller) syncKubeletConfig(key string) error {
634629
return fmt.Errorf("could not get ControllerConfig %w", err)
635630
}
636631

637-
originalKubeConfig, err := generateOriginalKubeletConfigWithFeatureGates(cc, ctrl.templatesDir, role, ctrl.featureGateAccess, apiServer)
632+
featureGates, err := generateFeatureMap(ctrl.featureGateAccess, openshiftOnlyFeatureGates...)
633+
if err != nil {
634+
return fmt.Errorf("could not generate features map: %w", err)
635+
}
636+
637+
originalKubeConfig, err := generateOriginalKubeletConfigWithFeatureGates(cc, ctrl.templatesDir, role, featureGates, apiServer)
638638
if err != nil {
639639
return ctrl.syncStatusOnly(cfg, err, "could not get original kubelet config: %v", err)
640640
}

Diff for: pkg/controller/kubelet-config/kubelet_config_features.go

+17-6
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,12 @@ func (ctrl *Controller) syncFeatureHandler(key string) error {
9999
}
100100
}
101101

102-
rawCfgIgn, err := generateKubeConfigIgnFromFeatures(cc, ctrl.templatesDir, role, ctrl.featureGateAccess, nodeConfig, apiServer)
102+
featureGates, err := generateFeatureMap(ctrl.featureGateAccess, openshiftOnlyFeatureGates...)
103+
if err != nil {
104+
return fmt.Errorf("could not generate features map: %w", err)
105+
}
106+
107+
rawCfgIgn, err := generateKubeConfigIgnFromFeatures(cc, ctrl.templatesDir, role, featureGates, nodeConfig, apiServer)
103108
if err != nil {
104109
return err
105110
}
@@ -174,8 +179,9 @@ func (ctrl *Controller) deleteFeature(obj interface{}) {
174179
// generateFeatureMap returns a map of enabled/disabled feature gate selection with exclusion list
175180
//
176181
//nolint:gocritic
177-
func generateFeatureMap(featuregateAccess featuregates.FeatureGateAccess, exclusions ...osev1.FeatureGateName) (*map[string]bool, error) {
182+
func generateFeatureMap(featuregateAccess featuregates.FeatureGateAccess, exclusions ...osev1.FeatureGateName) (map[string]bool, error) {
178183
rv := make(map[string]bool)
184+
179185
if !featuregateAccess.AreInitialFeatureGatesObserved() {
180186
return nil, fmt.Errorf("initial feature gates are not observed")
181187
}
@@ -197,11 +203,11 @@ func generateFeatureMap(featuregateAccess featuregates.FeatureGateAccess, exclus
197203
for _, excluded := range exclusions {
198204
delete(rv, string(excluded))
199205
}
200-
return &rv, nil
206+
return rv, nil
201207
}
202208

203-
func generateKubeConfigIgnFromFeatures(cc *mcfgv1.ControllerConfig, templatesDir, role string, featureGateAccess featuregates.FeatureGateAccess, nodeConfig *osev1.Node, apiServer *osev1.APIServer) ([]byte, error) {
204-
originalKubeConfig, err := generateOriginalKubeletConfigWithFeatureGates(cc, templatesDir, role, featureGateAccess, apiServer)
209+
func generateKubeConfigIgnFromFeatures(cc *mcfgv1.ControllerConfig, templatesDir, role string, featureGates map[string]bool, nodeConfig *osev1.Node, apiServer *osev1.APIServer) ([]byte, error) {
210+
originalKubeConfig, err := generateOriginalKubeletConfigWithFeatureGates(cc, templatesDir, role, featureGates, apiServer)
205211
if err != nil {
206212
return nil, err
207213
}
@@ -227,12 +233,17 @@ func generateKubeConfigIgnFromFeatures(cc *mcfgv1.ControllerConfig, templatesDir
227233
func RunFeatureGateBootstrap(templateDir string, featureGateAccess featuregates.FeatureGateAccess, nodeConfig *osev1.Node, controllerConfig *mcfgv1.ControllerConfig, mcpPools []*mcfgv1.MachineConfigPool, apiServer *osev1.APIServer) ([]*mcfgv1.MachineConfig, error) {
228234
machineConfigs := []*mcfgv1.MachineConfig{}
229235

236+
featureGates, err := generateFeatureMap(featureGateAccess, openshiftOnlyFeatureGates...)
237+
if err != nil {
238+
return nil, fmt.Errorf("could not generate features map: %w", err)
239+
}
240+
230241
for _, pool := range mcpPools {
231242
role := pool.Name
232243
if nodeConfig == nil {
233244
nodeConfig = createNewDefaultNodeconfig()
234245
}
235-
rawCfgIgn, err := generateKubeConfigIgnFromFeatures(controllerConfig, templateDir, role, featureGateAccess, nodeConfig, apiServer)
246+
rawCfgIgn, err := generateKubeConfigIgnFromFeatures(controllerConfig, templateDir, role, featureGates, nodeConfig, apiServer)
236247
if err != nil {
237248
return nil, err
238249
}

Diff for: pkg/controller/kubelet-config/kubelet_config_features_test.go

+5-6
Original file line numberDiff line numberDiff line change
@@ -44,17 +44,16 @@ func TestFeatureGateDrift(t *testing.T) {
4444
fgAccess := featuregates.NewHardcodedFeatureGateAccess(features.Spec.FeatureGateSelection.CustomNoUpgrade.Enabled, features.Spec.FeatureGateSelection.CustomNoUpgrade.Disabled)
4545
ctrl := f.newController(fgAccess)
4646

47+
featureGates, err := generateFeatureMap(ctrl.featureGateAccess, openshiftOnlyFeatureGates...)
48+
require.NoError(t, err)
49+
4750
// Generate kubelet config with feature gates applied
48-
kubeletConfig, err := generateOriginalKubeletConfigWithFeatureGates(cc, ctrl.templatesDir, "master", fgAccess, nil)
51+
kubeletConfig, err := generateOriginalKubeletConfigWithFeatureGates(cc, ctrl.templatesDir, "master", featureGates, nil)
4952
require.NoError(t, err)
5053

5154
t.Logf("Generated Kubelet Config Feature Gates: %v", kubeletConfig.FeatureGates)
5255

53-
defaultFeatureGates, err := generateFeatureMap(fgAccess)
54-
require.NoError(t, err)
55-
t.Logf("Expected Feature Gates: %v", *defaultFeatureGates)
56-
57-
if !reflect.DeepEqual(kubeletConfig.FeatureGates, *defaultFeatureGates) {
56+
if !reflect.DeepEqual(kubeletConfig.FeatureGates, featureGates) {
5857
t.Errorf("Generated kubelet configuration feature gates do not match expected feature gates: generated=%v, expected=%v", kubeletConfig.FeatureGates, *defaultFeatureGates)
5958
}
6059
})

Diff for: pkg/controller/kubelet-config/kubelet_config_nodes.go

+12-2
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,11 @@ func (ctrl *Controller) syncNodeConfigHandler(key string) error {
101101
return fmt.Errorf("could not get the TLSSecurityProfile from %v: %v", ctrlcommon.APIServerInstanceName, err)
102102
}
103103

104+
featureGates, err := generateFeatureMap(ctrl.featureGateAccess, openshiftOnlyFeatureGates...)
105+
if err != nil {
106+
return fmt.Errorf("could not generate features map: %w", err)
107+
}
108+
104109
for _, pool := range mcpPools {
105110
role := pool.Name
106111
// Get MachineConfig
@@ -120,7 +125,7 @@ func (ctrl *Controller) syncNodeConfigHandler(key string) error {
120125
return err
121126
}
122127
}
123-
originalKubeConfig, err := generateOriginalKubeletConfigWithFeatureGates(cc, ctrl.templatesDir, role, ctrl.featureGateAccess, apiServer)
128+
originalKubeConfig, err := generateOriginalKubeletConfigWithFeatureGates(cc, ctrl.templatesDir, role, featureGates, apiServer)
124129
if err != nil {
125130
return err
126131
}
@@ -304,6 +309,11 @@ func RunNodeConfigBootstrap(templateDir string, featureGateAccess featuregates.F
304309

305310
configs := []*mcfgv1.MachineConfig{}
306311

312+
featureGates, err := generateFeatureMap(featureGateAccess, openshiftOnlyFeatureGates...)
313+
if err != nil {
314+
return nil, fmt.Errorf("could not generate features map: %w", err)
315+
}
316+
307317
for _, pool := range mcpPools {
308318
role := pool.Name
309319
// Get MachineConfig
@@ -316,7 +326,7 @@ func RunNodeConfigBootstrap(templateDir string, featureGateAccess featuregates.F
316326
if err != nil {
317327
return nil, err
318328
}
319-
originalKubeConfig, err := generateOriginalKubeletConfigWithFeatureGates(cconfig, templateDir, role, featureGateAccess, apiServer)
329+
originalKubeConfig, err := generateOriginalKubeletConfigWithFeatureGates(cconfig, templateDir, role, featureGates, apiServer)
320330
if err != nil {
321331
return nil, err
322332
}

0 commit comments

Comments
 (0)