diff --git a/pkg/operator/staticpod/controller/guard/guard_controller.go b/pkg/operator/staticpod/controller/guard/guard_controller.go index ca47c78d81..4ab81ee5eb 100644 --- a/pkg/operator/staticpod/controller/guard/guard_controller.go +++ b/pkg/operator/staticpod/controller/guard/guard_controller.go @@ -37,6 +37,7 @@ type GuardController struct { targetNamespace, podResourcePrefix string operatorName string readyzPort string + operandPodLabelSelector labels.Selector nodeLister corelisterv1.NodeLister podLister corelisterv1.PodLister @@ -50,7 +51,9 @@ type GuardController struct { } func NewGuardController( - targetNamespace, podResourcePrefix string, + targetNamespace string, + operandPodLabelSelector labels.Selector, + podResourcePrefix string, operatorName string, readyzPort string, kubeInformersForTargetNamespace informers.SharedInformerFactory, @@ -62,17 +65,18 @@ func NewGuardController( createConditionalFunc func() (bool, error), ) factory.Controller { c := &GuardController{ - targetNamespace: targetNamespace, - podResourcePrefix: podResourcePrefix, - operatorName: operatorName, - readyzPort: readyzPort, - nodeLister: kubeInformersClusterScoped.Core().V1().Nodes().Lister(), - podLister: kubeInformersForTargetNamespace.Core().V1().Pods().Lister(), - podGetter: podGetter, - pdbGetter: pdbGetter, - pdbLister: kubeInformersForTargetNamespace.Policy().V1().PodDisruptionBudgets().Lister(), - installerPodImageFn: getInstallerPodImageFromEnv, - createConditionalFunc: createConditionalFunc, + targetNamespace: targetNamespace, + operandPodLabelSelector: operandPodLabelSelector, + podResourcePrefix: podResourcePrefix, + operatorName: operatorName, + readyzPort: readyzPort, + nodeLister: kubeInformersClusterScoped.Core().V1().Nodes().Lister(), + podLister: kubeInformersForTargetNamespace.Core().V1().Pods().Lister(), + podGetter: podGetter, + pdbGetter: pdbGetter, + pdbLister: kubeInformersForTargetNamespace.Policy().V1().PodDisruptionBudgets().Lister(), + installerPodImageFn: getInstallerPodImageFromEnv, + createConditionalFunc: createConditionalFunc, } return factory.New().WithInformers( @@ -162,7 +166,7 @@ func (c *GuardController) sync(ctx context.Context, syncCtx factory.SyncContext) return err } - pods, err := c.podLister.Pods(c.targetNamespace).List(labels.SelectorFromSet(labels.Set{"app": c.podResourcePrefix})) + pods, err := c.podLister.Pods(c.targetNamespace).List(c.operandPodLabelSelector) if err != nil { return err } diff --git a/pkg/operator/staticpod/controller/guard/guard_controller_test.go b/pkg/operator/staticpod/controller/guard/guard_controller_test.go index 5d89107a05..78d1a7d9c7 100644 --- a/pkg/operator/staticpod/controller/guard/guard_controller_test.go +++ b/pkg/operator/staticpod/controller/guard/guard_controller_test.go @@ -288,17 +288,18 @@ func TestRenderGuardPod(t *testing.T) { eventRecorder := events.NewRecorder(kubeClient.CoreV1().Events("test"), "test-operator", &corev1.ObjectReference{}) ctrl := &GuardController{ - targetNamespace: "test", - podResourcePrefix: "operand", - operatorName: "operator", - readyzPort: "99999", - nodeLister: kubeInformers.Core().V1().Nodes().Lister(), - podLister: kubeInformers.Core().V1().Pods().Lister(), - podGetter: kubeClient.CoreV1(), - pdbGetter: kubeClient.PolicyV1(), - pdbLister: kubeInformers.Policy().V1().PodDisruptionBudgets().Lister(), - installerPodImageFn: getInstallerPodImageFromEnv, - createConditionalFunc: IsSNOCheckFnc(lister), + targetNamespace: "test", + podResourcePrefix: "operand", + operatorName: "operator", + operandPodLabelSelector: labels.Set{"app": "operand"}.AsSelector(), + readyzPort: "99999", + nodeLister: kubeInformers.Core().V1().Nodes().Lister(), + podLister: kubeInformers.Core().V1().Pods().Lister(), + podGetter: kubeClient.CoreV1(), + pdbGetter: kubeClient.PolicyV1(), + pdbLister: kubeInformers.Policy().V1().PodDisruptionBudgets().Lister(), + installerPodImageFn: getInstallerPodImageFromEnv, + createConditionalFunc: IsSNOCheckFnc(lister), } ctx, cancel := context.WithCancel(context.TODO()) @@ -404,17 +405,18 @@ func TestRenderGuardPodPortChanged(t *testing.T) { eventRecorder := events.NewRecorder(kubeClient.CoreV1().Events("test"), "test-operator", &corev1.ObjectReference{}) ctrl := &GuardController{ - targetNamespace: "test", - podResourcePrefix: "operand", - operatorName: "operator", - readyzPort: "99999", - nodeLister: kubeInformers.Core().V1().Nodes().Lister(), - podLister: kubeInformers.Core().V1().Pods().Lister(), - podGetter: kubeClient.CoreV1(), - pdbGetter: kubeClient.PolicyV1(), - pdbLister: kubeInformers.Policy().V1().PodDisruptionBudgets().Lister(), - installerPodImageFn: getInstallerPodImageFromEnv, - createConditionalFunc: IsSNOCheckFnc(lister), + targetNamespace: "test", + podResourcePrefix: "operand", + operandPodLabelSelector: labels.Set{"app": "operand"}.AsSelector(), + operatorName: "operator", + readyzPort: "99999", + nodeLister: kubeInformers.Core().V1().Nodes().Lister(), + podLister: kubeInformers.Core().V1().Pods().Lister(), + podGetter: kubeClient.CoreV1(), + pdbGetter: kubeClient.PolicyV1(), + pdbLister: kubeInformers.Policy().V1().PodDisruptionBudgets().Lister(), + installerPodImageFn: getInstallerPodImageFromEnv, + createConditionalFunc: IsSNOCheckFnc(lister), } ctx, cancel := context.WithCancel(context.TODO()) diff --git a/pkg/operator/staticpod/controllers.go b/pkg/operator/staticpod/controllers.go index 00025e3758..930ea816d9 100644 --- a/pkg/operator/staticpod/controllers.go +++ b/pkg/operator/staticpod/controllers.go @@ -88,11 +88,12 @@ func NewBuilder( type Builder interface { WithEvents(eventRecorder events.Recorder) Builder WithVersioning(operandName string, versionRecorder status.VersionGetter) Builder + WithOperandPodLabelSelector(labelSelector labels.Selector) Builder WithRevisionedResources(operandNamespace, staticPodName string, revisionConfigMaps, revisionSecrets []revisioncontroller.RevisionResource) Builder WithUnrevisionedCerts(certDir string, certConfigMaps, certSecrets []installer.UnrevisionedResource) Builder WithInstaller(command []string) Builder WithMinReadyDuration(minReadyDuration time.Duration) Builder - WithStartupMonitor(enabledStartupMonitor func() (bool, error), operandPodLabelSelector labels.Selector) Builder + WithStartupMonitor(enabledStartupMonitor func() (bool, error)) Builder // WithCustomInstaller allows mutating the installer pod definition just before // the installer pod is created for a revision. @@ -113,6 +114,11 @@ func (b *staticPodOperatorControllerBuilder) WithVersioning(operandName string, return b } +func (b *staticPodOperatorControllerBuilder) WithOperandPodLabelSelector(labelSelector labels.Selector) Builder { + b.operandPodLabelSelector = labelSelector + return b +} + func (b *staticPodOperatorControllerBuilder) WithRevisionedResources(operandNamespace, staticPodName string, revisionConfigMaps, revisionSecrets []revisioncontroller.RevisionResource) Builder { b.operandNamespace = operandNamespace b.staticPodName = staticPodName @@ -141,9 +147,8 @@ func (b *staticPodOperatorControllerBuilder) WithMinReadyDuration(minReadyDurati return b } -func (b *staticPodOperatorControllerBuilder) WithStartupMonitor(enabledStartupMonitor func() (bool, error), operandPodLabelSelector labels.Selector) Builder { +func (b *staticPodOperatorControllerBuilder) WithStartupMonitor(enabledStartupMonitor func() (bool, error)) Builder { b.enableStartMonitor = enabledStartupMonitor - b.operandPodLabelSelector = operandPodLabelSelector return b } @@ -285,14 +290,18 @@ func (b *staticPodOperatorControllerBuilder) ToControllers() (manager.Controller eventRecorder, ), 1) - manager.WithController(staticpodfallback.New( - b.operandNamespace, - b.operandPodLabelSelector, - b.staticPodOperatorClient, - b.kubeInformers, - b.enableStartMonitor, - b.eventRecorder, - ), 1) + if b.operandPodLabelSelector.Empty() { + errs = append(errs, fmt.Errorf("missing OperandPodLabelSelector when running StaticPodFallbackConditionController; cannot proceed")) + } else { + manager.WithController(staticpodfallback.New( + b.operandNamespace, + b.operandPodLabelSelector, + b.staticPodOperatorClient, + b.kubeInformers, + b.enableStartMonitor, + b.eventRecorder, + ), 1) + } manager.WithController(node.NewNodeController( b.staticPodOperatorClient, @@ -317,19 +326,24 @@ func (b *staticPodOperatorControllerBuilder) ToControllers() (manager.Controller manager.WithController(loglevel.NewClusterOperatorLoggingController(b.staticPodOperatorClient, eventRecorder), 1) if len(b.operatorNamespace) > 0 && len(b.operatorName) > 0 && len(b.readyzPort) > 0 { - manager.WithController(guard.NewGuardController( - b.operandNamespace, - b.staticPodName, - b.operatorName, - b.readyzPort, - operandInformers, - clusterInformers, - b.staticPodOperatorClient, - podClient, - pdbClient, - eventRecorder, - b.guardCreateConditionalFunc, - ), 1) + if b.operandPodLabelSelector.Empty() { + errs = append(errs, fmt.Errorf("missing OperandPodLabelSelector when running GuardController; cannot proceed")) + } else { + manager.WithController(guard.NewGuardController( + b.operandNamespace, + b.operandPodLabelSelector, + b.staticPodName, + b.operatorName, + b.readyzPort, + operandInformers, + clusterInformers, + b.staticPodOperatorClient, + podClient, + pdbClient, + eventRecorder, + b.guardCreateConditionalFunc, + ), 1) + } } return manager, errors.NewAggregate(errs)