@@ -30,6 +30,7 @@ import (
3030
3131 "k8s.io/apimachinery/pkg/runtime"
3232 utilruntime "k8s.io/apimachinery/pkg/util/runtime"
33+ "k8s.io/client-go/kubernetes"
3334 clientgoscheme "k8s.io/client-go/kubernetes/scheme"
3435 "k8s.io/component-base/config"
3536 "k8s.io/component-base/config/options"
@@ -41,9 +42,13 @@ import (
4142
4243 configv1 "github.com/openshift/api/config/v1"
4344
45+ configv1client "github.com/openshift/client-go/config/clientset/versioned"
46+ configinformers "github.com/openshift/client-go/config/informers/externalversions"
4447 "github.com/openshift/cluster-cloud-controller-manager-operator/pkg/controllers"
4548 "github.com/openshift/cluster-cloud-controller-manager-operator/pkg/restmapper"
4649 "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"
4752 // +kubebuilder:scaffold:imports
4853)
4954
@@ -132,15 +137,49 @@ func main() {
132137 }
133138
134139 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+
135173 if err = (& controllers.CloudConfigReconciler {
136174 ClusterOperatorStatusClient : controllers.ClusterOperatorStatusClient {
137175 Client : mgr .GetClient (),
138- Recorder : mgr .GetEventRecorderFor ("cloud-controller-manager-operator-cloud-config-sync-controller" ),
176+ Recorder : mgr .GetEventRecorderFor (recorderName ),
139177 Clock : sharedClock ,
140178 ReleaseVersion : controllers .GetReleaseVersion (),
141179 ManagedNamespace : * managedNamespace ,
142180 },
143- Scheme : mgr .GetScheme (),
181+ Scheme : mgr .GetScheme (),
182+ FeatureGateAccess : featureGateAccessor ,
144183 }).SetupWithManager (mgr ); err != nil {
145184 setupLog .Error (err , "unable to create cloud-config sync controller" , "controller" , "ClusterOperator" )
146185 os .Exit (1 )
0 commit comments