@@ -33,8 +33,10 @@ import (
33
33
"github.com/operator-framework/api/pkg/operators/v1alpha1"
34
34
"github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/clientset/versioned"
35
35
"github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/informers/externalversions"
36
+ operatorsv1alpha1listers "github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/listers/operators/v1alpha1"
36
37
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/certs"
37
38
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/install"
39
+ "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/internal/pruning"
38
40
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/overrides"
39
41
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver"
40
42
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/clients"
@@ -66,10 +68,11 @@ type Operator struct {
66
68
opClient operatorclient.ClientInterface
67
69
client versioned.Interface
68
70
lister operatorlister.OperatorLister
71
+ copiedCSVLister operatorsv1alpha1listers.ClusterServiceVersionLister
69
72
ogQueueSet * queueinformer.ResourceQueueSet
70
73
csvQueueSet * queueinformer.ResourceQueueSet
71
74
csvCopyQueueSet * queueinformer.ResourceQueueSet
72
- csvGCQueueSet * queueinformer.ResourceQueueSet
75
+ copiedCSVGCQueueSet * queueinformer.ResourceQueueSet
73
76
objGCQueueSet * queueinformer.ResourceQueueSet
74
77
nsQueueSet workqueue.RateLimitingInterface
75
78
apiServiceQueue workqueue.RateLimitingInterface
@@ -125,7 +128,7 @@ func newOperatorWithConfig(ctx context.Context, config *operatorConfig) (*Operat
125
128
ogQueueSet : queueinformer .NewEmptyResourceQueueSet (),
126
129
csvQueueSet : queueinformer .NewEmptyResourceQueueSet (),
127
130
csvCopyQueueSet : queueinformer .NewEmptyResourceQueueSet (),
128
- csvGCQueueSet : queueinformer .NewEmptyResourceQueueSet (),
131
+ copiedCSVGCQueueSet : queueinformer .NewEmptyResourceQueueSet (),
129
132
objGCQueueSet : queueinformer .NewEmptyResourceQueueSet (),
130
133
apiServiceQueue : workqueue .NewNamedRateLimitingQueue (workqueue .DefaultControllerRateLimiter (), "apiservice" ),
131
134
resolver : config .strategyResolver ,
@@ -146,8 +149,14 @@ func newOperatorWithConfig(ctx context.Context, config *operatorConfig) (*Operat
146
149
k8sSyncer := queueinformer .LegacySyncHandler (op .syncObject ).ToSyncerWithDelete (op .handleDeletion )
147
150
for _ , namespace := range config .watchedNamespaces {
148
151
// Wire CSVs
149
- extInformerFactory := externalversions .NewSharedInformerFactoryWithOptions (op .client , config .resyncPeriod (), externalversions .WithNamespace (namespace ))
150
- csvInformer := extInformerFactory .Operators ().V1alpha1 ().ClusterServiceVersions ()
152
+ csvInformer := externalversions .NewSharedInformerFactoryWithOptions (
153
+ op .client ,
154
+ config .resyncPeriod (),
155
+ externalversions .WithNamespace (namespace ),
156
+ externalversions .WithTweakListOptions (func (options * metav1.ListOptions ) {
157
+ options .LabelSelector = fmt .Sprintf ("!%s" , v1alpha1 .CopiedLabelKey )
158
+ }),
159
+ ).Operators ().V1alpha1 ().ClusterServiceVersions ()
151
160
op .lister .OperatorsV1alpha1 ().RegisterClusterServiceVersionLister (namespace , csvInformer .Lister ())
152
161
csvQueue := workqueue .NewNamedRateLimitingQueue (workqueue .DefaultControllerRateLimiter (), fmt .Sprintf ("%s/csv" , namespace ))
153
162
op .csvQueueSet .Set (namespace , csvQueue )
@@ -188,24 +197,65 @@ func newOperatorWithConfig(ctx context.Context, config *operatorConfig) (*Operat
188
197
return nil , err
189
198
}
190
199
191
- // Register separate queue for gcing csvs
192
- csvGCQueue := workqueue .NewNamedRateLimitingQueue (workqueue .DefaultControllerRateLimiter (), fmt .Sprintf ("%s/csv-gc" , namespace ))
193
- op .csvGCQueueSet .Set (namespace , csvGCQueue )
194
- csvGCQueueInformer , err := queueinformer .NewQueueInformer (
200
+ // A separate informer solely for CSV copies. Fields
201
+ // are pruned from local copies of the objects managed
202
+ // by this informer in order to reduce cached size.
203
+ copiedCSVInformer := cache .NewSharedIndexInformer (
204
+ pruning .NewListerWatcher (
205
+ op .client ,
206
+ namespace ,
207
+ func (opts * metav1.ListOptions ) {
208
+ opts .LabelSelector = v1alpha1 .CopiedLabelKey
209
+ },
210
+ pruning .PrunerFunc (func (csv * v1alpha1.ClusterServiceVersion ) {
211
+ nonstatus , status := copyableCSVHash (csv )
212
+ * csv = v1alpha1.ClusterServiceVersion {
213
+ TypeMeta : csv .TypeMeta ,
214
+ ObjectMeta : csv .ObjectMeta ,
215
+ Status : v1alpha1.ClusterServiceVersionStatus {
216
+ Phase : csv .Status .Phase ,
217
+ Reason : csv .Status .Reason ,
218
+ },
219
+ }
220
+ if csv .Annotations == nil {
221
+ csv .Annotations = make (map [string ]string , 2 )
222
+ }
223
+ // These annotation keys are
224
+ // intentionally invalid -- all writes
225
+ // to copied CSVs are regenerated from
226
+ // the corresponding non-copied CSV,
227
+ // so it should never be transmitted
228
+ // back to the API server.
229
+ csv .Annotations ["$copyhash-nonstatus" ] = nonstatus
230
+ csv .Annotations ["$copyhash-status" ] = status
231
+ }),
232
+ ),
233
+ & v1alpha1.ClusterServiceVersion {},
234
+ config .resyncPeriod (),
235
+ cache.Indexers {cache .NamespaceIndex : cache .MetaNamespaceIndexFunc },
236
+ )
237
+ op .copiedCSVLister = operatorsv1alpha1listers .NewClusterServiceVersionLister (copiedCSVInformer .GetIndexer ())
238
+
239
+ // Register separate queue for gcing copied csvs
240
+ copiedCSVGCQueue := workqueue .NewNamedRateLimitingQueue (workqueue .DefaultControllerRateLimiter (), fmt .Sprintf ("%s/csv-gc" , namespace ))
241
+ op .copiedCSVGCQueueSet .Set (namespace , copiedCSVGCQueue )
242
+ copiedCSVGCQueueInformer , err := queueinformer .NewQueueInformer (
195
243
ctx ,
244
+ queueinformer .WithInformer (copiedCSVInformer ),
196
245
queueinformer .WithLogger (op .logger ),
197
- queueinformer .WithQueue (csvGCQueue ),
198
- queueinformer .WithIndexer (csvIndexer ),
246
+ queueinformer .WithQueue (copiedCSVGCQueue ),
247
+ queueinformer .WithIndexer (copiedCSVInformer . GetIndexer () ),
199
248
queueinformer .WithSyncer (queueinformer .LegacySyncHandler (op .syncGcCsv ).ToSyncer ()),
200
249
)
201
250
if err != nil {
202
251
return nil , err
203
252
}
204
- if err := op .RegisterQueueInformer (csvGCQueueInformer ); err != nil {
253
+ if err := op .RegisterQueueInformer (copiedCSVGCQueueInformer ); err != nil {
205
254
return nil , err
206
255
}
207
256
208
257
// Wire OperatorGroup reconciliation
258
+ extInformerFactory := externalversions .NewSharedInformerFactoryWithOptions (op .client , config .resyncPeriod (), externalversions .WithNamespace (namespace ))
209
259
operatorGroupInformer := extInformerFactory .Operators ().V1 ().OperatorGroups ()
210
260
op .lister .OperatorsV1 ().RegisterOperatorGroupLister (namespace , operatorGroupInformer .Lister ())
211
261
ogQueue := workqueue .NewNamedRateLimitingQueue (workqueue .DefaultControllerRateLimiter (), fmt .Sprintf ("%s/og" , namespace ))
@@ -916,6 +966,11 @@ func (a *Operator) handleClusterServiceVersionDeletion(obj interface{}) {
916
966
917
967
metrics .DeleteCSVMetric (clusterServiceVersion )
918
968
969
+ if clusterServiceVersion .IsCopied () {
970
+ logger .Warning ("deleted csv is copied. skipping additional cleanup steps" ) // should not happen?
971
+ return
972
+ }
973
+
919
974
defer func (csv v1alpha1.ClusterServiceVersion ) {
920
975
if clusterServiceVersion .IsCopied () {
921
976
logger .Debug ("deleted csv is copied. skipping operatorgroup requeue" )
@@ -956,11 +1011,6 @@ func (a *Operator) handleClusterServiceVersionDeletion(obj interface{}) {
956
1011
return
957
1012
}
958
1013
959
- if clusterServiceVersion .IsCopied () {
960
- logger .Debug ("deleted csv is copied. skipping additional cleanup steps" )
961
- return
962
- }
963
-
964
1014
logger .Info ("gcing children" )
965
1015
namespaces := make ([]string , 0 )
966
1016
if targetNamespaces == "" {
@@ -978,7 +1028,7 @@ func (a *Operator) handleClusterServiceVersionDeletion(obj interface{}) {
978
1028
for _ , namespace := range namespaces {
979
1029
if namespace != operatorNamespace {
980
1030
logger .WithField ("targetNamespace" , namespace ).Debug ("requeueing child csv for deletion" )
981
- if err := a .csvGCQueueSet .Requeue (namespace , clusterServiceVersion .GetName ()); err != nil {
1031
+ if err := a .copiedCSVGCQueueSet .Requeue (namespace , clusterServiceVersion .GetName ()); err != nil {
982
1032
logger .WithError (err ).Warn ("unable to requeue" )
983
1033
}
984
1034
}
@@ -1060,7 +1110,7 @@ func (a *Operator) removeDanglingChildCSVs(csv *v1alpha1.ClusterServiceVersion)
1060
1110
})
1061
1111
1062
1112
if ! csv .IsCopied () {
1063
- logger .Debug ("removeDanglingChild called on a parent. this is a no-op but should be avoided." )
1113
+ logger .Warning ("removeDanglingChild called on a parent. this is a no-op but should be avoided." )
1064
1114
return nil
1065
1115
}
1066
1116
@@ -1124,10 +1174,7 @@ func (a *Operator) syncClusterServiceVersion(obj interface{}) (syncError error)
1124
1174
}
1125
1175
1126
1176
if clusterServiceVersion .IsCopied () {
1127
- logger .Debug ("skipping copied csv transition, schedule for gc check" )
1128
- if err := a .csvGCQueueSet .Requeue (clusterServiceVersion .GetNamespace (), clusterServiceVersion .GetName ()); err != nil {
1129
- logger .WithError (err ).Warn ("unable to requeue" )
1130
- }
1177
+ logger .Warning ("skipping copied csv transition" ) // should not happen?
1131
1178
return
1132
1179
}
1133
1180
0 commit comments