Skip to content

Commit ad5171a

Browse files
committed
Handle invalid label during resource cleanup
Invalid label due to too long CSV name will lead to label selector malfunction as it returns an empty selector that matches everything. As a result, some unrelated resources are garbaged-collected when OLM is doing some resource cleanup during uninstallation. This fix will use SelectorFromValidatedSet instead of SelectorFromSet to let the server rejects invalid label sets instead of using am empty Selector. Signed-off-by: Vu Dinh <[email protected]>
1 parent cf3f9b2 commit ad5171a

File tree

10 files changed

+19
-19
lines changed

10 files changed

+19
-19
lines changed

pkg/controller/install/webhook.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ func (i *StrategyDeploymentInstaller) createOrUpdateWebhook(caPEM []byte, desc v
7878
func (i *StrategyDeploymentInstaller) createOrUpdateMutatingWebhook(ogNamespacelabelSelector *metav1.LabelSelector, caPEM []byte, desc v1alpha1.WebhookDescription) error {
7979
webhookLabels := ownerutil.OwnerLabel(i.owner, i.owner.GetObjectKind().GroupVersionKind().Kind)
8080
webhookLabels[WebhookDescKey] = desc.GenerateName
81-
webhookSelector := labels.SelectorFromSet(webhookLabels).String()
81+
webhookSelector := labels.SelectorFromValidatedSet(webhookLabels).String()
8282

8383
existingWebhooks, err := i.strategyClient.GetOpClient().KubernetesInterface().AdmissionregistrationV1().MutatingWebhookConfigurations().List(context.TODO(), metav1.ListOptions{LabelSelector: webhookSelector})
8484
if err != nil {
@@ -124,7 +124,7 @@ func (i *StrategyDeploymentInstaller) createOrUpdateMutatingWebhook(ogNamespacel
124124
func (i *StrategyDeploymentInstaller) createOrUpdateValidatingWebhook(ogNamespacelabelSelector *metav1.LabelSelector, caPEM []byte, desc v1alpha1.WebhookDescription) error {
125125
webhookLabels := ownerutil.OwnerLabel(i.owner, i.owner.GetObjectKind().GroupVersionKind().Kind)
126126
webhookLabels[WebhookDescKey] = desc.GenerateName
127-
webhookSelector := labels.SelectorFromSet(webhookLabels).String()
127+
webhookSelector := labels.SelectorFromValidatedSet(webhookLabels).String()
128128

129129
existingWebhooks, err := i.strategyClient.GetOpClient().KubernetesInterface().AdmissionregistrationV1().ValidatingWebhookConfigurations().List(context.TODO(), metav1.ListOptions{LabelSelector: webhookSelector})
130130
if err != nil {

pkg/controller/operators/olm/apiservices.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ func (a *Operator) getCABundle(csv *v1alpha1.ClusterServiceVersion) ([]byte, err
264264
for _, desc := range csv.Spec.WebhookDefinitions {
265265
webhookLabels := ownerutil.OwnerLabel(csv, v1alpha1.ClusterServiceVersionKind)
266266
webhookLabels[install.WebhookDescKey] = desc.GenerateName
267-
webhookSelector := labels.SelectorFromSet(webhookLabels).String()
267+
webhookSelector := labels.SelectorFromValidatedSet(webhookLabels).String()
268268

269269
switch desc.Type {
270270
case v1alpha1.MutatingAdmissionWebhook:
@@ -493,7 +493,7 @@ func (a *Operator) updateDeploymentSpecsWithApiServiceData(csv *v1alpha1.Cluster
493493

494494
func (a *Operator) cleanUpRemovedWebhooks(csv *v1alpha1.ClusterServiceVersion) error {
495495
webhookLabels := ownerutil.OwnerLabel(csv, v1alpha1.ClusterServiceVersionKind)
496-
webhookSelector := labels.SelectorFromSet(webhookLabels).String()
496+
webhookSelector := labels.SelectorFromValidatedSet(webhookLabels).String()
497497

498498
csvWebhookGenerateNames := make(map[string]struct{}, len(csv.Spec.WebhookDefinitions))
499499
for _, webhook := range csv.Spec.WebhookDefinitions {
@@ -549,7 +549,7 @@ func (a *Operator) areWebhooksAvailable(csv *v1alpha1.ClusterServiceVersion) (bo
549549
webhookLabels := ownerutil.OwnerLabel(csv, v1alpha1.ClusterServiceVersionKind)
550550
webhookLabels[install.WebhookDescKey] = desc.GenerateName
551551
webhookLabels[install.WebhookHashKey] = install.HashWebhookDesc(desc)
552-
webhookSelector := labels.SelectorFromSet(webhookLabels).String()
552+
webhookSelector := labels.SelectorFromValidatedSet(webhookLabels).String()
553553

554554
webhookCount := 0
555555
switch desc.Type {

pkg/controller/operators/olm/operator.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -968,7 +968,7 @@ func (a *Operator) handleClusterServiceVersionDeletion(obj interface{}) {
968968
}
969969
}
970970

971-
webhookSelector := labels.SelectorFromSet(ownerutil.OwnerLabel(clusterServiceVersion, v1alpha1.ClusterServiceVersionKind)).String()
971+
webhookSelector := labels.SelectorFromValidatedSet(ownerutil.OwnerLabel(clusterServiceVersion, v1alpha1.ClusterServiceVersionKind)).String()
972972
mWebhooks, err := a.opClient.KubernetesInterface().AdmissionregistrationV1().MutatingWebhookConfigurations().List(context.TODO(), metav1.ListOptions{LabelSelector: webhookSelector})
973973
if err != nil {
974974
logger.WithError(err).Warn("cannot list MutatingWebhookConfigurations")

pkg/controller/operators/olm/operatorgroup.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ func (a *Operator) operatorGroupDeleted(obj interface{}) {
185185
"namespace": op.GetNamespace(),
186186
})
187187

188-
clusterRoles, err := a.lister.RbacV1().ClusterRoleLister().List(labels.SelectorFromSet(ownerutil.OwnerLabel(op, "OperatorGroup")))
188+
clusterRoles, err := a.lister.RbacV1().ClusterRoleLister().List(labels.SelectorFromValidatedSet(ownerutil.OwnerLabel(op, "OperatorGroup")))
189189
if err != nil {
190190
logger.WithError(err).Error("failed to list ClusterRoles for garbage collection")
191191
return

pkg/controller/registry/reconciler/configmap.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ func (c *ConfigMapRegistryReconciler) currentRoleBinding(source configMapCatalog
208208

209209
func (c *ConfigMapRegistryReconciler) currentPods(source configMapCatalogSourceDecorator, image string) []*v1.Pod {
210210
podName := source.Pod(image).GetName()
211-
pods, err := c.Lister.CoreV1().PodLister().Pods(source.GetNamespace()).List(labels.SelectorFromSet(source.Selector()))
211+
pods, err := c.Lister.CoreV1().PodLister().Pods(source.GetNamespace()).List(labels.SelectorFromValidatedSet(source.Selector()))
212212
if err != nil {
213213
logrus.WithField("pod", podName).WithError(err).Debug("couldn't find pod in cache")
214214
return nil

pkg/controller/registry/reconciler/configmap_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -459,7 +459,7 @@ func TestConfigMapRegistryReconciler(t *testing.T) {
459459
decorated := configMapCatalogSourceDecorator{tt.in.catsrc}
460460

461461
pod := decorated.Pod(registryImageName)
462-
listOptions := metav1.ListOptions{LabelSelector: labels.SelectorFromSet(labels.Set{CatalogSourceLabelKey: tt.in.catsrc.GetName()}).String()}
462+
listOptions := metav1.ListOptions{LabelSelector: labels.SelectorFromValidatedSet(labels.Set{CatalogSourceLabelKey: tt.in.catsrc.GetName()}).String()}
463463
outPods, err := client.KubernetesInterface().CoreV1().Pods(pod.GetNamespace()).List(context.TODO(), listOptions)
464464
require.NoError(t, err)
465465
require.Len(t, outPods.Items, 1)

pkg/controller/registry/reconciler/grpc_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ func TestGrpcRegistryReconciler(t *testing.T) {
208208
decorated := grpcCatalogSourceDecorator{tt.in.catsrc}
209209
pod := decorated.Pod()
210210
service := decorated.Service()
211-
listOptions := metav1.ListOptions{LabelSelector: labels.SelectorFromSet(labels.Set{CatalogSourceLabelKey: tt.in.catsrc.GetName()}).String()}
211+
listOptions := metav1.ListOptions{LabelSelector: labels.SelectorFromValidatedSet(labels.Set{CatalogSourceLabelKey: tt.in.catsrc.GetName()}).String()}
212212
outPods, podErr := client.KubernetesInterface().CoreV1().Pods(pod.GetNamespace()).List(context.TODO(), listOptions)
213213
outService, serviceErr := client.KubernetesInterface().CoreV1().Services(service.GetNamespace()).Get(context.TODO(), service.GetName(), metav1.GetOptions{})
214214

pkg/lib/ownerutil/util.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,7 @@ func AdoptableLabels(labels map[string]string, checkName bool, targets ...Owner)
268268

269269
// CSVOwnerSelector returns a label selector to find generated objects owned by owner
270270
func CSVOwnerSelector(owner *operatorsv1alpha1.ClusterServiceVersion) labels.Selector {
271-
return labels.SelectorFromSet(OwnerLabel(owner, operatorsv1alpha1.ClusterServiceVersionKind))
271+
return labels.SelectorFromValidatedSet(OwnerLabel(owner, operatorsv1alpha1.ClusterServiceVersionKind))
272272
}
273273

274274
// AddOwner adds an owner to the ownerref list.

test/e2e/catalog_e2e_test.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -272,13 +272,13 @@ var _ = Describe("Catalog", func() {
272272

273273
// Await 1 CatalogSource registry pod matching the updated labels
274274
singlePod := podCount(1)
275-
selector := labels.SelectorFromSet(map[string]string{"olm.catalogSource": mainCatalogName, "olm.configMapResourceVersion": updatedConfigMap.GetResourceVersion()})
275+
selector := labels.SelectorFromValidatedSet(map[string]string{"olm.catalogSource": mainCatalogName, "olm.configMapResourceVersion": updatedConfigMap.GetResourceVersion()})
276276
podList, err := awaitPods(GinkgoT(), c, testNamespace, selector.String(), singlePod)
277277
require.NoError(GinkgoT(), err)
278278
require.Equal(GinkgoT(), 1, len(podList.Items), "expected pod list not of length 1")
279279

280280
// Await 1 CatalogSource registry pod matching the updated labels
281-
selector = labels.SelectorFromSet(map[string]string{"olm.catalogSource": mainCatalogName})
281+
selector = labels.SelectorFromValidatedSet(map[string]string{"olm.catalogSource": mainCatalogName})
282282
podList, err = awaitPods(GinkgoT(), c, testNamespace, selector.String(), singlePod)
283283
require.NoError(GinkgoT(), err)
284284
require.Equal(GinkgoT(), 1, len(podList.Items), "expected pod list not of length 1")
@@ -538,7 +538,7 @@ var _ = Describe("Catalog", func() {
538538
defer cleanupSource()
539539

540540
// Wait for a new registry pod to be created
541-
selector := labels.SelectorFromSet(map[string]string{"olm.catalogSource": sourceName})
541+
selector := labels.SelectorFromValidatedSet(map[string]string{"olm.catalogSource": sourceName})
542542
singlePod := podCount(1)
543543
registryPods, err := awaitPods(GinkgoT(), c, testNamespace, selector.String(), singlePod)
544544
require.NoError(GinkgoT(), err, "error awaiting registry pod")
@@ -602,7 +602,7 @@ var _ = Describe("Catalog", func() {
602602

603603
// Wait for a new registry pod to be created
604604
c := newKubeClient()
605-
selector := labels.SelectorFromSet(map[string]string{"olm.catalogSource": source.GetName()})
605+
selector := labels.SelectorFromValidatedSet(map[string]string{"olm.catalogSource": source.GetName()})
606606
singlePod := podCount(1)
607607
registryPods, err := awaitPods(GinkgoT(), c, source.GetNamespace(), selector.String(), singlePod)
608608
require.NoError(GinkgoT(), err, "error awaiting registry pod")
@@ -753,7 +753,7 @@ var _ = Describe("Catalog", func() {
753753

754754
// wait for new catalog source pod to be created
755755
// Wait for a new registry pod to be created
756-
selector := labels.SelectorFromSet(map[string]string{"olm.catalogSource": source.GetName()})
756+
selector := labels.SelectorFromValidatedSet(map[string]string{"olm.catalogSource": source.GetName()})
757757
singlePod := podCount(1)
758758
registryPods, err := awaitPods(GinkgoT(), c, source.GetNamespace(), selector.String(), singlePod)
759759
require.NoError(GinkgoT(), err, "error awaiting registry pod")
@@ -1020,7 +1020,7 @@ var _ = Describe("Catalog", func() {
10201020
Expect(err).ToNot(HaveOccurred())
10211021

10221022
// wait for new catalog source pod to be created and report ready
1023-
selector := labels.SelectorFromSet(map[string]string{"olm.catalogSource": source.GetName()})
1023+
selector := labels.SelectorFromValidatedSet(map[string]string{"olm.catalogSource": source.GetName()})
10241024
singlePod := podCount(1)
10251025
catalogPods, err := awaitPods(GinkgoT(), c, source.GetNamespace(), selector.String(), singlePod)
10261026
Expect(err).ToNot(HaveOccurred())
@@ -1043,7 +1043,7 @@ var _ = Describe("Catalog", func() {
10431043
}).Should(BeTrue())
10441044

10451045
// Wait roughly the polling interval for update pod to show up
1046-
updateSelector := labels.SelectorFromSet(map[string]string{"catalogsource.operators.coreos.com/update": source.GetName()})
1046+
updateSelector := labels.SelectorFromValidatedSet(map[string]string{"catalogsource.operators.coreos.com/update": source.GetName()})
10471047
updatePods, err := awaitPodsWithInterval(GinkgoT(), c, source.GetNamespace(), updateSelector.String(), 5*time.Second, 2*time.Minute, singlePod)
10481048
Expect(err).ToNot(HaveOccurred())
10491049
Expect(updatePods).ToNot(BeNil())

test/e2e/webhook_e2e_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -900,7 +900,7 @@ var _ = Describe("CSVs with a Webhook", func() {
900900
})
901901

902902
func getWebhookWithGenerateName(c operatorclient.ClientInterface, generateName string) (*admissionregistrationv1.ValidatingWebhookConfiguration, error) {
903-
webhookSelector := labels.SelectorFromSet(map[string]string{install.WebhookDescKey: generateName}).String()
903+
webhookSelector := labels.SelectorFromValidatedSet(map[string]string{install.WebhookDescKey: generateName}).String()
904904
existingWebhooks, err := c.KubernetesInterface().AdmissionregistrationV1().ValidatingWebhookConfigurations().List(context.TODO(), metav1.ListOptions{LabelSelector: webhookSelector})
905905
if err != nil {
906906
return nil, err

0 commit comments

Comments
 (0)