@@ -17,6 +17,7 @@ import (
17
17
"k8s.io/client-go/util/retry"
18
18
"k8s.io/klog/v2"
19
19
20
+ configv1 "github.com/openshift/api/config/v1"
20
21
mcfgv1 "github.com/openshift/api/machineconfiguration/v1"
21
22
ctrlcommon "github.com/openshift/machine-config-operator/pkg/controller/common"
22
23
"github.com/openshift/machine-config-operator/pkg/version"
@@ -73,14 +74,20 @@ func (ctrl *Controller) syncFeatureHandler(key string) error {
73
74
return fmt .Errorf ("could not get the TLSSecurityProfile from %v: %v" , ctrlcommon .APIServerInstanceName , err )
74
75
}
75
76
77
+ featureGates , renderedVersions , err := generateFeatureMap (ctrl .featureGateAccess , openshiftOnlyFeatureGates ... )
78
+ if err != nil {
79
+ return fmt .Errorf ("could not generate features map: %w" , err )
80
+ }
81
+ // Fetch the Node Config object
82
+ nodeConfig , err := ctrl .nodeConfigLister .Get (ctrlcommon .ClusterNodeInstanceName )
83
+ if errors .IsNotFound (err ) {
84
+ nodeConfig = createNewDefaultNodeconfig ()
85
+ }
86
+
87
+ updatedPools := map [string ]int64 {}
88
+
76
89
for _ , pool := range mcpPools {
77
- var nodeConfig * osev1.Node
78
90
role := pool .Name
79
- // Fetch the Node Config object
80
- nodeConfig , err = ctrl .nodeConfigLister .Get (ctrlcommon .ClusterNodeInstanceName )
81
- if errors .IsNotFound (err ) {
82
- nodeConfig = createNewDefaultNodeconfig ()
83
- }
84
91
// Get MachineConfig
85
92
managedKey , err := getManagedFeaturesKey (pool , ctrl .client )
86
93
if err != nil {
@@ -99,11 +106,6 @@ func (ctrl *Controller) syncFeatureHandler(key string) error {
99
106
}
100
107
}
101
108
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
109
rawCfgIgn , err := generateKubeConfigIgnFromFeatures (cc , ctrl .templatesDir , role , featureGates , nodeConfig , apiServer )
108
110
if err != nil {
109
111
return err
@@ -130,9 +132,12 @@ func (ctrl *Controller) syncFeatureHandler(key string) error {
130
132
}
131
133
klog .Infof ("Applied FeatureSet %v on MachineConfigPool %v" , key , pool .Name )
132
134
ctrlcommon .UpdateStateMetric (ctrlcommon .MCCSubControllerState , "machine-config-controller-kubelet-config" , "Sync FeatureSet" , pool .Name )
135
+ updatedPools [pool .Name ] = pool .Status .ObservedGeneration
133
136
}
137
+ go ctrl .writebackMinimumKubeletVersionIfAppropriate (updatedPools , renderedVersions , nodeConfig , func () ([]* mcfgv1.MachineConfigPool , error ) {
138
+ return ctrl .mcpLister .List (labels .Everything ())
139
+ })
134
140
return ctrl .cleanUpDuplicatedMC (managedFeaturesKeyPrefix )
135
-
136
141
}
137
142
138
143
func (ctrl * Controller ) enqueueFeature (feat * osev1.FeatureGate ) {
@@ -179,16 +184,16 @@ func (ctrl *Controller) deleteFeature(obj interface{}) {
179
184
// generateFeatureMap returns a map of enabled/disabled feature gate selection with exclusion list
180
185
//
181
186
//nolint:gocritic
182
- func generateFeatureMap (featuregateAccess featuregates.FeatureGateAccess , exclusions ... osev1.FeatureGateName ) (map [string ]bool , error ) {
187
+ func generateFeatureMap (featuregateAccess featuregates.FeatureGateAccess , exclusions ... osev1.FeatureGateName ) (map [string ]bool , []configv1. MinimumComponentVersion , error ) {
183
188
rv := make (map [string ]bool )
184
189
185
190
if ! featuregateAccess .AreInitialFeatureGatesObserved () {
186
- return nil , fmt .Errorf ("initial feature gates are not observed" )
191
+ return nil , nil , fmt .Errorf ("initial feature gates are not observed" )
187
192
}
188
193
189
194
features , err := featuregateAccess .CurrentFeatureGates ()
190
195
if err != nil {
191
- return nil , fmt .Errorf ("could not get current feature gates: %w" , err )
196
+ return nil , nil , fmt .Errorf ("could not get current feature gates: %w" , err )
192
197
}
193
198
194
199
for _ , feat := range features .KnownFeatures () {
@@ -203,7 +208,7 @@ func generateFeatureMap(featuregateAccess featuregates.FeatureGateAccess, exclus
203
208
for _ , excluded := range exclusions {
204
209
delete (rv , string (excluded ))
205
210
}
206
- return rv , nil
211
+ return rv , features . RenderedMinimumComponentVersions (), nil
207
212
}
208
213
209
214
func generateKubeConfigIgnFromFeatures (cc * mcfgv1.ControllerConfig , templatesDir , role string , featureGates map [string ]bool , nodeConfig * osev1.Node , apiServer * osev1.APIServer ) ([]byte , error ) {
@@ -233,7 +238,8 @@ func generateKubeConfigIgnFromFeatures(cc *mcfgv1.ControllerConfig, templatesDir
233
238
func RunFeatureGateBootstrap (templateDir string , featureGateAccess featuregates.FeatureGateAccess , nodeConfig * osev1.Node , controllerConfig * mcfgv1.ControllerConfig , mcpPools []* mcfgv1.MachineConfigPool , apiServer * osev1.APIServer ) ([]* mcfgv1.MachineConfig , error ) {
234
239
machineConfigs := []* mcfgv1.MachineConfig {}
235
240
236
- featureGates , err := generateFeatureMap (featureGateAccess , openshiftOnlyFeatureGates ... )
241
+ // TODO FIXME: do we need rendered versions here?
242
+ featureGates , _ , err := generateFeatureMap (featureGateAccess , openshiftOnlyFeatureGates ... )
237
243
if err != nil {
238
244
return nil , fmt .Errorf ("could not generate features map: %w" , err )
239
245
}
0 commit comments