Skip to content

Commit 154641a

Browse files
committed
Add feature check
1 parent e865c86 commit 154641a

File tree

1 file changed

+49
-6
lines changed

1 file changed

+49
-6
lines changed

pkg/controller/operator.go

+49-6
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"os"
77
"time"
88

9+
configv1 "github.com/openshift/api/config/v1"
910
configv1client "github.com/openshift/client-go/config/clientset/versioned/typed/config/v1"
1011
"github.com/openshift/library-go/pkg/controller/controllercmd"
1112
"k8s.io/apimachinery/pkg/api/errors"
@@ -156,7 +157,7 @@ func (s *Operator) Run(ctx context.Context, controller *controllercmd.Controller
156157
// a threshold
157158

158159
// start reporting status now that all controller loops are added as sources
159-
if err := statusReporter.Start(ctx); err != nil {
160+
if err = statusReporter.Start(ctx); err != nil {
160161
return fmt.Errorf("unable to set initial cluster status: %v", err)
161162
}
162163
// start uploading status, so that we
@@ -166,13 +167,9 @@ func (s *Operator) Run(ctx context.Context, controller *controllercmd.Controller
166167
reportGatherer := insightsreport.New(insightsClient, configObserver, uploader)
167168
go reportGatherer.Run(ctx)
168169

170+
runOCMController(ctx, configClient, kubeClient, configObserver, insightsClient)
169171
klog.Warning("started")
170172

171-
// OMC controller periodically checks and pull data from the OCM API
172-
// the data is exposed in the OpenShift API
173-
ocmController := ocm.New(ctx, kubeClient.CoreV1(), configObserver, insightsClient)
174-
go ocmController.Run()
175-
176173
<-ctx.Done()
177174

178175
return nil
@@ -206,3 +203,49 @@ func isRunning(ctx context.Context, kubeConfig *rest.Config) wait.ConditionFunc
206203
return true, nil
207204
}
208205
}
206+
207+
// runOCMController checks the "InsightsOperatorPullingSCA" feature and if it's enabled then run the OCM controller
208+
func runOCMController(ctx context.Context, configClient *configv1client.ConfigV1Client,
209+
kubeClient *kubernetes.Clientset, configObserver *configobserver.Controller, insightsClient *insightsclient.Client) {
210+
ocmEnabled, err := featureEnabled(ctx, configClient, "InsightsOperatorPullingSCA")
211+
if err != nil {
212+
klog.Errorf("Pulling of SCA certs from the OCM is disabled. Unable to get cluster FeatureGate: %v", err)
213+
}
214+
if ocmEnabled {
215+
klog.Info("Pulling of SCA certs from the OCM is enabled.")
216+
// OMC controller periodically checks and pull data from the OCM API
217+
// the data is exposed in the OpenShift API
218+
ocmController := ocm.New(ctx, kubeClient.CoreV1(), configObserver, insightsClient)
219+
go ocmController.Run()
220+
}
221+
}
222+
223+
// featureEnabled checks if the feature is enabled in the "cluster" FeatureGate
224+
func featureEnabled(ctx context.Context, client *configv1client.ConfigV1Client, feature string) (bool, error) {
225+
fg, err := client.FeatureGates().Get(ctx, "cluster", metav1.GetOptions{})
226+
if err != nil {
227+
return false, err
228+
}
229+
enabled := getEnabledFeatures(fg)
230+
for _, f := range enabled {
231+
if f == feature {
232+
return true, nil
233+
}
234+
}
235+
return false, nil
236+
}
237+
238+
// getEnabledFeatures returns a list of enabled features in provided FeatureGate
239+
func getEnabledFeatures(fg *configv1.FeatureGate) []string {
240+
if fg.Spec.FeatureSet == "" {
241+
return nil
242+
}
243+
if fg.Spec.FeatureSet == configv1.CustomNoUpgrade {
244+
return fg.Spec.CustomNoUpgrade.Enabled
245+
}
246+
gates := configv1.FeatureSets[fg.Spec.FeatureSet]
247+
if gates == nil {
248+
return nil
249+
}
250+
return gates.Enabled
251+
}

0 commit comments

Comments
 (0)