Skip to content

Commit 299fb8a

Browse files
Merge pull request #2209 from dinhxuanvu/invalid-label-selector
[release-4.6] Bug 1975456: Handle invalid label during resource cleanup
2 parents cf3f9b2 + 5662bc2 commit 299fb8a

File tree

11 files changed

+79
-20
lines changed

11 files changed

+79
-20
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.

pkg/lib/ownerutil/util_test.go

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,66 @@
11
package ownerutil
22

3-
import "testing"
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/assert"
7+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
8+
9+
operatorsv1alpha1 "github.com/operator-framework/api/pkg/operators/v1alpha1"
10+
)
411

512
func TestIsOwnedBy(t *testing.T) {
613
return
714
}
15+
16+
func TestCSVOwnerSelector(t *testing.T) {
17+
csvType := metav1.TypeMeta{
18+
Kind: operatorsv1alpha1.ClusterServiceVersionKind,
19+
APIVersion: operatorsv1alpha1.GroupVersion,
20+
}
21+
22+
tests := []struct {
23+
name string
24+
csv *operatorsv1alpha1.ClusterServiceVersion
25+
}{
26+
{
27+
name: "CSV with name longer than 63 characters",
28+
csv: &operatorsv1alpha1.ClusterServiceVersion{
29+
TypeMeta: csvType,
30+
ObjectMeta: metav1.ObjectMeta{
31+
Name: "clusterkubedescheduleroperator.4.6.0-202106010807.p0.git.5db84c5",
32+
Namespace: "test-namespace",
33+
},
34+
},
35+
},
36+
{
37+
name: "CSV with invalid name",
38+
csv: &operatorsv1alpha1.ClusterServiceVersion{
39+
TypeMeta: csvType,
40+
ObjectMeta: metav1.ObjectMeta{
41+
Name: "something@somewhere",
42+
Namespace: "test-namespace",
43+
},
44+
},
45+
},
46+
{
47+
name: "CSV with empty string name",
48+
csv: &operatorsv1alpha1.ClusterServiceVersion{
49+
TypeMeta: csvType,
50+
ObjectMeta: metav1.ObjectMeta{
51+
Name: "",
52+
Namespace: "test-namespace",
53+
},
54+
},
55+
},
56+
}
57+
58+
for _, tt := range tests {
59+
t.Run(tt.name, func(t *testing.T) {
60+
selector := CSVOwnerSelector(tt.csv)
61+
62+
assert.NotNil(t, selector)
63+
assert.False(t, selector.Empty())
64+
})
65+
}
66+
}

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)