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.
This commit is contained in:
parent
75a3cd2534
commit
d0f52766b3
3 changed files with 22 additions and 17 deletions
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
},
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue