From f5b6ff2832d8f9a8b2349150874d1c2d54a11c53 Mon Sep 17 00:00:00 2001 From: Adam Reese Date: Wed, 14 Nov 2018 11:05:14 -0800 Subject: [PATCH 1/2] ref(pkg/chart): rename files to be consistent with types Signed-off-by: Adam Reese --- pkg/chart/chart.go | 3 +++ pkg/chart/chartfile.go | 19 ------------------- pkg/chart/{requirements.go => dependency.go} | 0 3 files changed, 3 insertions(+), 19 deletions(-) delete mode 100644 pkg/chart/chartfile.go rename pkg/chart/{requirements.go => dependency.go} (100%) diff --git a/pkg/chart/chart.go b/pkg/chart/chart.go index d314104da..2a190f668 100644 --- a/pkg/chart/chart.go +++ b/pkg/chart/chart.go @@ -15,6 +15,9 @@ limitations under the License. package chart +// APIVersionv1 is the API version number for version 1. +const APIVersionv1 = "v1" + // Chart is a helm package that contains metadata, a default config, zero or more // optionally parameterizable templates, and zero or more charts (dependencies). type Chart struct { diff --git a/pkg/chart/chartfile.go b/pkg/chart/chartfile.go deleted file mode 100644 index 16ce46b8f..000000000 --- a/pkg/chart/chartfile.go +++ /dev/null @@ -1,19 +0,0 @@ -/* -Copyright The Helm Authors. -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package chart - -// APIVersionv1 is the API version number for version 1. -const APIVersionv1 = "v1" diff --git a/pkg/chart/requirements.go b/pkg/chart/dependency.go similarity index 100% rename from pkg/chart/requirements.go rename to pkg/chart/dependency.go From 9e1e26f01ebcea6f9afc614b1e60f7110497f651 Mon Sep 17 00:00:00 2001 From: Adam Reese Date: Wed, 14 Nov 2018 12:41:14 -0800 Subject: [PATCH 2/2] ref(pkg/chartutil): attempt to make requirements processing readable Signed-off-by: Adam Reese --- pkg/chartutil/requirements.go | 57 +++++++++++++++-------------------- pkg/chartutil/values.go | 57 ++++++++++++++++------------------- 2 files changed, 50 insertions(+), 64 deletions(-) diff --git a/pkg/chartutil/requirements.go b/pkg/chartutil/requirements.go index 2325176ed..3a003e1a3 100644 --- a/pkg/chartutil/requirements.go +++ b/pkg/chartutil/requirements.go @@ -205,29 +205,18 @@ func pathToMap(path string, data map[string]interface{}) map[string]interface{} if path == "." { return data } - ap := strings.Split(path, ".") - if len(ap) == 0 { + return set(parsePath(path), data) +} + +func set(path []string, data map[string]interface{}) map[string]interface{} { + if len(path) == 0 { return nil } - n := []map[string]interface{}{} - // created nested map for each key, adding to slice - for _, v := range ap { - nm := make(map[string]interface{}) - nm[v] = make(map[string]interface{}) - n = append(n, nm) - } - // find the last key (map) and set our data - for i, d := range n { - for k := range d { - z := i + 1 - if z == len(n) { - n[i][k] = data - break - } - n[i][k] = n[z] - } + cur := data + for i := len(path) - 1; i >= 0; i-- { + cur = map[string]interface{}{path[i]: cur} } - return n[0] + return cur } // processImportValues merges values from child to parent based on the chart's dependencies' ImportValues field. @@ -247,27 +236,29 @@ func processImportValues(c *chart.Chart) error { for _, riv := range r.ImportValues { switch iv := riv.(type) { case map[string]interface{}: - nm := map[string]string{ - "child": iv["child"].(string), - "parent": iv["parent"].(string), - } - outiv = append(outiv, nm) + child := iv["child"].(string) + parent := iv["parent"].(string) + + outiv = append(outiv, map[string]string{ + "child": child, + "parent": parent, + }) + // get child table - vv, err := cvals.Table(r.Name + "." + nm["child"]) + vv, err := cvals.Table(r.Name + "." + child) if err != nil { log.Printf("Warning: ImportValues missing table: %v", err) continue } // create value map from child to be merged into parent - vm := pathToMap(nm["parent"], vv.AsMap()) - b = coalesceTables(cvals, vm) + b = coalesceTables(cvals, pathToMap(parent, vv.AsMap())) case string: - nm := map[string]string{ - "child": "exports." + iv, + child := "exports." + iv + outiv = append(outiv, map[string]string{ + "child": child, "parent": ".", - } - outiv = append(outiv, nm) - vm, err := cvals.Table(r.Name + "." + nm["child"]) + }) + vm, err := cvals.Table(r.Name + "." + child) if err != nil { log.Printf("Warning: ImportValues missing table: %v", err) continue diff --git a/pkg/chartutil/values.go b/pkg/chartutil/values.go index d52a7a4d3..a2872dae9 100644 --- a/pkg/chartutil/values.go +++ b/pkg/chartutil/values.go @@ -62,7 +62,7 @@ func (v Values) Table(name string) (Values, error) { table := v var err error - for _, n := range strings.Split(name, ".") { + for _, n := range parsePath(name) { table, err = tableLookup(table, n) if err != nil { return table, err @@ -118,7 +118,7 @@ func ReadValues(data []byte) (vals Values, err error) { if len(vals) == 0 { vals = Values{} } - return + return vals, err } // ReadValuesFile will parse a YAML file into a map of values. @@ -240,11 +240,11 @@ func coalesceGlobals(dest, src map[string]interface{}) { } func copyMap(src map[string]interface{}) map[string]interface{} { - dest := make(map[string]interface{}, len(src)) + m := make(map[string]interface{}, len(src)) for k, v := range src { - dest[k] = v + m[k] = v } - return dest + return m } // coalesceValues builds up a values map for a particular chart. @@ -350,40 +350,35 @@ func istable(v interface{}) bool { // chapter: // one: // title: "Loomings" -func (v Values) PathValue(ypath string) (interface{}, error) { - if len(ypath) == 0 { - return nil, errors.New("YAML path string cannot be zero length") +func (v Values) PathValue(path string) (interface{}, error) { + if path == "" { + return nil, errors.New("YAML path cannot be empty") } - yps := strings.Split(ypath, ".") - if len(yps) == 1 { + return v.pathValue(parsePath(path)) +} + +func (v Values) pathValue(path []string) (interface{}, error) { + if len(path) == 1 { // if exists must be root key not table - vals := v.AsMap() - k := yps[0] - if _, ok := vals[k]; ok && !istable(vals[k]) { - // key found - return vals[yps[0]], nil + if _, ok := v[path[0]]; ok && !istable(v[path[0]]) { + return v[path[0]], nil } - // key not found - return nil, ErrNoValue(errors.Errorf("%v is not a value", k)) + return nil, ErrNoValue(errors.Errorf("%v is not a value", path[0])) } - // join all elements of YAML path except last to get string table path - ypsLen := len(yps) - table := yps[:ypsLen-1] - st := strings.Join(table, ".") - // get the last element as a string key - sk := yps[ypsLen-1:][0] + + key, path := path[len(path)-1], path[:len(path)-1] // get our table for table path - t, err := v.Table(st) + t, err := v.Table(joinPath(path...)) if err != nil { - //no table - return nil, ErrNoValue(errors.Errorf("%v is not a value", sk)) + return nil, ErrNoValue(errors.Errorf("%v is not a value", key)) } // check table for key and ensure value is not a table - if k, ok := t[sk]; ok && !istable(k) { - // key found + if k, ok := t[key]; ok && !istable(k) { return k, nil } - - // key not found - return nil, ErrNoValue(errors.Errorf("key not found: %s", sk)) + return nil, ErrNoValue(errors.Errorf("key not found: %s", key)) } + +func parsePath(key string) []string { return strings.Split(key, ".") } + +func joinPath(path ...string) string { return strings.Join(path, ".") }