8
8
"sort"
9
9
"strconv"
10
10
"strings"
11
+ "sync"
11
12
12
13
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
13
14
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
@@ -27,7 +28,8 @@ import (
27
28
)
28
29
29
30
var (
30
- _ manager.Runnable = & GenericReconciler {}
31
+ _ manager.Runnable = & GenericReconciler {}
32
+ once sync.Once
31
33
)
32
34
33
35
// GenericReconciler watches a defined object
@@ -41,6 +43,7 @@ type GenericReconciler struct {
41
43
logger logr.Logger
42
44
cmWatcher * configmap.Watcher
43
45
validationEngine validations.Interface
46
+ apiResources []metav1.APIResource
44
47
}
45
48
46
49
// NewGenericReconciler returns a GenericReconciler struct
@@ -156,12 +159,16 @@ func (gr *GenericReconciler) LookForConfigUpdates(ctx context.Context) {
156
159
}
157
160
158
161
func (gr * GenericReconciler ) reconcileEverything (ctx context.Context ) error {
159
- apiResources , err := reconcileResourceList (gr .discovery , gr .client .Scheme ())
160
- if err != nil {
161
- return fmt .Errorf ("retrieving resources to reconcile: %w" , err )
162
- }
162
+ once .Do (func () {
163
+ apiResources , err := reconcileResourceList (gr .discovery , gr .client .Scheme ())
164
+ if err != nil {
165
+ gr .logger .Error (err , "retrieving API resources to reconcile" )
166
+ return
167
+ }
168
+ gr .apiResources = apiResources
169
+ })
163
170
164
- for i , resource := range apiResources {
171
+ for i , resource := range gr . apiResources {
165
172
gr .logger .Info ("apiResource" , "no" , i + 1 , "Group" , resource .Group ,
166
173
"Version" , resource .Version ,
167
174
"Kind" , resource .Kind )
@@ -173,7 +180,7 @@ func (gr *GenericReconciler) reconcileEverything(ctx context.Context) error {
173
180
return fmt .Errorf ("getting watched namespaces: %w" , err )
174
181
}
175
182
176
- gvkResources := gr .getNamespacedResourcesGVK (apiResources )
183
+ gvkResources := gr .getNamespacedResourcesGVK (gr . apiResources )
177
184
errNR := gr .processNamespacedResources (ctx , gvkResources , namespaces )
178
185
if errNR != nil {
179
186
return fmt .Errorf ("processing namespace scoped resources: %w" , errNR )
@@ -209,8 +216,8 @@ func (gr *GenericReconciler) groupAppObjects(ctx context.Context,
209
216
Limit : gr .listLimit ,
210
217
Namespace : namespace ,
211
218
}
219
+ list .SetGroupVersionKind (gvk )
212
220
for {
213
- list .SetGroupVersionKind (gvk )
214
221
215
222
if err := gr .client .List (ctx , & list , listOptions ); err != nil {
216
223
return nil , fmt .Errorf ("listing %s: %w" , gvk .String (), err )
@@ -285,12 +292,12 @@ func (gr *GenericReconciler) processNamespacedResources(
285
292
}
286
293
for label , objects := range relatedObjects {
287
294
gr .logger .Info ("reconcileNamespaceResources" ,
288
- "Reconciling group of" , len (objects ), "objects with app label " , label ,
295
+ "Reconciling group of" , len (objects ), "objects with labels " , label ,
289
296
"in the namespace" , ns .name )
290
297
err := gr .reconcileGroupOfObjects (ctx , objects , ns .name )
291
298
if err != nil {
292
299
return fmt .Errorf (
293
- "reconciling related objects with 'app' label value '%s': %w" , label , err ,
300
+ "reconciling related objects with labels '%s': %w" , label , err ,
294
301
)
295
302
}
296
303
}
0 commit comments