Skip to content

Commit 2af56a7

Browse files
ecordellJeff Peeler
authored andcommitted
WIP: cvs in operator namespace are being annotated,
csvs in target namespaces should be annotated
1 parent 6486f52 commit 2af56a7

File tree

2 files changed

+131
-41
lines changed

2 files changed

+131
-41
lines changed

pkg/controller/operators/olm/operatorgroup.go

Lines changed: 86 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -41,16 +41,85 @@ func (a *Operator) syncOperatorGroups(obj interface{}) error {
4141
}
4242
nsListJoined := strings.Join(nsList, ",")
4343

44-
if err := a.annotateDeployments(op.GetNamespace(), nsListJoined); err != nil {
45-
log.Errorf("annotateDeployments error: %v", err)
46-
return err
47-
}
48-
log.Debug("Deployment annotation completed")
44+
//if err := a.annotateDeployments(op.GetNamespace(), nsListJoined); err != nil {
45+
// log.Errorf("annotateDeployments error: %v", err)
46+
// return err
47+
//}
48+
//log.Debug("Deployment annotation completed")
4949

5050
// annotate csvs
5151
csvsInNamespace := a.csvsInNamespace(op.Namespace)
5252
for _, csv := range csvsInNamespace {
53-
// create new CSV instead of DeepCopy as namespace and resource version (and status) will be different
53+
a.addAnnotationsToCSV(csv, op, nsListJoined)
54+
// TODO: generate a patch
55+
if _, err := a.client.OperatorsV1alpha1().ClusterServiceVersions(csv.GetNamespace()).Update(csv); err != nil {
56+
log.Errorf("Update for existing CSV failed: %v", err)
57+
return err
58+
}
59+
60+
if err := a.copyCsvToTargetNamespace(csv, op, targetedNamespaces); err!=nil {
61+
return err
62+
}
63+
}
64+
65+
// // create new CSV instead of DeepCopy as namespace and resource version (and status) will be different
66+
// newCSV := v1alpha1.ClusterServiceVersion{
67+
// ObjectMeta: metav1.ObjectMeta{
68+
// Name: csv.Name,
69+
// },
70+
// Spec: *csv.Spec.DeepCopy(),
71+
// Status: v1alpha1.ClusterServiceVersionStatus{
72+
// Message: "CSV copied to target namespace",
73+
// Reason: v1alpha1.CSVReasonCopied,
74+
// LastUpdateTime: timeNow(),
75+
// },
76+
// }
77+
//
78+
// a.addAnnotationsToCSV(&newCSV, op, nsListJoined)
79+
//
80+
//
81+
// for _, ns := range targetedNamespaces {
82+
// newCSV.SetNamespace(ns.Name)
83+
// if ns.Name != op.Namespace {
84+
// log.Debugf("Copying CSV %v to namespace %v", csv.GetName(), ns.GetName())
85+
// _, err := a.client.OperatorsV1alpha1().ClusterServiceVersions(ns.GetName()).Create(&newCSV)
86+
// if k8serrors.IsAlreadyExists(err) {
87+
// a.addAnnotationsToCSV(csv, op, nsListJoined)
88+
// if _, err := a.client.OperatorsV1alpha1().ClusterServiceVersions(ns.GetName()).Update(csv); err != nil {
89+
// log.Errorf("Update CSV in target namespace failed: %v", err)
90+
// return err
91+
// }
92+
// } else if err != nil {
93+
// log.Errorf("Create for new CSV failed: %v", err)
94+
// return err
95+
// }
96+
// } else {
97+
// a.addAnnotationsToCSV(csv, op, nsListJoined)
98+
// if _, err := a.client.OperatorsV1alpha1().ClusterServiceVersions(ns.GetName()).Update(csv); err != nil {
99+
// log.Errorf("Update for existing CSV failed: %v", err)
100+
// return err
101+
// }
102+
// }
103+
// }
104+
//}
105+
log.Debug("CSV annotation completed")
106+
//TODO: ensure RBAC on operator serviceaccount
107+
108+
return nil
109+
}
110+
111+
func (a *Operator) copyCsvToTargetNamespace(csv *v1alpha1.ClusterServiceVersion, operatorGroup *v1alpha2.OperatorGroup, targetNamespaces []*corev1.Namespace) error {
112+
var nsList []string
113+
for _, ns := range targetNamespaces {
114+
nsList = append(nsList, ns.Name)
115+
}
116+
nsListJoined := strings.Join(nsList, ",")
117+
118+
119+
for _, ns := range targetNamespaces {
120+
if ns.Name == operatorGroup.GetNamespace() {
121+
continue
122+
}
54123
newCSV := v1alpha1.ClusterServiceVersion{
55124
ObjectMeta: metav1.ObjectMeta{
56125
Name: csv.Name,
@@ -62,36 +131,21 @@ func (a *Operator) syncOperatorGroups(obj interface{}) error {
62131
LastUpdateTime: timeNow(),
63132
},
64133
}
134+
a.addAnnotationsToCSV(&newCSV, operatorGroup, nsListJoined)
135+
newCSV.SetNamespace(ns.Name)
65136

66-
a.addAnnotationsToCSV(&newCSV, op, nsListJoined)
67-
68-
for _, ns := range targetedNamespaces {
69-
newCSV.SetNamespace(ns.Name)
70-
if ns.Name != op.Namespace {
71-
log.Debugf("Copying CSV %v to namespace %v", csv.GetName(), ns.GetName())
72-
_, err := a.client.OperatorsV1alpha1().ClusterServiceVersions(ns.GetName()).Create(&newCSV)
73-
if k8serrors.IsAlreadyExists(err) {
74-
a.addAnnotationsToCSV(csv, op, nsListJoined)
75-
if _, err := a.client.OperatorsV1alpha1().ClusterServiceVersions(ns.GetName()).Update(csv); err != nil {
76-
log.Errorf("Update CSV in target namespace failed: %v", err)
77-
return err
78-
}
79-
} else if err != nil {
80-
log.Errorf("Create for new CSV failed: %v", err)
81-
return err
82-
}
83-
} else {
84-
a.addAnnotationsToCSV(csv, op, nsListJoined)
85-
if _, err := a.client.OperatorsV1alpha1().ClusterServiceVersions(ns.GetName()).Update(csv); err != nil {
86-
log.Errorf("Update for existing CSV failed: %v", err)
87-
return err
88-
}
137+
log.Debugf("Copying CSV %v to namespace %v", csv.GetName(), ns.Name)
138+
_, err := a.client.OperatorsV1alpha1().ClusterServiceVersions(ns.Name).Create(&newCSV)
139+
if k8serrors.IsAlreadyExists(err) {
140+
if _, err := a.client.OperatorsV1alpha1().ClusterServiceVersions(ns.Name).Update(&newCSV); err != nil {
141+
log.Errorf("Update CSV in target namespace failed: %v", err)
142+
return err
89143
}
144+
} else if err != nil {
145+
log.Errorf("Create for new CSV failed: %v", err)
146+
return err
90147
}
91148
}
92-
log.Debug("CSV annotation completed")
93-
//TODO: ensure RBAC on operator serviceaccount
94-
95149
return nil
96150
}
97151

test/e2e/operator_groups_e2e_test.go

Lines changed: 45 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,12 @@ func patchOlmDeployment(t *testing.T, c operatorclient.ClientInterface, newNames
6565

6666
func TestCreateOperatorGroupWithMatchingNamespace(t *testing.T) {
6767
// Create namespace with specific label
68-
// Create CSV in namespace
68+
// Create CSV in opoerator namespace
6969
// Create operator group that watches namespace and uses specific label
7070
// Verify operator group status contains correct status
71+
// Verify csv in target namespace exists, has copied status, has annotations
7172
// Verify deployments have correct namespace annotation
73+
// (Verify that the operator can operate in the target namespace)
7274

7375
log.SetLevel(log.DebugLevel)
7476
c := newKubeClient(t)
@@ -162,22 +164,56 @@ func TestCreateOperatorGroupWithMatchingNamespace(t *testing.T) {
162164
return false, nil
163165
})
164166

165-
log.Debug("Waiting on deployment to have correct annotation")
167+
log.Debug("Waiting for operator namespace csv to have annotations")
166168
err = wait.Poll(pollInterval, pollDuration, func() (bool, error) {
167-
createdDeployment, err := c.GetDeployment(testNamespace, "operator-deployment")
168-
if err != nil {
169-
if errors.IsNotFound(err) {
170-
return false, nil
171-
}
172-
return false, err
169+
fetchedCSV, fetchErr := crc.OperatorsV1alpha1().ClusterServiceVersions(testNamespace).Get(csvName, metav1.GetOptions{})
170+
if fetchErr != nil {
171+
fmt.Println(fetchErr)
172+
return false, fetchErr
173+
}
174+
//TODO: check other annotations
175+
if fetchedCSV.Annotations["olm.targetNamespaces"] == otherNamespaceName {
176+
return true, nil
173177
}
174-
if createdDeployment.Spec.Template.Annotations["olm.targetNamespaces"] == otherNamespaceName {
178+
return false, nil
179+
})
180+
181+
log.Debug("Waiting for target namespace csv to have annotations")
182+
err = wait.Poll(pollInterval, pollDuration, func() (bool, error) {
183+
fetchedCSV, fetchErr := crc.OperatorsV1alpha1().ClusterServiceVersions(otherNamespaceName).Get(csvName, metav1.GetOptions{})
184+
if fetchErr != nil {
185+
fmt.Println(fetchErr)
186+
return false, fetchErr
187+
}
188+
//TODO: check other annotations
189+
if fetchedCSV.Annotations["olm.targetNamespaces"] == otherNamespaceName {
175190
return true, nil
176191
}
177192
return false, nil
178193
})
179194

195+
196+
// TODO: verify CSV in target namespace has correct annotations and status
197+
// TODO: verify CSV in operator namespace has correct annotations
198+
199+
//log.Debug("Waiting on deployment to have correct annotation")
200+
//err = wait.Poll(pollInterval, pollDuration, func() (bool, error) {
201+
// createdDeployment, err := c.GetDeployment(testNamespace, "operator-deployment")
202+
// if err != nil {
203+
// if errors.IsNotFound(err) {
204+
// return false, nil
205+
// }
206+
// return false, err
207+
// }
208+
// // TODO: verify operatorNamespace annotation, operatorGroup annotation
209+
// if createdDeployment.Spec.Template.Annotations["olm.targetNamespaces"] == otherNamespaceName {
210+
// return true, nil
211+
// }
212+
// return false, nil
213+
//})
214+
180215
// clean up
216+
// TODO: unpatch function
181217
runningDeploy, err := c.GetDeployment(testNamespace, "olm-operator")
182218
require.NoError(t, err)
183219
runningDeploy.Spec.Template.Spec.Containers[0].Command = oldCommand

0 commit comments

Comments
 (0)