Skip to content

Commit d7f6a83

Browse files
committed
Introduce disableCopiedCSVs flag
1 parent 4ec046f commit d7f6a83

File tree

2 files changed

+109
-30
lines changed

2 files changed

+109
-30
lines changed

Diff for: pkg/controller/operators/olm/config.go

+14-14
Original file line numberDiff line numberDiff line change
@@ -21,19 +21,19 @@ import (
2121
type OperatorOption func(*operatorConfig)
2222

2323
type operatorConfig struct {
24-
resyncPeriod func() time.Duration
25-
operatorNamespace string
26-
watchedNamespaces []string
27-
clock utilclock.Clock
28-
logger *logrus.Logger
29-
operatorClient operatorclient.ClientInterface
30-
externalClient versioned.Interface
31-
strategyResolver install.StrategyResolverInterface
32-
apiReconciler APIIntersectionReconciler
33-
apiLabeler labeler.Labeler
34-
restConfig *rest.Config
35-
configClient configv1client.Interface
36-
copiedCSVs bool
24+
resyncPeriod func() time.Duration
25+
operatorNamespace string
26+
watchedNamespaces []string
27+
clock utilclock.Clock
28+
logger *logrus.Logger
29+
operatorClient operatorclient.ClientInterface
30+
externalClient versioned.Interface
31+
strategyResolver install.StrategyResolverInterface
32+
apiReconciler APIIntersectionReconciler
33+
apiLabeler labeler.Labeler
34+
restConfig *rest.Config
35+
configClient configv1client.Interface
36+
isCopiedCSVsEnabled bool
3737
}
3838

3939
func (o *operatorConfig) apply(options []OperatorOption) {
@@ -115,7 +115,7 @@ func WithLogger(logger *logrus.Logger) OperatorOption {
115115

116116
func WithCopiedCSVs(enabled bool) OperatorOption {
117117
return func(config *operatorConfig) {
118-
config.copiedCSVs = enabled
118+
config.isCopiedCSVsEnabled = enabled
119119
}
120120
}
121121

Diff for: pkg/controller/operators/olm/operator.go

+95-16
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")
@@ -88,7 +92,7 @@ type Operator struct {
8892
clientAttenuator *scoped.ClientAttenuator
8993
serviceAccountQuerier *scoped.UserDefinedServiceAccountQuerier
9094
clientFactory clients.Factory
91-
copiedCSVs bool
95+
isCopiedCSVsEnabled bool
9296
}
9397

9498
func NewOperator(ctx context.Context, options ...OperatorOption) (*Operator, error) {
@@ -144,7 +148,7 @@ func newOperatorWithConfig(ctx context.Context, config *operatorConfig) (*Operat
144148
clientAttenuator: scoped.NewClientAttenuator(config.logger, config.restConfig, config.operatorClient),
145149
serviceAccountQuerier: scoped.NewUserDefinedServiceAccountQuerier(config.logger, config.externalClient),
146150
clientFactory: clients.NewFactory(config.restConfig),
147-
copiedCSVs: config.copiedCSVs,
151+
isCopiedCSVsEnabled: config.isCopiedCSVsEnabled,
148152
}
149153

150154
// Set up syncing for namespace-scoped resources
@@ -1246,34 +1250,109 @@ func (a *Operator) syncCopyCSV(obj interface{}) (syncError error) {
12461250

12471251
// Check if we need to do any copying / annotation for the operatorgroup
12481252
namespaceSet := NewNamespaceSet(operatorGroup.Status.Namespaces)
1249-
if a.copiedCSVs || !namespaceSet.IsAllNamespaces() {
1253+
if a.isCopiedCSVsEnabled || !namespaceSet.IsAllNamespaces() {
12501254
if err := a.ensureCSVsInNamespaces(clusterServiceVersion, operatorGroup, namespaceSet); err != nil {
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

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) {
12601282
return err
12611283
}
1284+
}
12621285

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) {
12651330
return err
12661331
}
1332+
}
1333+
return nil
1334+
}
12671335

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
12731350
}
12741351
}
12751352

1276-
return
1353+
a.recorder.Eventf(csv, corev1.EventTypeWarning, copiedCSVsDisabledReason, "CSV copying disabled for %s/%s", csv.GetNamespace(), csv.GetName())
1354+
1355+
return nil
12771356
}
12781357

12791358
func (a *Operator) syncGcCsv(obj interface{}) (syncError error) {

0 commit comments

Comments
 (0)