ref(pkg/chartutil): attempt to make requirements processing readable

Signed-off-by: Adam Reese <adam@reese.io>
pull/4920/head
Adam Reese 7 years ago
parent f5b6ff2832
commit 9e1e26f01e
No known key found for this signature in database
GPG Key ID: 06F35E60A7A18DD6

@ -205,29 +205,18 @@ func pathToMap(path string, data map[string]interface{}) map[string]interface{}
if path == "." { if path == "." {
return data return data
} }
ap := strings.Split(path, ".") return set(parsePath(path), data)
if len(ap) == 0 { }
func set(path []string, data map[string]interface{}) map[string]interface{} {
if len(path) == 0 {
return nil return nil
} }
n := []map[string]interface{}{} cur := data
// created nested map for each key, adding to slice for i := len(path) - 1; i >= 0; i-- {
for _, v := range ap { cur = map[string]interface{}{path[i]: cur}
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]
}
} }
return n[0] return cur
} }
// processImportValues merges values from child to parent based on the chart's dependencies' ImportValues field. // 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 { for _, riv := range r.ImportValues {
switch iv := riv.(type) { switch iv := riv.(type) {
case map[string]interface{}: case map[string]interface{}:
nm := map[string]string{ child := iv["child"].(string)
"child": iv["child"].(string), parent := iv["parent"].(string)
"parent": iv["parent"].(string),
} outiv = append(outiv, map[string]string{
outiv = append(outiv, nm) "child": child,
"parent": parent,
})
// get child table // get child table
vv, err := cvals.Table(r.Name + "." + nm["child"]) vv, err := cvals.Table(r.Name + "." + child)
if err != nil { if err != nil {
log.Printf("Warning: ImportValues missing table: %v", err) log.Printf("Warning: ImportValues missing table: %v", err)
continue continue
} }
// create value map from child to be merged into parent // create value map from child to be merged into parent
vm := pathToMap(nm["parent"], vv.AsMap()) b = coalesceTables(cvals, pathToMap(parent, vv.AsMap()))
b = coalesceTables(cvals, vm)
case string: case string:
nm := map[string]string{ child := "exports." + iv
"child": "exports." + iv, outiv = append(outiv, map[string]string{
"child": child,
"parent": ".", "parent": ".",
} })
outiv = append(outiv, nm) vm, err := cvals.Table(r.Name + "." + child)
vm, err := cvals.Table(r.Name + "." + nm["child"])
if err != nil { if err != nil {
log.Printf("Warning: ImportValues missing table: %v", err) log.Printf("Warning: ImportValues missing table: %v", err)
continue continue

@ -62,7 +62,7 @@ func (v Values) Table(name string) (Values, error) {
table := v table := v
var err error var err error
for _, n := range strings.Split(name, ".") { for _, n := range parsePath(name) {
table, err = tableLookup(table, n) table, err = tableLookup(table, n)
if err != nil { if err != nil {
return table, err return table, err
@ -118,7 +118,7 @@ func ReadValues(data []byte) (vals Values, err error) {
if len(vals) == 0 { if len(vals) == 0 {
vals = Values{} vals = Values{}
} }
return return vals, err
} }
// ReadValuesFile will parse a YAML file into a map of values. // 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{} { 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 { 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. // coalesceValues builds up a values map for a particular chart.
@ -350,40 +350,35 @@ func istable(v interface{}) bool {
// chapter: // chapter:
// one: // one:
// title: "Loomings" // title: "Loomings"
func (v Values) PathValue(ypath string) (interface{}, error) { func (v Values) PathValue(path string) (interface{}, error) {
if len(ypath) == 0 { if path == "" {
return nil, errors.New("YAML path string cannot be zero length") return nil, errors.New("YAML path cannot be empty")
} }
yps := strings.Split(ypath, ".") return v.pathValue(parsePath(path))
if len(yps) == 1 { }
func (v Values) pathValue(path []string) (interface{}, error) {
if len(path) == 1 {
// if exists must be root key not table // if exists must be root key not table
vals := v.AsMap() if _, ok := v[path[0]]; ok && !istable(v[path[0]]) {
k := yps[0] return v[path[0]], nil
if _, ok := vals[k]; ok && !istable(vals[k]) {
// key found
return vals[yps[0]], nil
} }
// key not found return nil, ErrNoValue(errors.Errorf("%v is not a value", path[0]))
return nil, ErrNoValue(errors.Errorf("%v is not a value", k))
} }
// join all elements of YAML path except last to get string table path
ypsLen := len(yps) key, path := path[len(path)-1], path[:len(path)-1]
table := yps[:ypsLen-1]
st := strings.Join(table, ".")
// get the last element as a string key
sk := yps[ypsLen-1:][0]
// get our table for table path // get our table for table path
t, err := v.Table(st) t, err := v.Table(joinPath(path...))
if err != nil { if err != nil {
//no table return nil, ErrNoValue(errors.Errorf("%v is not a value", key))
return nil, ErrNoValue(errors.Errorf("%v is not a value", sk))
} }
// check table for key and ensure value is not a table // check table for key and ensure value is not a table
if k, ok := t[sk]; ok && !istable(k) { if k, ok := t[key]; ok && !istable(k) {
// key found
return k, nil return k, nil
} }
return nil, ErrNoValue(errors.Errorf("key not found: %s", key))
// key not found
return nil, ErrNoValue(errors.Errorf("key not found: %s", sk))
} }
func parsePath(key string) []string { return strings.Split(key, ".") }
func joinPath(path ...string) string { return strings.Join(path, ".") }

Loading…
Cancel
Save