mirror of https://github.com/helm/helm.git
				
				
				
			feat(pkg/engine): expose subcharts scope in parent
Expose the scope (.Values, .Charts, .Releases etc.) of subcharts to the parent scope. Signed-off-by: Valentin Flaux <vflaux@oui.sncf>
This commit is contained in:
		
							parent
							
								
									433b90c4b6
								
							
						
					
					
						commit
						3daaea0a1c
					
				|  | @ -260,6 +260,7 @@ func (e Engine) renderWithReferences(tpls, referenceTpls map[string]renderable) | |||
| 		if err := t.ExecuteTemplate(&buf, filename, vals); err != nil { | ||||
| 			return map[string]string{}, cleanupExecError(filename, err) | ||||
| 		} | ||||
| 		delete(vals, "Template") | ||||
| 
 | ||||
| 		// Work around the issue where Go will emit "<no value>" even if Options(missing=zero)
 | ||||
| 		// is set. Since missing=error will never get here, we do not need to handle
 | ||||
|  | @ -344,13 +345,15 @@ func allTemplates(c *chart.Chart, vals chartutil.Values) map[string]renderable { | |||
| //
 | ||||
| // As it recurses, it also sets the values to be appropriate for the template
 | ||||
| // scope.
 | ||||
| func recAllTpls(c *chart.Chart, templates map[string]renderable, vals chartutil.Values) { | ||||
| func recAllTpls(c *chart.Chart, templates map[string]renderable, vals chartutil.Values) map[string]interface{} { | ||||
| 	subCharts := make(map[string]interface{}) | ||||
| 	next := map[string]interface{}{ | ||||
| 		"Chart":        c.Metadata, | ||||
| 		"Files":        newFiles(c.Files), | ||||
| 		"Release":      vals["Release"], | ||||
| 		"Capabilities": vals["Capabilities"], | ||||
| 		"Values":       make(chartutil.Values), | ||||
| 		"Subcharts":    subCharts, | ||||
| 	} | ||||
| 
 | ||||
| 	// If there is a {{.Values.ThisChart}} in the parent metadata,
 | ||||
|  | @ -362,7 +365,7 @@ func recAllTpls(c *chart.Chart, templates map[string]renderable, vals chartutil. | |||
| 	} | ||||
| 
 | ||||
| 	for _, child := range c.Dependencies() { | ||||
| 		recAllTpls(child, templates, next) | ||||
| 		subCharts[child.Name()] = recAllTpls(child, templates, next) | ||||
| 	} | ||||
| 
 | ||||
| 	newParentID := c.ChartFullPath() | ||||
|  | @ -376,6 +379,8 @@ func recAllTpls(c *chart.Chart, templates map[string]renderable, vals chartutil. | |||
| 			basePath: path.Join(newParentID, "templates"), | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return next | ||||
| } | ||||
| 
 | ||||
| // isTemplateValid returns true if the template is valid for the chart type
 | ||||
|  |  | |||
|  | @ -384,6 +384,8 @@ func TestRenderNestedValues(t *testing.T) { | |||
| 	// Ensure namespacing rules are working.
 | ||||
| 	deepestpath := "templates/inner.tpl" | ||||
| 	checkrelease := "templates/release.tpl" | ||||
| 	// Ensure subcharts scopes are working.
 | ||||
| 	subchartspath := "templates/subcharts.tpl" | ||||
| 
 | ||||
| 	deepest := &chart.Chart{ | ||||
| 		Metadata: &chart.Metadata{Name: "deepest"}, | ||||
|  | @ -391,7 +393,7 @@ func TestRenderNestedValues(t *testing.T) { | |||
| 			{Name: deepestpath, Data: []byte(`And this same {{.Values.what}} that smiles {{.Values.global.when}}`)}, | ||||
| 			{Name: checkrelease, Data: []byte(`Tomorrow will be {{default "happy" .Release.Name }}`)}, | ||||
| 		}, | ||||
| 		Values: map[string]interface{}{"what": "milkshake"}, | ||||
| 		Values: map[string]interface{}{"what": "milkshake", "where": "here"}, | ||||
| 	} | ||||
| 
 | ||||
| 	inner := &chart.Chart{ | ||||
|  | @ -399,7 +401,7 @@ func TestRenderNestedValues(t *testing.T) { | |||
| 		Templates: []*chart.File{ | ||||
| 			{Name: innerpath, Data: []byte(`Old {{.Values.who}} is still a-flyin'`)}, | ||||
| 		}, | ||||
| 		Values: map[string]interface{}{"who": "Robert"}, | ||||
| 		Values: map[string]interface{}{"who": "Robert", "what": "glasses"}, | ||||
| 	} | ||||
| 	inner.AddDependency(deepest) | ||||
| 
 | ||||
|  | @ -407,12 +409,14 @@ func TestRenderNestedValues(t *testing.T) { | |||
| 		Metadata: &chart.Metadata{Name: "top"}, | ||||
| 		Templates: []*chart.File{ | ||||
| 			{Name: outerpath, Data: []byte(`Gather ye {{.Values.what}} while ye may`)}, | ||||
| 			{Name: subchartspath, Data: []byte(`The glorious Lamp of {{.Subcharts.herrick.Subcharts.deepest.Values.where}}, the {{.Subcharts.herrick.Values.what}}`)}, | ||||
| 		}, | ||||
| 		Values: map[string]interface{}{ | ||||
| 			"what": "stinkweed", | ||||
| 			"who":  "me", | ||||
| 			"herrick": map[string]interface{}{ | ||||
| 				"who": "time", | ||||
| 				"who":  "time", | ||||
| 				"what": "Sun", | ||||
| 			}, | ||||
| 		}, | ||||
| 	} | ||||
|  | @ -422,7 +426,8 @@ func TestRenderNestedValues(t *testing.T) { | |||
| 		"what": "rosebuds", | ||||
| 		"herrick": map[string]interface{}{ | ||||
| 			"deepest": map[string]interface{}{ | ||||
| 				"what": "flower", | ||||
| 				"what":  "flower", | ||||
| 				"where": "Heaven", | ||||
| 			}, | ||||
| 		}, | ||||
| 		"global": map[string]interface{}{ | ||||
|  | @ -469,6 +474,11 @@ func TestRenderNestedValues(t *testing.T) { | |||
| 	if out[fullcheckrelease] != "Tomorrow will be dyin" { | ||||
| 		t.Errorf("Unexpected release: %q", out[fullcheckrelease]) | ||||
| 	} | ||||
| 
 | ||||
| 	fullchecksubcharts := "top/" + subchartspath | ||||
| 	if out[fullchecksubcharts] != "The glorious Lamp of Heaven, the Sun" { | ||||
| 		t.Errorf("Unexpected subcharts: %q", out[fullchecksubcharts]) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func TestRenderBuiltinValues(t *testing.T) { | ||||
|  | @ -488,6 +498,7 @@ func TestRenderBuiltinValues(t *testing.T) { | |||
| 		Metadata: &chart.Metadata{Name: "Troy"}, | ||||
| 		Templates: []*chart.File{ | ||||
| 			{Name: "templates/Aeneas", Data: []byte(`{{.Template.Name}}{{.Chart.Name}}{{.Release.Name}}`)}, | ||||
| 			{Name: "templates/Amata", Data: []byte(`{{.Subcharts.Latium.Chart.Name}} {{.Subcharts.Latium.Files.author | printf "%s"}}`)}, | ||||
| 		}, | ||||
| 	} | ||||
| 	outer.AddDependency(inner) | ||||
|  | @ -510,6 +521,7 @@ func TestRenderBuiltinValues(t *testing.T) { | |||
| 	expects := map[string]string{ | ||||
| 		"Troy/charts/Latium/templates/Lavinia": "Troy/charts/Latium/templates/LaviniaLatiumAeneid", | ||||
| 		"Troy/templates/Aeneas":                "Troy/templates/AeneasTroyAeneid", | ||||
| 		"Troy/templates/Amata":                 "Latium Virgil", | ||||
| 		"Troy/charts/Latium/templates/From":    "Virgil Aeneid", | ||||
| 	} | ||||
| 	for file, expect := range expects { | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue