From 11cfc80020010ff949de767698124cc5719361e0 Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Tue, 4 Apr 2017 14:28:22 +0200 Subject: feat context: Support resource set default values This adds functionality to specify default values directly in resource sets. The idea is that users can create a file called `values.yaml` or `values.json` in a resource set's folder and have all variables specified in that file be automatically merged into the resource set variables with the lowest priority. This fixes #25 This fixes #30 (to a degree) --- context/context.go | 46 +++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 43 insertions(+), 3 deletions(-) (limited to 'context/context.go') diff --git a/context/context.go b/context/context.go index 520070d88f67..ad3d00693b95 100644 --- a/context/context.go +++ b/context/context.go @@ -64,8 +64,9 @@ func LoadContextFromFile(filename string) (*Context, error) { ) } - c.ResourceSets = *flattenResourceSetCollections(&c.ResourceSets) + c.ResourceSets = flattenResourceSetCollections(&c.ResourceSets) c.BaseDir = path.Dir(filename) + c.ResourceSets = loadAllDefaultValues(&c) return &c, nil } @@ -73,7 +74,7 @@ func LoadContextFromFile(filename string) (*Context, error) { // Flattens resource set 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 flattenResourceSetCollections(rs *[]ResourceSet) *[]ResourceSet { +func flattenResourceSetCollections(rs *[]ResourceSet) []ResourceSet { flattened := make([]ResourceSet, 0) for _, r := range *rs { @@ -89,5 +90,44 @@ func flattenResourceSetCollections(rs *[]ResourceSet) *[]ResourceSet { } } - return &flattened + return flattened +} + +func loadAllDefaultValues(c *Context) []ResourceSet { + updated := make([]ResourceSet, len(c.ResourceSets)) + + for i, rs := range c.ResourceSets { + merged := loadDefaultValues(&rs, c) + rs.Values = *merged + updated[i] = rs + } + + return updated +} + +// Loads and merges default values for a resource set collection from path/to/set/default.{json|yaml}. +// YAML takes precedence over JSON. +// Default values in resource set collections have the lowest priority possible. +func loadDefaultValues(rs *ResourceSet, c *Context) *map[string]interface{} { + var defaultVars map[string]interface{} + + // Attempt to load YAML values + y, err := ioutil.ReadFile(path.Join(c.BaseDir, rs.Name, "default.yaml")) + if err == nil { + yaml.Unmarshal(y, &defaultVars) + return util.Merge(&defaultVars, &rs.Values) + } + + // Attempt to load JSON values + j, err := ioutil.ReadFile(path.Join(c.BaseDir, rs.Name, "default.json")) + if err == nil { + json.Unmarshal(j, &defaultVars) + return util.Merge(&defaultVars, &rs.Values) + } + + // The actual error is not inspected here. The reasoning for this is that in case of serious problems (e.g. + // permission issues with the folder / folder not existing) failure will occur a bit later anyways. + // Otherwise we'd have to differentiate between file-not-found-errors (no default values specified) and other + // errors here. + return &rs.Values } -- cgit 1.4.1