Skip to content

Commit eea60d7

Browse files
authored
Merge pull request #111 from SomtochiAma/stop-recon-cluster
Checks for annotation for objects in-cluster
2 parents 3048457 + 0e3e778 commit eea60d7

File tree

1 file changed

+59
-3
lines changed

1 file changed

+59
-3
lines changed

pkg/patterns/declarative/reconciler.go

Lines changed: 59 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ import (
2323
"path/filepath"
2424
"strings"
2525

26+
"k8s.io/apimachinery/pkg/api/meta"
27+
28+
"k8s.io/client-go/dynamic"
29+
2630
apierrors "k8s.io/apimachinery/pkg/api/errors"
2731
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2832
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
@@ -54,9 +58,11 @@ type Reconciler struct {
5458
mgr manager.Manager
5559

5660
// recorder is the EventRecorder for creating k8s events
57-
recorder recorder.EventRecorder
61+
recorder recorder.EventRecorder
62+
dynamicClient dynamic.Interface
5863

59-
options reconcilerParams
64+
restMapper meta.RESTMapper
65+
options reconcilerParams
6066
}
6167

6268
type kubectlClient interface {
@@ -84,7 +90,19 @@ func (r *Reconciler) Init(mgr manager.Manager, prototype DeclarativeObject, opts
8490
r.mgr = mgr
8591
globalObjectTracker.mgr = mgr
8692

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 {
88106
return err
89107
}
90108

@@ -184,6 +202,26 @@ func (r *Reconciler) reconcileExists(ctx context.Context, name types.NamespacedN
184202
if err != nil {
185203
return reconcile.Result{}, err
186204
}
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+
187225
var manifestStr string
188226

189227
m, err := objects.JSONManifest()
@@ -514,3 +552,21 @@ func parseListKind(infos *manifest.Objects) (*manifest.Objects, error) {
514552
func (r *Reconciler) CollectMetrics() bool {
515553
return r.options.metrics
516554
}
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

Comments
 (0)