@@ -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" )
@@ -88,7 +92,7 @@ type Operator struct {
88
92
clientAttenuator * scoped.ClientAttenuator
89
93
serviceAccountQuerier * scoped.UserDefinedServiceAccountQuerier
90
94
clientFactory clients.Factory
91
- copiedCSVs bool
95
+ isCopiedCSVsEnabled bool
92
96
}
93
97
94
98
func NewOperator (ctx context.Context , options ... OperatorOption ) (* Operator , error ) {
@@ -144,7 +148,7 @@ func newOperatorWithConfig(ctx context.Context, config *operatorConfig) (*Operat
144
148
clientAttenuator : scoped .NewClientAttenuator (config .logger , config .restConfig , config .operatorClient ),
145
149
serviceAccountQuerier : scoped .NewUserDefinedServiceAccountQuerier (config .logger , config .externalClient ),
146
150
clientFactory : clients .NewFactory (config .restConfig ),
147
- copiedCSVs : config .copiedCSVs ,
151
+ isCopiedCSVsEnabled : config .isCopiedCSVsEnabled ,
148
152
}
149
153
150
154
// Set up syncing for namespace-scoped resources
@@ -1246,34 +1250,109 @@ func (a *Operator) syncCopyCSV(obj interface{}) (syncError error) {
1246
1250
1247
1251
// Check if we need to do any copying / annotation for the operatorgroup
1248
1252
namespaceSet := NewNamespaceSet (operatorGroup .Status .Namespaces )
1249
- if a .copiedCSVs || ! namespaceSet .IsAllNamespaces () {
1253
+ if a .isCopiedCSVsEnabled || ! namespaceSet .IsAllNamespaces () {
1250
1254
if err := a .ensureCSVsInNamespaces (clusterServiceVersion , operatorGroup , namespaceSet ); err != nil {
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
1258
- requirement , err := labels .NewRequirement (operatorsv1alpha1 .CopiedLabelKey , selection .Equals , []string {clusterServiceVersion .Namespace })
1259
- if err != nil {
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
+ return
1267
+ }
1268
+
1269
+ requirement , err := labels .NewRequirement (operatorsv1alpha1 .CopiedLabelKey , selection .Equals , []string {clusterServiceVersion .Namespace })
1270
+ if err != nil {
1271
+ return err
1272
+ }
1273
+
1274
+ copiedCSVs , err := a .copiedCSVLister .List (labels .NewSelector ().Add (* requirement ))
1275
+ if err != nil {
1276
+ return err
1277
+ }
1278
+
1279
+ for _ , copiedCSV := range copiedCSVs {
1280
+ err := a .client .OperatorsV1alpha1 ().ClusterServiceVersions (copiedCSV .Namespace ).Delete (context .TODO (), copiedCSV .Name , metav1.DeleteOptions {})
1281
+ if err != nil && ! k8serrors .IsNotFound (err ) {
1260
1282
return err
1261
1283
}
1284
+ }
1262
1285
1263
- copiedCSVs , err := a .copiedCSVLister .List (labels .NewSelector ().Add (* requirement ))
1264
- if err != nil {
1286
+ if err := a .createCSVCopyingDisabledEvent (clusterServiceVersion ); err != nil {
1287
+ return err
1288
+ }
1289
+
1290
+ return
1291
+ }
1292
+
1293
+ func (a * Operator ) getCopiedCSVDisabledEventsForCSV (csv * operatorsv1alpha1.ClusterServiceVersion ) ([]corev1.Event , error ) {
1294
+ result := []corev1.Event {}
1295
+ if csv == nil {
1296
+ return result , nil
1297
+ }
1298
+
1299
+ events , err := a .opClient .KubernetesInterface ().CoreV1 ().Events (csv .GetNamespace ()).List (context .TODO (), metav1.ListOptions {})
1300
+ if err != nil {
1301
+ return nil , err
1302
+ }
1303
+
1304
+ for _ , event := range events .Items {
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 ) {
1265
1330
return err
1266
1331
}
1332
+ }
1333
+ return nil
1334
+ }
1267
1335
1268
- for _ , copiedCSV := range copiedCSVs {
1269
- err := a .client .OperatorsV1alpha1 ().ClusterServiceVersions (copiedCSV .Namespace ).Delete (context .TODO (), copiedCSV .Name , metav1.DeleteOptions {})
1270
- if err != nil && ! k8serrors .IsNotFound (err ) {
1271
- return err
1272
- }
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
1273
1350
}
1274
1351
}
1275
1352
1276
- return
1353
+ a .recorder .Eventf (csv , corev1 .EventTypeWarning , copiedCSVsDisabledReason , "CSV copying disabled for %s/%s" , csv .GetNamespace (), csv .GetName ())
1354
+
1355
+ return nil
1277
1356
}
1278
1357
1279
1358
func (a * Operator ) syncGcCsv (obj interface {}) (syncError error ) {
0 commit comments