From 8bf98dd255c538898728c47f186a4d595e376b26 Mon Sep 17 00:00:00 2001 From: Phillip Wittrock Date: Tue, 29 Oct 2019 16:41:45 -0700 Subject: [PATCH] Support for ignoring specific Resources via annotation. Resources annotated with `config.kubernetes.io/local-config` will be ignored by Kustomize --- api/k8sdeps/kunstruct/factory.go | 20 +++++++++++++++++++- api/k8sdeps/kunstruct/factory_test.go | 19 +++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/api/k8sdeps/kunstruct/factory.go b/api/k8sdeps/kunstruct/factory.go index 36e24aea0..ee3cd4597 100644 --- a/api/k8sdeps/kunstruct/factory.go +++ b/api/k8sdeps/kunstruct/factory.go @@ -52,7 +52,9 @@ func (kf *KunstructuredFactoryImpl) SliceFromBytes( if err != nil { return nil, err } - result = append(result, &UnstructAdapter{Unstructured: out}) + if !kf.skipResource(out) { + result = append(result, &UnstructAdapter{Unstructured: out}) + } } } if err != io.EOF { @@ -116,6 +118,22 @@ func (kf *KunstructuredFactoryImpl) validate(u unstructured.Unstructured) error return nil } +// nonKustomizableResourceAnnotation if set on a Resource will cause Kustomize to +// ignore the Resource rather than Kustomize it. +const ignoredByKustomizeResourceAnnotation = "config.kubernetes.io/local-config" + +// skipResource returns true if the Resource should not be accumulated +func (kf *KunstructuredFactoryImpl) skipResource(u unstructured.Unstructured) bool { + an := u.GetAnnotations() + if an == nil { + // annotation unset + return false + } + // check if the Resource has opt-ed out of kustomize + _, found := an[ignoredByKustomizeResourceAnnotation] + return found +} + func checkListItemNil(in interface{}) (bool, string) { switch v := in.(type) { case map[string]interface{}: diff --git a/api/k8sdeps/kunstruct/factory_test.go b/api/k8sdeps/kunstruct/factory_test.go index b52a73a35..97d2203b7 100644 --- a/api/k8sdeps/kunstruct/factory_test.go +++ b/api/k8sdeps/kunstruct/factory_test.go @@ -105,6 +105,25 @@ metadata: expectedOut: []ifc.Kunstructured{testConfigMap, testConfigMap}, expectedErr: false, }, + { + name: "localConfigYaml", + input: []byte(` +apiVersion: v1 +kind: ConfigMap +metadata: + name: winnie-skip + annotations: + # this annotation causes the Resource to be ignored by kustomize + config.kubernetes.io/local-config: "" +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: winnie +`), + expectedOut: []ifc.Kunstructured{testConfigMap}, + expectedErr: false, + }, { name: "garbageInOneOfTwoObjects", input: []byte(`