From d0f52766b35a9ccccb131fbbb33f6398ea6042d2 Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Wed, 4 Sep 2019 10:56:07 +0100 Subject: fix(context): Ensure resource set paths are made absolute Resolving of files (for `insertFile` and `insertTemplate`) should always be relative to the resource set location, the previous behaviour was considered a bug. This is fixed by ensuring that resource set paths are absolute at context loading time. --- context/context.go | 12 +++++++++--- context/context_test.go | 18 +++++++++--------- 2 files changed, 18 insertions(+), 12 deletions(-) (limited to 'context') diff --git a/context/context.go b/context/context.go index 314fc3584545..262e8c948035 100644 --- a/context/context.go +++ b/context/context.go @@ -77,7 +77,7 @@ func LoadContext(filename string, explicitVars *[]string) (*Context, error) { ctx.BaseDir = path.Dir(filename) // Prepare the resource sets by resolving parents etc. - ctx.ResourceSets = flattenPrepareResourceSetPaths(&ctx.ResourceSets) + ctx.ResourceSets = flattenPrepareResourceSetPaths(&ctx.BaseDir, &ctx.ResourceSets) // Add variables explicitly specified on the command line ctx.ExplicitVars, err = loadExplicitVars(explicitVars) @@ -136,7 +136,7 @@ func (ctx *Context) loadImportedVariables() (map[string]interface{}, error) { // collections, i.e. resource sets that themselves have an additional 'include' field set. // Those will be regarded as a short-hand for including multiple resource sets from a subfolder. // See https://github.com/tazjin/kontemplate/issues/9 for more information. -func flattenPrepareResourceSetPaths(rs *[]ResourceSet) []ResourceSet { +func flattenPrepareResourceSetPaths(baseDir *string, rs *[]ResourceSet) []ResourceSet { flattened := make([]ResourceSet, 0) for _, r := range *rs { @@ -146,6 +146,12 @@ func flattenPrepareResourceSetPaths(rs *[]ResourceSet) []ResourceSet { r.Path = r.Name } + // Paths are made absolute by resolving them relative to the context base, + // unless absolute paths were specified. + if !path.IsAbs(r.Path) { + r.Path = path.Join(*baseDir, r.Path) + } + if len(r.Include) == 0 { flattened = append(flattened, r) } else { @@ -225,7 +231,7 @@ func loadDefaultValues(rs *ResourceSet, c *Context) *map[string]interface{} { var defaultVars map[string]interface{} for _, filename := range util.DefaultFilenames { - err := util.LoadData(path.Join(c.BaseDir, rs.Path, filename), &defaultVars) + err := util.LoadData(path.Join(rs.Path, filename), &defaultVars) if err == nil { return &defaultVars } diff --git a/context/context_test.go b/context/context_test.go index d7fdc11e5718..5d6164585cb2 100644 --- a/context/context_test.go +++ b/context/context_test.go @@ -32,7 +32,7 @@ func TestLoadFlatContextFromFile(t *testing.T) { ResourceSets: []ResourceSet{ { Name: "some-api", - Path: "some-api", + Path: "testdata/some-api", Values: map[string]interface{}{ "apiPort": float64(4567), // yep! "importantFeature": true, @@ -67,7 +67,7 @@ func TestLoadContextWithArgs(t *testing.T) { ResourceSets: []ResourceSet{ { Name: "some-api", - Path: "some-api", + Path: "testdata/some-api", Values: make(map[string]interface{}, 0), Args: []string{ "--as=some-user", @@ -106,7 +106,7 @@ func TestLoadContextWithResourceSetCollections(t *testing.T) { ResourceSets: []ResourceSet{ { Name: "some-api", - Path: "some-api", + Path: "testdata/some-api", Values: map[string]interface{}{ "apiPort": float64(4567), // yep! "importantFeature": true, @@ -118,7 +118,7 @@ func TestLoadContextWithResourceSetCollections(t *testing.T) { }, { Name: "collection/nested", - Path: "collection/nested", + Path: "testdata/collection/nested", Values: map[string]interface{}{ "lizards": "good", "globalVar": "lizards", @@ -152,7 +152,7 @@ func TestSubresourceVariableInheritance(t *testing.T) { ResourceSets: []ResourceSet{ { Name: "parent/child", - Path: "parent/child", + Path: "testdata/parent/child", Values: map[string]interface{}{ "foo": "bar", "bar": "baz", @@ -185,7 +185,7 @@ func TestSubresourceVariableInheritanceOverride(t *testing.T) { ResourceSets: []ResourceSet{ { Name: "parent/child", - Path: "parent/child", + Path: "testdata/parent/child", Values: map[string]interface{}{ "foo": "newvalue", }, @@ -256,7 +256,7 @@ func TestExplicitPathLoading(t *testing.T) { ResourceSets: []ResourceSet{ { Name: "some-api-europe", - Path: "some-api", + Path: "testdata/some-api", Values: map[string]interface{}{ "location": "europe", }, @@ -265,7 +265,7 @@ func TestExplicitPathLoading(t *testing.T) { }, { Name: "some-api-asia", - Path: "some-api", + Path: "testdata/some-api", Values: map[string]interface{}{ "location": "asia", }, @@ -296,7 +296,7 @@ func TestExplicitSubresourcePathLoading(t *testing.T) { ResourceSets: []ResourceSet{ { Name: "parent/child", - Path: "parent-path/child-path", + Path: "testdata/parent-path/child-path", Parent: "parent", Values: make(map[string]interface{}, 0), }, -- cgit 1.4.1