@@ -23,6 +23,10 @@ import (
23
23
"path/filepath"
24
24
"strings"
25
25
26
+ "k8s.io/apimachinery/pkg/api/meta"
27
+
28
+ "k8s.io/client-go/dynamic"
29
+
26
30
apierrors "k8s.io/apimachinery/pkg/api/errors"
27
31
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
28
32
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
@@ -54,9 +58,11 @@ type Reconciler struct {
54
58
mgr manager.Manager
55
59
56
60
// recorder is the EventRecorder for creating k8s events
57
- recorder recorder.EventRecorder
61
+ recorder recorder.EventRecorder
62
+ dynamicClient dynamic.Interface
58
63
59
- options reconcilerParams
64
+ restMapper meta.RESTMapper
65
+ options reconcilerParams
60
66
}
61
67
62
68
type kubectlClient interface {
@@ -84,7 +90,19 @@ func (r *Reconciler) Init(mgr manager.Manager, prototype DeclarativeObject, opts
84
90
r .mgr = mgr
85
91
globalObjectTracker .mgr = mgr
86
92
87
- if err := r .applyOptions (opts ... ); err != nil {
93
+ d , err := dynamic .NewForConfig (r .config )
94
+ if err != nil {
95
+ return err
96
+ }
97
+ r .dynamicClient = d
98
+
99
+ restMapper , err := apiutil .NewDiscoveryRESTMapper (r .config )
100
+ if err != nil {
101
+ return err
102
+ }
103
+ r .restMapper = restMapper
104
+
105
+ if err = r .applyOptions (opts ... ); err != nil {
88
106
return err
89
107
}
90
108
@@ -184,6 +202,26 @@ func (r *Reconciler) reconcileExists(ctx context.Context, name types.NamespacedN
184
202
if err != nil {
185
203
return reconcile.Result {}, err
186
204
}
205
+
206
+ var newItems []* manifest.Object
207
+ for _ , obj := range objects .Items {
208
+
209
+ unstruct , err := getObjectFromCluster (obj , r )
210
+ if err != nil && ! apierrors .IsNotFound (err ) {
211
+ log .WithValues ("name" , obj .Name ).Error (err , "Unable to get resource" )
212
+ }
213
+ if unstruct != nil {
214
+ annotations := unstruct .GetAnnotations ()
215
+ if _ , ok := annotations ["addons.k8s.io/ignore" ]; ok {
216
+ log .WithValues ("kind" , obj .Kind ).WithValues ("name" , obj .Name ).Info ("Found ignore annotation on object, " +
217
+ "skipping object" )
218
+ continue
219
+ }
220
+ }
221
+ newItems = append (newItems , obj )
222
+ }
223
+ objects .Items = newItems
224
+
187
225
var manifestStr string
188
226
189
227
m , err := objects .JSONManifest ()
@@ -514,3 +552,21 @@ func parseListKind(infos *manifest.Objects) (*manifest.Objects, error) {
514
552
func (r * Reconciler ) CollectMetrics () bool {
515
553
return r .options .metrics
516
554
}
555
+
556
+ func getObjectFromCluster (obj * manifest.Object , r * Reconciler ) (* unstructured.
557
+ Unstructured , error ) {
558
+ getOptions := metav1.GetOptions {}
559
+ gvk := obj .GroupVersionKind ()
560
+
561
+ mapping , err := r .restMapper .RESTMapping (obj .GroupKind (), gvk .Version )
562
+ if err != nil {
563
+ return nil , fmt .Errorf ("unable to get resource: %v" , err )
564
+ }
565
+ ns := obj .UnstructuredObject ().GetNamespace ()
566
+ unstruct , err := r .dynamicClient .Resource (mapping .Resource ).Namespace (ns ).Get (context .Background (),
567
+ obj .Name , getOptions )
568
+ if err != nil {
569
+ return nil , fmt .Errorf ("unable to get mapping for resource: %v" , err )
570
+ }
571
+ return unstruct , nil
572
+ }
0 commit comments