@@ -36,6 +36,7 @@ import (
36
36
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/ownerutil"
37
37
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/queueinformer"
38
38
"github.com/operator-framework/operator-lifecycle-manager/pkg/metrics"
39
+ csvutility "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/csv"
39
40
)
40
41
41
42
var (
@@ -64,6 +65,8 @@ type Operator struct {
64
65
gcQueueIndexer * queueinformer.QueueIndexer
65
66
apiLabeler labeler.Labeler
66
67
csvIndexers map [string ]cache.Indexer
68
+ csvSetGenerator csvutility.SetGenerator
69
+ csvReplaceFinder csvutility.ReplaceFinder
67
70
}
68
71
69
72
func NewOperator (logger * logrus.Logger , crClient versioned.Interface , opClient operatorclient.ClientInterface , strategyResolver install.StrategyResolverInterface , wakeupInterval time.Duration , namespaces []string ) (* Operator , error ) {
@@ -83,17 +86,24 @@ func NewOperator(logger *logrus.Logger, crClient versioned.Interface, opClient o
83
86
return nil , err
84
87
}
85
88
89
+ lister := operatorlister .NewLister ()
90
+ csvSetGenerator := csvutility .NewSetGenerator (logger , lister )
91
+
92
+ csvReplaceFinder := csvutility .NewReplaceFinder (logger , crClient )
93
+
86
94
op := & Operator {
87
- Operator : queueOperator ,
88
- csvQueueSet : queueinformer .NewEmptyResourceQueueSet (),
89
- ogQueueSet : queueinformer .NewEmptyResourceQueueSet (),
90
- client : crClient ,
91
- resolver : strategyResolver ,
92
- apiReconciler : resolver .APIIntersectionReconcileFunc (resolver .ReconcileAPIIntersection ),
93
- lister : operatorlister .NewLister (),
94
- recorder : eventRecorder ,
95
- apiLabeler : labeler .Func (resolver .LabelSetsFor ),
96
- csvIndexers : map [string ]cache.Indexer {},
95
+ Operator : queueOperator ,
96
+ csvQueueSet : queueinformer .NewEmptyResourceQueueSet (),
97
+ ogQueueSet : queueinformer .NewEmptyResourceQueueSet (),
98
+ client : crClient ,
99
+ resolver : strategyResolver ,
100
+ apiReconciler : resolver .APIIntersectionReconcileFunc (resolver .ReconcileAPIIntersection ),
101
+ lister : lister ,
102
+ recorder : eventRecorder ,
103
+ apiLabeler : labeler .Func (resolver .LabelSetsFor ),
104
+ csvIndexers : map [string ]cache.Indexer {},
105
+ csvSetGenerator : csvSetGenerator ,
106
+ csvReplaceFinder : csvReplaceFinder ,
97
107
}
98
108
99
109
// Set up RBAC informers
@@ -352,6 +362,14 @@ func (a *Operator) syncAPIService(obj interface{}) (syncError error) {
352
362
return nil
353
363
}
354
364
365
+ func (a * Operator ) GetCSVSetGenerator () csvutility.SetGenerator {
366
+ return a .csvSetGenerator
367
+ }
368
+
369
+ func (a * Operator ) GetReplaceFinder () csvutility.ReplaceFinder {
370
+ return a .csvReplaceFinder
371
+ }
372
+
355
373
func (a * Operator ) syncObject (obj interface {}) (syncError error ) {
356
374
// Assert as metav1.Object
357
375
metaObj , ok := obj .(metav1.Object )
@@ -1171,21 +1189,7 @@ func (a *Operator) transitionCSVState(in v1alpha1.ClusterServiceVersion) (out *v
1171
1189
1172
1190
// csvSet gathers all CSVs in the given namespace into a map keyed by CSV name; if metav1.NamespaceAll gets the set across all namespaces
1173
1191
func (a * Operator ) csvSet (namespace string , phase v1alpha1.ClusterServiceVersionPhase ) map [string ]* v1alpha1.ClusterServiceVersion {
1174
- csvsInNamespace , err := a .lister .OperatorsV1alpha1 ().ClusterServiceVersionLister ().ClusterServiceVersions (namespace ).List (labels .Everything ())
1175
-
1176
- if err != nil {
1177
- a .Log .Warnf ("could not list CSVs while constructing CSV set" )
1178
- return nil
1179
- }
1180
-
1181
- csvs := make (map [string ]* v1alpha1.ClusterServiceVersion , len (csvsInNamespace ))
1182
- for _ , csv := range csvsInNamespace {
1183
- if phase != v1alpha1 .CSVPhaseAny && csv .Status .Phase != phase {
1184
- continue
1185
- }
1186
- csvs [csv .Name ] = csv .DeepCopy ()
1187
- }
1188
- return csvs
1192
+ return a .csvSetGenerator .WithNamespace (namespace , phase )
1189
1193
}
1190
1194
1191
1195
// checkReplacementsAndUpdateStatus returns an error if we can find a newer CSV and sets the status if so
@@ -1370,30 +1374,11 @@ func (a *Operator) apiServiceOwnerConflicts(csv *v1alpha1.ClusterServiceVersion)
1370
1374
}
1371
1375
1372
1376
func (a * Operator ) isBeingReplaced (in * v1alpha1.ClusterServiceVersion , csvsInNamespace map [string ]* v1alpha1.ClusterServiceVersion ) (replacedBy * v1alpha1.ClusterServiceVersion ) {
1373
- for _ , csv := range csvsInNamespace {
1374
- a .Log .Infof ("checking %s" , csv .GetName ())
1375
- if csv .Spec .Replaces == in .GetName () {
1376
- a .Log .Infof ("%s replaced by %s" , in .GetName (), csv .GetName ())
1377
- replacedBy = csv .DeepCopy ()
1378
- return
1379
- }
1380
- }
1381
- return
1377
+ return a .csvReplaceFinder .IsBeingReplaced (in , csvsInNamespace )
1382
1378
}
1383
1379
1384
1380
func (a * Operator ) isReplacing (in * v1alpha1.ClusterServiceVersion ) * v1alpha1.ClusterServiceVersion {
1385
- a .Log .Debugf ("checking if csv is replacing an older version" )
1386
- if in .Spec .Replaces == "" {
1387
- return nil
1388
- }
1389
-
1390
- // using the client instead of a lister; missing an object because of a cache sync can cause upgrades to fail
1391
- previous , err := a .client .OperatorsV1alpha1 ().ClusterServiceVersions (in .GetNamespace ()).Get (in .Spec .Replaces , metav1.GetOptions {})
1392
- if err != nil {
1393
- a .Log .WithField ("replacing" , in .Spec .Replaces ).WithError (err ).Debugf ("unable to get previous csv" )
1394
- return nil
1395
- }
1396
- return previous
1381
+ return a .csvReplaceFinder .IsReplacing (in )
1397
1382
}
1398
1383
1399
1384
func (a * Operator ) handleDeletion (obj interface {}) {
0 commit comments