From 0147c3e13e741f1d2bac7f082e509222fb86ab38 Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Tue, 14 Feb 2017 19:00:06 +0100 Subject: feat ctx: Let sub-resource-sets inherit vars from parent Users of kontemplate may expect variables defined on the parent resource to be inherited by children. This implements that functionality. Values defined twice are overwritten by the child's definition. Fixes #20 --- context/context.go | 2 + context/context_test.go | 59 ++++++++++++++++++++++++++ context/testdata/parent-variable-override.yaml | 10 +++++ context/testdata/parent-variables.yaml | 10 +++++ 4 files changed, 81 insertions(+) create mode 100644 context/testdata/parent-variable-override.yaml create mode 100644 context/testdata/parent-variables.yaml (limited to 'context') diff --git a/context/context.go b/context/context.go index 108bda28a90d..520070d88f67 100644 --- a/context/context.go +++ b/context/context.go @@ -9,6 +9,7 @@ import ( "github.com/ghodss/yaml" "github.com/polydawn/meep" + "github.com/tazjin/kontemplate/util" ) type ResourceSet struct { @@ -82,6 +83,7 @@ func flattenResourceSetCollections(rs *[]ResourceSet) *[]ResourceSet { for _, subResourceSet := range r.Include { subResourceSet.Parent = r.Name subResourceSet.Name = path.Join(r.Name, subResourceSet.Name) + subResourceSet.Values = *util.Merge(&r.Values, &subResourceSet.Values) flattened = append(flattened, subResourceSet) } } diff --git a/context/context_test.go b/context/context_test.go index b34222ed4650..66b857ffe822 100644 --- a/context/context_test.go +++ b/context/context_test.go @@ -81,3 +81,62 @@ func TestLoadContextWithResourceSetCollections(t *testing.T) { } } + +func TestSubresourceVariableInheritance(t *testing.T) { + ctx, err := LoadContextFromFile("testdata/parent-variables.yaml") + + if err != nil { + t.Error(err) + t.Fail() + } + + expected := Context{ + Name: "k8s.prod.mydomain.com", + ResourceSets: []ResourceSet{ + { + Name: "parent/child", + Values: map[string]interface{}{ + "foo": "bar", + "bar": "baz", + }, + Include: nil, + Parent: "parent", + }, + }, + BaseDir: "testdata", + } + + if !reflect.DeepEqual(*ctx, expected) { + t.Error("Loaded and expected context did not match") + t.Fail() + } +} + +func TestSubresourceVariableInheritanceOverride(t *testing.T) { + ctx, err := LoadContextFromFile("testdata/parent-variable-override.yaml") + + if err != nil { + t.Error(err) + t.Fail() + } + + expected := Context{ + Name: "k8s.prod.mydomain.com", + ResourceSets: []ResourceSet{ + { + Name: "parent/child", + Values: map[string]interface{}{ + "foo": "newvalue", + }, + Include: nil, + Parent: "parent", + }, + }, + BaseDir: "testdata", + } + + if !reflect.DeepEqual(*ctx, expected) { + t.Error("Loaded and expected context did not match") + t.Fail() + } +} diff --git a/context/testdata/parent-variable-override.yaml b/context/testdata/parent-variable-override.yaml new file mode 100644 index 000000000000..42676c3028fe --- /dev/null +++ b/context/testdata/parent-variable-override.yaml @@ -0,0 +1,10 @@ +--- +context: k8s.prod.mydomain.com +include: + - name: parent + values: + foo: bar + include: + - name: child + values: + foo: newvalue diff --git a/context/testdata/parent-variables.yaml b/context/testdata/parent-variables.yaml new file mode 100644 index 000000000000..8459fd30405b --- /dev/null +++ b/context/testdata/parent-variables.yaml @@ -0,0 +1,10 @@ +--- +context: k8s.prod.mydomain.com +include: + - name: parent + values: + foo: bar + include: + - name: child + values: + bar: baz -- cgit 1.4.1