@@ -30,6 +30,7 @@ import (
30
30
31
31
"k8s.io/apimachinery/pkg/runtime"
32
32
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
33
+ "k8s.io/client-go/kubernetes"
33
34
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
34
35
"k8s.io/component-base/config"
35
36
"k8s.io/component-base/config/options"
@@ -41,9 +42,13 @@ import (
41
42
42
43
configv1 "github.com/openshift/api/config/v1"
43
44
45
+ configv1client "github.com/openshift/client-go/config/clientset/versioned"
46
+ configinformers "github.com/openshift/client-go/config/informers/externalversions"
44
47
"github.com/openshift/cluster-cloud-controller-manager-operator/pkg/controllers"
45
48
"github.com/openshift/cluster-cloud-controller-manager-operator/pkg/restmapper"
46
49
"github.com/openshift/cluster-cloud-controller-manager-operator/pkg/util"
50
+ "github.com/openshift/library-go/pkg/operator/configobserver/featuregates"
51
+ "github.com/openshift/library-go/pkg/operator/events"
47
52
// +kubebuilder:scaffold:imports
48
53
)
49
54
@@ -132,15 +137,49 @@ func main() {
132
137
}
133
138
134
139
sharedClock := clock.RealClock {}
140
+ // Feature gate accessor
141
+ missingVersion := "0.0.1-snapshot"
142
+ desiredVersion := controllers .GetReleaseVersion ()
143
+ ctx := ctrl .SetupSignalHandler ()
144
+ configClient , err := configv1client .NewForConfig (mgr .GetConfig ())
145
+ if err != nil {
146
+ setupLog .Error (err , "unable to create config client" )
147
+ os .Exit (1 )
148
+ }
149
+ configInformers := configinformers .NewSharedInformerFactory (configClient , 10 * time .Minute )
150
+ kubeClient , err := kubernetes .NewForConfig (mgr .GetConfig ())
151
+ if err != nil {
152
+ setupLog .Error (err , "unable to create kube client" )
153
+ os .Exit (1 )
154
+ }
155
+ controllerRef , err := events .GetControllerReferenceForCurrentPod (ctx , kubeClient , * managedNamespace , nil )
156
+ if err != nil {
157
+ klog .Warningf ("unable to get owner reference (falling back to namespace): %v" , err )
158
+ }
159
+ recorderName := "cloud-controller-manager-operator-cloud-config-sync-controller"
160
+ recorder := events .NewKubeRecorder (kubeClient .CoreV1 ().Events (* managedNamespace ), recorderName , controllerRef , sharedClock )
161
+ featureGateAccessor := featuregates .NewFeatureGateAccess (
162
+ desiredVersion , missingVersion ,
163
+ configInformers .Config ().V1 ().ClusterVersions (), configInformers .Config ().V1 ().FeatureGates (),
164
+ recorder ,
165
+ )
166
+ featureGateAccessor .SetChangeHandler (func (featureChange featuregates.FeatureChange ) {
167
+ // Do nothing here. The controller watches feature gate changes and will react to them.
168
+ klog .InfoS ("FeatureGates changed" , "enabled" , featureChange .New .Enabled , "disabled" , featureChange .New .Disabled )
169
+ })
170
+ go featureGateAccessor .Run (ctx )
171
+ go configInformers .Start (ctx .Done ())
172
+
135
173
if err = (& controllers.CloudConfigReconciler {
136
174
ClusterOperatorStatusClient : controllers.ClusterOperatorStatusClient {
137
175
Client : mgr .GetClient (),
138
- Recorder : mgr .GetEventRecorderFor ("cloud-controller-manager-operator-cloud-config-sync-controller" ),
176
+ Recorder : mgr .GetEventRecorderFor (recorderName ),
139
177
Clock : sharedClock ,
140
178
ReleaseVersion : controllers .GetReleaseVersion (),
141
179
ManagedNamespace : * managedNamespace ,
142
180
},
143
- Scheme : mgr .GetScheme (),
181
+ Scheme : mgr .GetScheme (),
182
+ FeatureGateAccess : featureGateAccessor ,
144
183
}).SetupWithManager (mgr ); err != nil {
145
184
setupLog .Error (err , "unable to create cloud-config sync controller" , "controller" , "ClusterOperator" )
146
185
os .Exit (1 )
0 commit comments