@@ -56,8 +56,10 @@ type Reconciler struct {
56
56
mgr manager.Manager
57
57
58
58
// recorder is the EventRecorder for creating k8s events
59
- recorder recorder.EventRecorder
59
+ recorder recorder.EventRecorder
60
+ dynamicClient dynamic.Interface
60
61
62
+ restMapper meta.RESTMapper
61
63
options reconcilerParams
62
64
}
63
65
@@ -86,7 +88,19 @@ func (r *Reconciler) Init(mgr manager.Manager, prototype DeclarativeObject, opts
86
88
r .mgr = mgr
87
89
globalObjectTracker .mgr = mgr
88
90
89
- if err := r .applyOptions (opts ... ); err != nil {
91
+ d , err := dynamic .NewForConfig (r .config )
92
+ if err != nil {
93
+ return err
94
+ }
95
+ r .dynamicClient = d
96
+
97
+ restMapper , err := apiutil .NewDiscoveryRESTMapper (r .config )
98
+ if err != nil {
99
+ return err
100
+ }
101
+ r .restMapper = restMapper
102
+
103
+ if err = r .applyOptions (opts ... ); err != nil {
90
104
return err
91
105
}
92
106
@@ -187,33 +201,19 @@ func (r *Reconciler) reconcileExists(ctx context.Context, name types.NamespacedN
187
201
return reconcile.Result {}, err
188
202
}
189
203
190
- // dynamic config
191
- dynamicClientset , err := dynamic .NewForConfig (r .config )
192
- if err != nil {
193
- log .Error (err ,"Unable to create dynamic client" )
194
- return reconcile.Result {}, err
195
- }
196
-
197
- newItems := []* manifest.Object {}
204
+ var newItems []* manifest.Object
198
205
for _ , obj := range objects .Items {
199
206
200
- // Uses unsafe method?? Is it safe?
201
- getOptions := metav1.GetOptions {}
202
- gvk , _ := meta .UnsafeGuessKindToResource (obj .GroupVersionKind ())
203
- ns := obj .UnstructuredObject ().GetNamespace ()
204
- unstruct , err := dynamicClientset .Resource (gvk ).Namespace (ns ).Get (context .Background (),
205
- obj .Name , getOptions )
206
- if err != nil {
207
+ unstruct , err := getObjectFromCluster (obj , r )
208
+ if err != nil && ! apierrors .IsNotFound (err ) {
207
209
log .WithValues ("name" , obj .Name ).Error (err , "Unable to get resource" )
208
210
}
209
211
if unstruct != nil {
210
212
annotations := unstruct .GetAnnotations ()
211
- if ignoreAnnotation , ok := annotations ["addons.operators.ignore" ]; ok {
212
- if ignoreAnnotation == "true" {
213
- log .WithValues ("kind" , obj .Kind ).WithValues ("name" , obj .Name ).Info ("Found ignore annotation on object, " +
214
- "skipping object" )
215
- continue
216
- }
213
+ if _ , ok := annotations ["addons.k8s.io/ignore" ]; ok {
214
+ log .WithValues ("kind" , obj .Kind ).WithValues ("name" , obj .Name ).Info ("Found ignore annotation on object, " +
215
+ "skipping object" )
216
+ continue
217
217
}
218
218
}
219
219
newItems = append (newItems , obj )
@@ -550,3 +550,21 @@ func parseListKind(infos *manifest.Objects) (*manifest.Objects, error) {
550
550
func (r * Reconciler ) CollectMetrics () bool {
551
551
return r .options .metrics
552
552
}
553
+
554
+ func getObjectFromCluster (obj * manifest.Object , r * Reconciler ) (* unstructured.
555
+ Unstructured , error ) {
556
+ getOptions := metav1.GetOptions {}
557
+ gvk := obj .GroupVersionKind ()
558
+
559
+ mapping , err := r .restMapper .RESTMapping (obj .GroupKind (), gvk .Version )
560
+ if err != nil {
561
+ return nil , fmt .Errorf ("unable to get resource: %v" , err )
562
+ }
563
+ ns := obj .UnstructuredObject ().GetNamespace ()
564
+ unstruct , err := r .dynamicClient .Resource (mapping .Resource ).Namespace (ns ).Get (context .Background (),
565
+ obj .Name , getOptions )
566
+ if err != nil {
567
+ return nil , fmt .Errorf ("unable to get mapping for resource: %v" , err )
568
+ }
569
+ return unstruct , nil
570
+ }
0 commit comments