Skip to content

Commit 5b7d140

Browse files
author
Jeff Peeler
committed
fix(olm): operator group annotations and listers
1 parent d7229f1 commit 5b7d140

File tree

4 files changed

+39
-86
lines changed

4 files changed

+39
-86
lines changed

pkg/controller/operators/olm/operator.go

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,6 @@ import (
2727
k8serrors "k8s.io/apimachinery/pkg/api/errors"
2828
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2929
"k8s.io/client-go/informers"
30-
cappsv1 "k8s.io/client-go/listers/apps/v1"
31-
cv1 "k8s.io/client-go/listers/core/v1"
32-
crbacv1 "k8s.io/client-go/listers/rbac/v1"
3330
"k8s.io/client-go/tools/cache"
3431
"k8s.io/client-go/tools/record"
3532
"k8s.io/client-go/util/workqueue"
@@ -48,21 +45,15 @@ const (
4845

4946
type Operator struct {
5047
*queueinformer.Operator
51-
csvQueue workqueue.RateLimitingInterface
52-
client versioned.Interface
53-
resolver install.StrategyResolverInterface
54-
lister operatorlister.OperatorLister
55-
roleLister crbacv1.RoleLister
56-
roleBindingLister crbacv1.RoleBindingLister
57-
clusterRoleLister crbacv1.ClusterRoleLister
58-
clusterRoleBindingLister crbacv1.ClusterRoleBindingLister
59-
csvLister map[string]csvlister.ClusterServiceVersionLister
60-
operatorGroupLister map[string]operatorgrouplister.OperatorGroupLister
61-
deploymentLister map[string]cappsv1.DeploymentLister
62-
namespaceLister cv1.NamespaceLister
63-
annotator *annotator.Annotator
64-
recorder record.EventRecorder
65-
cleanupFunc func()
48+
csvQueue workqueue.RateLimitingInterface
49+
client versioned.Interface
50+
resolver install.StrategyResolverInterface
51+
lister operatorlister.OperatorLister
52+
csvLister map[string]csvlister.ClusterServiceVersionLister
53+
operatorGroupLister map[string]operatorgrouplister.OperatorGroupLister
54+
annotator *annotator.Annotator
55+
recorder record.EventRecorder
56+
cleanupFunc func()
6657
}
6758

6859
func NewOperator(crClient versioned.Interface, opClient operatorclient.ClientInterface, resolver install.StrategyResolverInterface, wakeupInterval time.Duration, annotations map[string]string, namespaces []string) (*Operator, error) {
@@ -210,13 +201,12 @@ func NewOperator(crClient versioned.Interface, opClient operatorclient.ClientInt
210201

211202
// set up watch on deployments
212203
depInformers := []cache.SharedIndexInformer{}
213-
op.deploymentLister = make(map[string]cappsv1.DeploymentLister, len(namespaces))
214204
for _, namespace := range namespaces {
215205
log.Debugf("watching deployments in namespace %s", namespace)
216206
informerFactory := informers.NewSharedInformerFactoryWithOptions(opClient.KubernetesInterface(), wakeupInterval, informers.WithNamespace(namespace))
217207
informer := informerFactory.Apps().V1().Deployments()
218208
depInformers = append(depInformers, informer.Informer())
219-
op.deploymentLister[namespace] = informer.Lister()
209+
op.lister.AppsV1().RegisterDeploymentLister(namespace, informer.Lister())
220210
}
221211

222212
depQueue := workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "csv-deployments")

pkg/controller/operators/olm/operator_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1273,7 +1273,7 @@ func TestSyncOperatorGroups(t *testing.T) {
12731273
},
12741274
LastUpdated: timeNow(),
12751275
},
1276-
expectedAnnotation: map[string]string{"olm.targetNamespaces": testNS},
1276+
expectedAnnotation: map[string]string{"olm.targetNamespaces": testNS, "olm.operatorGroup": "operator-group-1", "olm.operatorNamespace": testNS},
12771277
},
12781278
}
12791279

@@ -1298,7 +1298,7 @@ func TestSyncOperatorGroups(t *testing.T) {
12981298
if tc.expectedAnnotation != nil {
12991299
// assuming CSVs are in correct namespace
13001300
for _, ns := range tc.namespaces {
1301-
deployments, err := op.deploymentLister[ns.Name].List(labels.Everything())
1301+
deployments, err := op.lister.AppsV1().DeploymentLister().Deployments(ns.GetName()).List(labels.Everything())
13021302
if err != nil {
13031303
t.Fatal(err)
13041304
}

pkg/controller/operators/olm/operatorgroup.go

Lines changed: 25 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package olm
22

33
import (
44
"fmt"
5+
"reflect"
56
"strings"
67

78
"github.com/operator-framework/operator-lifecycle-manager/pkg/api/apis/operators/v1alpha1"
@@ -42,7 +43,7 @@ func (a *Operator) syncOperatorGroups(obj interface{}) error {
4243
}
4344
nsListJoined := strings.Join(nsList, ",")
4445

45-
if err := a.annotateDeployments(op.GetNamespace(), nsListJoined); err != nil {
46+
if err := a.annotateDeployments(op, nsListJoined); err != nil {
4647
log.Errorf("annotateDeployments error: %v", err)
4748
return err
4849
}
@@ -51,58 +52,19 @@ func (a *Operator) syncOperatorGroups(obj interface{}) error {
5152
// annotate csvs
5253
csvsInNamespace := a.csvsInNamespace(op.Namespace)
5354
for _, csv := range csvsInNamespace {
54-
a.addAnnotationsToCSV(csv, op, nsListJoined)
55-
// TODO: generate a patch
56-
if _, err := a.client.OperatorsV1alpha1().ClusterServiceVersions(csv.GetNamespace()).Update(csv); err != nil {
57-
log.Errorf("Update for existing CSV failed: %v", err)
58-
return err
55+
origCSVannotations := csv.GetAnnotations()
56+
a.addAnnotationsToObjectMeta(&csv.ObjectMeta, op, nsListJoined)
57+
if reflect.DeepEqual(origCSVannotations, csv.GetAnnotations()) == false {
58+
// CRDs don't support strategic merge patching, but in the future if they do this should be updated to patch
59+
if _, err := a.client.OperatorsV1alpha1().ClusterServiceVersions(csv.GetNamespace()).Update(csv); err != nil {
60+
log.Errorf("Update for existing CSV failed: %v", err)
61+
}
5962
}
6063

6164
if err := a.copyCsvToTargetNamespace(csv, op, targetedNamespaces); err != nil {
6265
return err
6366
}
6467
}
65-
66-
// // create new CSV instead of DeepCopy as namespace and resource version (and status) will be different
67-
// newCSV := v1alpha1.ClusterServiceVersion{
68-
// ObjectMeta: metav1.ObjectMeta{
69-
// Name: csv.Name,
70-
// },
71-
// Spec: *csv.Spec.DeepCopy(),
72-
// Status: v1alpha1.ClusterServiceVersionStatus{
73-
// Message: "CSV copied to target namespace",
74-
// Reason: v1alpha1.CSVReasonCopied,
75-
// LastUpdateTime: timeNow(),
76-
// },
77-
// }
78-
//
79-
// a.addAnnotationsToCSV(&newCSV, op, nsListJoined)
80-
//
81-
//
82-
// for _, ns := range targetedNamespaces {
83-
// newCSV.SetNamespace(ns.Name)
84-
// if ns.Name != op.Namespace {
85-
// log.Debugf("Copying CSV %v to namespace %v", csv.GetName(), ns.GetName())
86-
// _, err := a.client.OperatorsV1alpha1().ClusterServiceVersions(ns.GetName()).Create(&newCSV)
87-
// if k8serrors.IsAlreadyExists(err) {
88-
// a.addAnnotationsToCSV(csv, op, nsListJoined)
89-
// if _, err := a.client.OperatorsV1alpha1().ClusterServiceVersions(ns.GetName()).Update(csv); err != nil {
90-
// log.Errorf("Update CSV in target namespace failed: %v", err)
91-
// return err
92-
// }
93-
// } else if err != nil {
94-
// log.Errorf("Create for new CSV failed: %v", err)
95-
// return err
96-
// }
97-
// } else {
98-
// a.addAnnotationsToCSV(csv, op, nsListJoined)
99-
// if _, err := a.client.OperatorsV1alpha1().ClusterServiceVersions(ns.GetName()).Update(csv); err != nil {
100-
// log.Errorf("Update for existing CSV failed: %v", err)
101-
// return err
102-
// }
103-
// }
104-
// }
105-
//}
10668
log.Debug("CSV annotation completed")
10769
//TODO: ensure RBAC on operator serviceaccount
10870

@@ -142,11 +104,12 @@ func (a *Operator) copyCsvToTargetNamespace(csv *v1alpha1.ClusterServiceVersion,
142104
if err != nil {
143105
log.Errorf("Create failed, yet get failed: %v", err)
144106
}
145-
// update the potentially different annotations
146-
fetchedCSV.Annotations = csv.Annotations
147-
if _, err := a.client.OperatorsV1alpha1().ClusterServiceVersions(ns.Name).Update(fetchedCSV); err != nil {
148-
log.Errorf("Update CSV in target namespace failed: %v", err)
149-
return err
107+
if reflect.DeepEqual(fetchedCSV.Annotations, csv.Annotations) == false {
108+
// CRDs don't support strategic merge patching, but in the future if they do this should be updated to patch
109+
if _, err := a.client.OperatorsV1alpha1().ClusterServiceVersions(ns.Name).Update(fetchedCSV); err != nil {
110+
log.Errorf("Update CSV in target namespace failed: %v", err)
111+
return err
112+
}
150113
}
151114
} else if err != nil {
152115
log.Errorf("Create for new CSV failed: %v", err)
@@ -156,10 +119,10 @@ func (a *Operator) copyCsvToTargetNamespace(csv *v1alpha1.ClusterServiceVersion,
156119
return nil
157120
}
158121

159-
func (a *Operator) addAnnotationsToCSV(csv *v1alpha1.ClusterServiceVersion, op *v1alpha2.OperatorGroup, targetNamespaces string) {
160-
metav1.SetMetaDataAnnotation(&csv.ObjectMeta, "olm.targetNamespaces", targetNamespaces)
161-
metav1.SetMetaDataAnnotation(&csv.ObjectMeta, "olm.operatorNamespace", op.GetNamespace())
162-
metav1.SetMetaDataAnnotation(&csv.ObjectMeta, "olm.operatorGroup", op.GetName())
122+
func (a *Operator) addAnnotationsToObjectMeta(obj *metav1.ObjectMeta, op *v1alpha2.OperatorGroup, targetNamespaces string) {
123+
metav1.SetMetaDataAnnotation(obj, "olm.targetNamespaces", targetNamespaces)
124+
metav1.SetMetaDataAnnotation(obj, "olm.operatorNamespace", op.GetNamespace())
125+
metav1.SetMetaDataAnnotation(obj, "olm.operatorGroup", op.GetName())
163126
}
164127

165128
func namespacesChanged(clusterNamespaces []*corev1.Namespace, statusNamespaces []*corev1.Namespace) bool {
@@ -232,10 +195,12 @@ func (a *Operator) ensureClusterRoles(op *v1alpha2.OperatorGroup) error {
232195
}
233196

234197
clusterRole := &rbacv1.ClusterRole{
198+
ObjectMeta: metav1.ObjectMeta{
199+
Name: fmt.Sprintf("owned-crd-manager-%s", csv.GetName()),
200+
},
235201
Rules: managerPolicyRules,
236202
}
237203
ownerutil.AddNonBlockingOwner(clusterRole, csv)
238-
clusterRole.SetGenerateName(fmt.Sprintf("owned-crd-manager-%s-", csv.Spec.DisplayName))
239204
_, err := a.OpClient.KubernetesInterface().RbacV1().ClusterRoles().Create(clusterRole)
240205
if k8serrors.IsAlreadyExists(err) {
241206
if _, err = a.OpClient.UpdateClusterRole(clusterRole); err != nil {
@@ -284,9 +249,9 @@ func (a *Operator) ensureClusterRoles(op *v1alpha2.OperatorGroup) error {
284249
return nil
285250
}
286251

287-
func (a *Operator) annotateDeployments(operatorNamespace string, targetNamespaceString string) error {
252+
func (a *Operator) annotateDeployments(op *v1alpha2.OperatorGroup, targetNamespaceString string) error {
288253
// write above namespaces to watch in every deployment in operator namespace
289-
deploymentList, err := a.deploymentLister[operatorNamespace].List(labels.Everything())
254+
deploymentList, err := a.lister.AppsV1().DeploymentLister().Deployments(op.GetNamespace()).List(labels.Everything())
290255
if err != nil {
291256
log.Errorf("deployment list failed: %v\n", err)
292257
return err
@@ -308,12 +273,11 @@ func (a *Operator) annotateDeployments(operatorNamespace string, targetNamespace
308273
}
309274

310275
originalDeploy := deploy.DeepCopy()
311-
metav1.SetMetaDataAnnotation(&deploy.Spec.Template.ObjectMeta, "olm.targetNamespaces", targetNamespaceString)
276+
a.addAnnotationsToObjectMeta(&deploy.Spec.Template.ObjectMeta, op, targetNamespaceString)
312277
if _, _, err := a.OpClient.PatchDeployment(originalDeploy, deploy); err != nil {
313278
log.Errorf("patch deployment failed: %v\n", err)
314279
return err
315280
}
316-
317281
}
318282

319283
return nil

test/e2e/operator_groups_e2e_test.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ func TestOperatorGroup(t *testing.T) {
182182
require.Equal(t, createdCSV.Name, fetchedCSV.Name)
183183
require.Equal(t, createdCSV.Spec, fetchedCSV.Spec)
184184

185-
log.Debug("Waiting on deployment to have correct annotation")
185+
log.Debug("Waiting on deployment to have correct annotations")
186186
err = wait.Poll(pollInterval, pollDuration, func() (bool, error) {
187187
createdDeployment, err := c.GetDeployment(testNamespace, "operator-deployment")
188188
if err != nil {
@@ -191,8 +191,7 @@ func TestOperatorGroup(t *testing.T) {
191191
}
192192
return false, err
193193
}
194-
// TODO: verify operatorNamespace annotation, operatorGroup annotation
195-
if createdDeployment.Spec.Template.Annotations["olm.targetNamespaces"] == otherNamespaceName {
194+
if checkOperatorGroupAnnotations(&createdDeployment.Spec.Template, &operatorGroup, otherNamespaceName) == nil {
196195
return true, nil
197196
}
198197
return false, nil

0 commit comments

Comments
 (0)