@@ -33,6 +33,7 @@ import (
33
33
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/catalog/subscription"
34
34
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/reconciler"
35
35
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver"
36
+ index "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/index"
36
37
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorclient"
37
38
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorlister"
38
39
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/ownerutil"
@@ -57,21 +58,22 @@ const (
57
58
type Operator struct {
58
59
queueinformer.Operator
59
60
60
- logger * logrus.Logger
61
- clock utilclock.Clock
62
- opClient operatorclient.ClientInterface
63
- client versioned.Interface
64
- lister operatorlister.OperatorLister
65
- catsrcQueueSet * queueinformer.ResourceQueueSet
66
- subQueueSet * queueinformer.ResourceQueueSet
67
- ipQueueSet * queueinformer.ResourceQueueSet
68
- nsResolveQueue workqueue.RateLimitingInterface
69
- namespace string
70
- sources map [resolver.CatalogKey ]resolver.SourceRef
71
- sourcesLock sync.RWMutex
72
- sourcesLastUpdate metav1.Time
73
- resolver resolver.Resolver
74
- reconciler reconciler.RegistryReconcilerFactory
61
+ logger * logrus.Logger
62
+ clock utilclock.Clock
63
+ opClient operatorclient.ClientInterface
64
+ client versioned.Interface
65
+ lister operatorlister.OperatorLister
66
+ catsrcQueueSet * queueinformer.ResourceQueueSet
67
+ subQueueSet * queueinformer.ResourceQueueSet
68
+ ipQueueSet * queueinformer.ResourceQueueSet
69
+ nsResolveQueue workqueue.RateLimitingInterface
70
+ namespace string
71
+ sources map [resolver.CatalogKey ]resolver.SourceRef
72
+ sourcesLock sync.RWMutex
73
+ sourcesLastUpdate metav1.Time
74
+ resolver resolver.Resolver
75
+ reconciler reconciler.RegistryReconcilerFactory
76
+ csvProvidedAPIsIndexer map [string ]cache.Indexer
75
77
}
76
78
77
79
// NewOperator creates a new Catalog Operator.
@@ -123,6 +125,10 @@ func NewOperator(ctx context.Context, kubeconfigPath string, clock utilclock.Clo
123
125
op .lister .OperatorsV1alpha1 ().RegisterClusterServiceVersionLister (namespace , csvInformer .Lister ())
124
126
op .RegisterInformer (csvInformer .Informer ())
125
127
128
+ csvInformer .Informer ().AddIndexers (cache.Indexers {index .ProvidedAPIsIndexFuncKey : index .ProvidedAPIsIndexFunc })
129
+ csvIndexer := csvInformer .Informer ().GetIndexer ()
130
+ op .csvProvidedAPIsIndexer [namespace ] = csvIndexer
131
+
126
132
// TODO: Add namespace resolve sync
127
133
128
134
// Wire InstallPlans
@@ -1040,8 +1046,14 @@ func (o *Operator) ExecutePlan(plan *v1alpha1.InstallPlan) error {
1040
1046
if ! reflect .DeepEqual (crd , * currentCRD ) {
1041
1047
// Verify CRD ownership, only attempt to update if
1042
1048
// CRD has only one owner
1043
- if len (existingCRDOwners [currentCRD .GetName ()]) == 1 {
1049
+ // Example: provided=database.coreos.com/v1alpha1/EtcdCluster
1050
+ matchedCSV , err := index .APIsIndexValues (o .csvProvidedAPIsIndexer , crd )
1051
+ if err != nil {
1052
+ return errorwrap .Wrapf (err , "error find matched CSV: %s" , step .Resource .Name )
1053
+ }
1054
+ if len (matchedCSV ) == 1 {
1044
1055
// Attempt to update CRD
1056
+ crd .SetResourceVersion (currentCRD .GetResourceVersion ())
1045
1057
_ , err = o .OpClient .ApiextensionsV1beta1Interface ().ApiextensionsV1beta1 ().CustomResourceDefinitions ().Update (& crd )
1046
1058
if err != nil {
1047
1059
return errorwrap .Wrapf (err , "error update CRD: %s" , step .Resource .Name )
0 commit comments