From 8c93f7ba745a7cab77b4897cee294664de8b377e Mon Sep 17 00:00:00 2001 From: Nestor Date: Mon, 11 Feb 2019 09:37:41 +0100 Subject: [PATCH] add support for varref in maps values --- pkg/target/variableref_test.go | 69 ++++++++++++-- .../config/defaultconfig/varreference.go | 2 + pkg/transformers/refvars.go | 11 +++ pkg/transformers/refvars_test.go | 91 +++++++++++++++++++ 4 files changed, 163 insertions(+), 10 deletions(-) create mode 100644 pkg/transformers/refvars_test.go diff --git a/pkg/target/variableref_test.go b/pkg/target/variableref_test.go index 9d46030a4..a27c9ae9d 100644 --- a/pkg/target/variableref_test.go +++ b/pkg/target/variableref_test.go @@ -23,8 +23,6 @@ import ( func TestVariableRef(t *testing.T) { th := NewKustTestHarness(t, "/app/overlay/staging") th.writeK("/app/base", ` -apiVersion: kustomize.config.k8s.io/v1beta1 -kind: Kustomization namePrefix: base- resources: - cockroachdb-statefulset-secure.yaml @@ -323,8 +321,6 @@ spec: storage: 1Gi `) th.writeK("/app/overlay/staging", ` -apiVersion: kustomize.config.k8s.io/v1beta1 -kind: Kustomization namePrefix: dev- bases: - ../../base @@ -583,8 +579,6 @@ spec: func TestVariableRefIngress(t *testing.T) { th := NewKustTestHarness(t, "/app/overlay") th.writeK("/app/base", ` -apiVersion: kustomize.config.k8s.io/v1beta1 -kind: Kustomization resources: - deployment.yaml - ingress.yaml @@ -657,8 +651,6 @@ spec: targetPort: http `) th.writeK("/app/overlay", ` -apiVersion: kustomize.config.k8s.io/v1beta1 -kind: Kustomization nameprefix: kustomized- bases: - ../base @@ -727,8 +719,6 @@ spec: func TestVariableRefMounthPath(t *testing.T) { th := NewKustTestHarness(t, "/app/base") th.writeK("/app/base", ` -apiVersion: kustomize.config.k8s.io/v1beta1 -kind: Kustomization resources: - deployment.yaml - namespace.yaml @@ -800,3 +790,62 @@ spec: name: my-volume `) } + +func TestVariableRefMaps(t *testing.T) { + th := NewKustTestHarness(t, "/app/base") + th.writeK("/app/base", ` +resources: +- deployment.yaml +- namespace.yaml +vars: +- name: NAMESPACE + objref: + apiVersion: v1 + kind: Namespace + name: my-namespace +`) + th.writeF("/app/base/deployment.yaml", ` + apiVersion: apps/v1 + kind: Deployment + metadata: + name: my-deployment + labels: + my-label: $(NAMESPACE) + spec: + template: + spec: + containers: + - name: app + image: busybox +`) + th.writeF("/app/base/namespace.yaml", ` + apiVersion: v1 + kind: Namespace + metadata: + name: my-namespace +`) + + m, err := th.makeKustTarget().MakeCustomizedResMap() + if err != nil { + t.Fatalf("Err: %v", err) + } + th.assertActualEqualsExpected(m, ` +apiVersion: v1 +kind: Namespace +metadata: + name: my-namespace +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + my-label: my-namespace + name: my-deployment +spec: + template: + spec: + containers: + - image: busybox + name: app +`) +} diff --git a/pkg/transformers/config/defaultconfig/varreference.go b/pkg/transformers/config/defaultconfig/varreference.go index 068d83fd8..d83a43ad6 100644 --- a/pkg/transformers/config/defaultconfig/varreference.go +++ b/pkg/transformers/config/defaultconfig/varreference.go @@ -147,5 +147,7 @@ varReference: - path: spec/template/spec/initContainers/volumeMounts/mountPath kind: Deployment + +- path: metadata/labels ` ) diff --git a/pkg/transformers/refvars.go b/pkg/transformers/refvars.go index 1d35c9602..cace71f16 100644 --- a/pkg/transformers/refvars.go +++ b/pkg/transformers/refvars.go @@ -39,6 +39,17 @@ func (rv *refvarTransformer) replaceVars(in interface{}) (interface{}, error) { xs = append(xs, expansion.Expand(a.(string), rv.mappingFunc)) } return xs, nil + case map[string]interface{}: + inMap := in.(map[string]interface{}) + xs := make(map[string]interface{}, len(inMap)) + for k, v := range inMap { + s, ok := v.(string) + if !ok { + return nil, fmt.Errorf("%#v is expected to be %T", v, s) + } + xs[k] = expansion.Expand(s, rv.mappingFunc) + } + return xs, nil case interface{}: s, ok := in.(string) if !ok { diff --git a/pkg/transformers/refvars_test.go b/pkg/transformers/refvars_test.go new file mode 100644 index 000000000..fd2e9695b --- /dev/null +++ b/pkg/transformers/refvars_test.go @@ -0,0 +1,91 @@ +package transformers + +import ( + "reflect" + "testing" + + "sigs.k8s.io/kustomize/pkg/resid" + + "sigs.k8s.io/kustomize/pkg/resmap" + "sigs.k8s.io/kustomize/pkg/transformers/config" +) + +func TestVarRef(t *testing.T) { + type given struct { + varMap map[string]string + fs []config.FieldSpec + res resmap.ResMap + } + type expected struct { + res resmap.ResMap + } + testCases := []struct { + description string + given given + expected expected + }{ + { + description: "var replacement in map[string]", + given: given{ + varMap: map[string]string{ + "FOO": "BAR", + }, + fs: []config.FieldSpec{ + {Gvk: cmap, Path: "data"}, + }, + res: resmap.ResMap{ + resid.NewResId(cmap, "cm1"): rf.FromMap( + map[string]interface{}{ + "apiVersion": "v1", + "kind": "ConfigMap", + "metadata": map[string]interface{}{ + "name": "cm1", + }, + "data": map[string]interface{}{ + "item1": "$(FOO)", + "item2": "bla", + }, + }), + }, + }, + expected: expected{ + res: resmap.ResMap{ + resid.NewResId(cmap, "cm1"): rf.FromMap( + map[string]interface{}{ + "apiVersion": "v1", + "kind": "ConfigMap", + "metadata": map[string]interface{}{ + "name": "cm1", + }, + "data": map[string]interface{}{ + "item1": "BAR", + "item2": "bla", + }, + }), + }, + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.description, func(t *testing.T) { + // arrange + tr := NewRefVarTransformer(tc.given.varMap, tc.given.fs) + + // act + err := tr.Transform(tc.given.res) + + // assert + if err != nil { + t.Errorf("unexpected error: %v", err) + } + + a, e := tc.given.res, tc.expected.res + if !reflect.DeepEqual(a, e) { + err = e.ErrorIfNotEqual(a) + t.Fatalf("actual doesn't match expected: \nACTUAL:\n%v\nEXPECTED:\n%v\nERR: %v", a, e, err) + } + + }) + } +}