Skip to content

Commit 50c5709

Browse files
committed
Introduce disableCopiedCSVs flag
1 parent 4ec046f commit 50c5709

File tree

1 file changed

+82
-3
lines changed

1 file changed

+82
-3
lines changed

pkg/controller/operators/olm/operator.go

Lines changed: 82 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,10 @@ import (
5454
"github.com/operator-framework/operator-lifecycle-manager/pkg/metrics"
5555
)
5656

57+
const (
58+
copiedCSVsDisabledReason = "CopiedCSVsDisabled"
59+
)
60+
5761
var (
5862
ErrRequirementsNotMet = errors.New("requirements were not met")
5963
ErrCRDOwnerConflict = errors.New("conflicting CRD owner in namespace")
@@ -1251,10 +1255,15 @@ func (a *Operator) syncCopyCSV(obj interface{}) (syncError error) {
12511255
logger.WithError(err).Info("couldn't copy CSV to target namespaces")
12521256
syncError = err
12531257
}
1254-
} else {
1255-
// Todo: What happens with multiple event triggers?
1256-
go a.recorder.Event(clusterServiceVersion, corev1.EventTypeWarning, "CopiedCSVsDisabled", fmt.Sprintf("CSV copying disabled for %s/%s", clusterServiceVersion.GetNamespace(), clusterServiceVersion.GetName()))
12571258

1259+
// If the CSV was installed in AllNamespace mode, remove any "CSV Copying Disabled" events
1260+
// in which the related object's name, namespace, and uid match the given CSV's.
1261+
if namespaceSet.IsAllNamespaces() {
1262+
if err := a.deleteCSVCopyingDisabledEvent(clusterServiceVersion); err != nil {
1263+
return err
1264+
}
1265+
}
1266+
} else {
12581267
requirement, err := labels.NewRequirement(operatorsv1alpha1.CopiedLabelKey, selection.Equals, []string{clusterServiceVersion.Namespace})
12591268
if err != nil {
12601269
return err
@@ -1271,11 +1280,81 @@ func (a *Operator) syncCopyCSV(obj interface{}) (syncError error) {
12711280
return err
12721281
}
12731282
}
1283+
1284+
if err := a.createCSVCopyingDisabledEvent(clusterServiceVersion); err != nil {
1285+
return err
1286+
}
12741287
}
12751288

12761289
return
12771290
}
12781291

1292+
func (a *Operator) getCopiedCSVDisabledEventsForCSV(csv *operatorsv1alpha1.ClusterServiceVersion) ([]corev1.Event, error) {
1293+
result := []corev1.Event{}
1294+
if csv == nil {
1295+
return result, nil
1296+
}
1297+
1298+
events, err := a.opClient.KubernetesInterface().CoreV1().Events(csv.GetNamespace()).List(context.TODO(), metav1.ListOptions{})
1299+
if err != nil {
1300+
return nil, err
1301+
}
1302+
1303+
for _, event := range events.Items {
1304+
a.logger.Infof("For event %v\n", event)
1305+
if event.InvolvedObject.Namespace == csv.GetNamespace() &&
1306+
event.InvolvedObject.Name == csv.GetName() &&
1307+
event.InvolvedObject.UID == csv.GetUID() &&
1308+
event.Reason == copiedCSVsDisabledReason {
1309+
result = append(result, event)
1310+
}
1311+
}
1312+
1313+
return result, nil
1314+
}
1315+
1316+
func (a *Operator) deleteCSVCopyingDisabledEvent(csv *operatorsv1alpha1.ClusterServiceVersion) error {
1317+
events, err := a.getCopiedCSVDisabledEventsForCSV(csv)
1318+
if err != nil {
1319+
return err
1320+
}
1321+
1322+
// Remove existing events.
1323+
return a.deleteEvents(events)
1324+
}
1325+
1326+
func (a *Operator) deleteEvents(events []corev1.Event) error {
1327+
for _, event := range events {
1328+
err := a.opClient.KubernetesInterface().EventsV1().Events(event.GetNamespace()).Delete(context.TODO(), event.GetName(), metav1.DeleteOptions{})
1329+
if err != nil && !k8serrors.IsNotFound(err) {
1330+
return err
1331+
}
1332+
}
1333+
return nil
1334+
}
1335+
1336+
func (a *Operator) createCSVCopyingDisabledEvent(csv *operatorsv1alpha1.ClusterServiceVersion) error {
1337+
events, err := a.getCopiedCSVDisabledEventsForCSV(csv)
1338+
if err != nil {
1339+
return err
1340+
}
1341+
1342+
if len(events) == 1 {
1343+
return nil
1344+
}
1345+
1346+
// Remove existing events.
1347+
if len(events) > 1 {
1348+
if err := a.deleteEvents(events); err != nil {
1349+
return err
1350+
}
1351+
}
1352+
1353+
go a.recorder.Eventf(csv, corev1.EventTypeWarning, copiedCSVsDisabledReason, "CSV copying disabled for %s/%s", csv.GetNamespace(), csv.GetName())
1354+
1355+
return nil
1356+
}
1357+
12791358
func (a *Operator) syncGcCsv(obj interface{}) (syncError error) {
12801359
clusterServiceVersion, ok := obj.(*v1alpha1.ClusterServiceVersion)
12811360
if !ok {

0 commit comments

Comments
 (0)