@@ -54,6 +54,10 @@ import (
54
54
"github.com/operator-framework/operator-lifecycle-manager/pkg/metrics"
55
55
)
56
56
57
+ const (
58
+ copiedCSVsDisabledReason = "CopiedCSVsDisabled"
59
+ )
60
+
57
61
var (
58
62
ErrRequirementsNotMet = errors .New ("requirements were not met" )
59
63
ErrCRDOwnerConflict = errors .New ("conflicting CRD owner in namespace" )
@@ -1251,10 +1255,15 @@ func (a *Operator) syncCopyCSV(obj interface{}) (syncError error) {
1251
1255
logger .WithError (err ).Info ("couldn't copy CSV to target namespaces" )
1252
1256
syncError = err
1253
1257
}
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 ()))
1257
1258
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 {
1258
1267
requirement , err := labels .NewRequirement (operatorsv1alpha1 .CopiedLabelKey , selection .Equals , []string {clusterServiceVersion .Namespace })
1259
1268
if err != nil {
1260
1269
return err
@@ -1271,11 +1280,81 @@ func (a *Operator) syncCopyCSV(obj interface{}) (syncError error) {
1271
1280
return err
1272
1281
}
1273
1282
}
1283
+
1284
+ if err := a .createCSVCopyingDisabledEvent (clusterServiceVersion ); err != nil {
1285
+ return err
1286
+ }
1274
1287
}
1275
1288
1276
1289
return
1277
1290
}
1278
1291
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
+
1279
1358
func (a * Operator ) syncGcCsv (obj interface {}) (syncError error ) {
1280
1359
clusterServiceVersion , ok := obj .(* v1alpha1.ClusterServiceVersion )
1281
1360
if ! ok {
0 commit comments