parent
							
								
									6c89fac8e5
								
							
						
					
					
						commit
						d609dab848
					
				
							
								
								
									
										5
									
								
								main.go
								
								
								
								
							
							
						
						
									
										5
									
								
								main.go
								
								
								
								
							|  | @ -476,7 +476,9 @@ func loadDesiredStateFromFile(c *cli.Context, file string) (*state.HelmState, he | |||
| 	namespace := c.GlobalString("namespace") | ||||
| 	labels := c.GlobalStringSlice("selector") | ||||
| 
 | ||||
| 	st, err := state.ReadFromFile(file) | ||||
| 	logger := c.App.Metadata["logger"].(*zap.SugaredLogger) | ||||
| 
 | ||||
| 	st, err := state.CreateFromFile(file, logger) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, false, fmt.Errorf("failed to read %s: %v", file, err) | ||||
| 	} | ||||
|  | @ -514,7 +516,6 @@ func loadDesiredStateFromFile(c *cli.Context, file string) (*state.HelmState, he | |||
| 		clean(st, errs) | ||||
| 	}() | ||||
| 
 | ||||
| 	logger := c.App.Metadata["logger"].(*zap.SugaredLogger) | ||||
| 	return st, helmexec.New(logger, kubeContext), false, nil | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -19,6 +19,7 @@ import ( | |||
| 	"bytes" | ||||
| 	"regexp" | ||||
| 
 | ||||
| 	"go.uber.org/zap" | ||||
| 	yaml "gopkg.in/yaml.v2" | ||||
| ) | ||||
| 
 | ||||
|  | @ -32,6 +33,8 @@ type HelmState struct { | |||
| 	Namespace          string           `yaml:"namespace"` | ||||
| 	Repositories       []RepositorySpec `yaml:"repositories"` | ||||
| 	Releases           []ReleaseSpec    `yaml:"releases"` | ||||
| 
 | ||||
| 	logger *zap.SugaredLogger | ||||
| } | ||||
| 
 | ||||
| // HelmSpec to defines helmDefault values
 | ||||
|  | @ -79,28 +82,17 @@ type SetValue struct { | |||
| 	Value string `yaml:"value"` | ||||
| } | ||||
| 
 | ||||
| // ReadFromFile loads the helmfile from disk and processes the template
 | ||||
| func ReadFromFile(file string) (*HelmState, error) { | ||||
| 	content, err := ioutil.ReadFile(file) | ||||
| // CreateFromFile loads the helmfile from disk and processes the template
 | ||||
| func CreateFromFile(file string, logger *zap.SugaredLogger) (*HelmState, error) { | ||||
| 	yamlBuf, err := renderTemplateFileToBuffer(file) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	tpl, err := stringTemplate().Parse(string(content)) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	var tplString bytes.Buffer | ||||
| 	err = tpl.Execute(&tplString, nil) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	return readFromYaml(tplString.Bytes(), file) | ||||
| 	return readFromYaml(yamlBuf.Bytes(), file, logger) | ||||
| } | ||||
| 
 | ||||
| func readFromYaml(content []byte, file string) (*HelmState, error) { | ||||
| func readFromYaml(content []byte, file string, logger *zap.SugaredLogger) (*HelmState, error) { | ||||
| 	var state HelmState | ||||
| 
 | ||||
| 	state.BaseChartPath, _ = filepath.Abs(filepath.Dir(file)) | ||||
|  | @ -117,6 +109,8 @@ func readFromYaml(content []byte, file string) (*HelmState, error) { | |||
| 		state.DeprecatedReleases = []ReleaseSpec{} | ||||
| 	} | ||||
| 
 | ||||
| 	state.logger = logger | ||||
| 
 | ||||
| 	return &state, nil | ||||
| } | ||||
| 
 | ||||
|  | @ -138,19 +132,36 @@ func getRequiredEnv(name string) (string, error) { | |||
| 	return "", fmt.Errorf("required env var `%s` is not set", name) | ||||
| } | ||||
| 
 | ||||
| func renderTemplateString(s string) (string, error) { | ||||
| func renderTemplateFileToBuffer(file string) (*bytes.Buffer, error) { | ||||
| 	content, err := ioutil.ReadFile(file) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	return renderTemplateToBuffer(string(content)) | ||||
| } | ||||
| 
 | ||||
| func renderTemplateToBuffer(s string) (*bytes.Buffer, error) { | ||||
| 	var t, parseErr = stringTemplate().Parse(s) | ||||
| 	if parseErr != nil { | ||||
| 		return "", parseErr | ||||
| 		return nil, parseErr | ||||
| 	} | ||||
| 
 | ||||
| 	var tplString bytes.Buffer | ||||
| 	var execErr = t.Execute(&tplString, nil) | ||||
| 
 | ||||
| 	if execErr != nil { | ||||
| 		return "", execErr | ||||
| 		return nil, execErr | ||||
| 	} | ||||
| 
 | ||||
| 	return &tplString, nil | ||||
| } | ||||
| 
 | ||||
| func renderTemplateString(s string) (string, error) { | ||||
| 	tplString, err := renderTemplateToBuffer(s) | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
| 	return tplString.String(), nil | ||||
| } | ||||
| 
 | ||||
|  | @ -194,7 +205,7 @@ func (state *HelmState) SyncReleases(helm helmexec.Interface, additionalValues [ | |||
| 		go func() { | ||||
| 			for release := range jobQueue { | ||||
| 				state.applyDefaultsTo(release) | ||||
| 				flags, flagsErr := flagsForRelease(helm, state.BaseChartPath, release) | ||||
| 				flags, flagsErr := state.flagsForRelease(helm, state.BaseChartPath, release) | ||||
| 				if flagsErr != nil { | ||||
| 					errQueue <- flagsErr | ||||
| 					doneQueue <- true | ||||
|  | @ -274,7 +285,7 @@ func (state *HelmState) DiffReleases(helm helmexec.Interface, additionalValues [ | |||
| 
 | ||||
| 				state.applyDefaultsTo(release) | ||||
| 
 | ||||
| 				flags, err := flagsForRelease(helm, state.BaseChartPath, release) | ||||
| 				flags, err := state.flagsForRelease(helm, state.BaseChartPath, release) | ||||
| 				if err != nil { | ||||
| 					errs = append(errs, err) | ||||
| 				} | ||||
|  | @ -358,7 +369,7 @@ func (state *HelmState) LintReleases(helm helmexec.Interface, additionalValues [ | |||
| 		go func() { | ||||
| 			for release := range jobQueue { | ||||
| 				errs := []error{} | ||||
| 				flags, err := flagsForRelease(helm, state.BaseChartPath, release) | ||||
| 				flags, err := state.flagsForRelease(helm, state.BaseChartPath, release) | ||||
| 				if err != nil { | ||||
| 					errs = append(errs, err) | ||||
| 				} | ||||
|  | @ -641,7 +652,7 @@ func chartNameWithoutRepository(chart string) string { | |||
| 	return chartSplit[len(chartSplit)-1] | ||||
| } | ||||
| 
 | ||||
| func flagsForRelease(helm helmexec.Interface, basePath string, release *ReleaseSpec) ([]string, error) { | ||||
| func (state *HelmState) flagsForRelease(helm helmexec.Interface, basePath string, release *ReleaseSpec) ([]string, error) { | ||||
| 	flags := []string{} | ||||
| 	if release.Version != "" { | ||||
| 		flags = append(flags, "--version", release.Version) | ||||
|  | @ -664,7 +675,21 @@ func flagsForRelease(helm helmexec.Interface, basePath string, release *ReleaseS | |||
| 			if _, err := os.Stat(path); os.IsNotExist(err) { | ||||
| 				return nil, err | ||||
| 			} | ||||
| 			flags = append(flags, "--values", path) | ||||
| 			yamlBuf, err := renderTemplateFileToBuffer(path) | ||||
| 			if err != nil { | ||||
| 				return nil, err | ||||
| 			} | ||||
| 			valfile, err := ioutil.TempFile("", "values") | ||||
| 			if err != nil { | ||||
| 				return nil, err | ||||
| 			} | ||||
| 			defer valfile.Close() | ||||
| 			yamlBytes := yamlBuf.Bytes() | ||||
| 			if _, err := valfile.Write(yamlBytes); err != nil { | ||||
| 				return nil, fmt.Errorf("failed to write %s: %v", valfile.Name(), err) | ||||
| 			} | ||||
| 			state.logger.Debugf("successfully generated the value file at %s. produced:\n%s", path, string(yamlBytes)) | ||||
| 			flags = append(flags, "--values", valfile.Name()) | ||||
| 
 | ||||
| 		case map[interface{}]interface{}: | ||||
| 			valfile, err := ioutil.TempFile("", "values") | ||||
|  |  | |||
|  | @ -6,9 +6,12 @@ import ( | |||
| 	"testing" | ||||
| 
 | ||||
| 	"errors" | ||||
| 	"github.com/roboll/helmfile/helmexec" | ||||
| 	"strings" | ||||
| ) | ||||
| 
 | ||||
| var logger = helmexec.NewLogger(os.Stdout, "warn") | ||||
| 
 | ||||
| func TestReadFromYaml(t *testing.T) { | ||||
| 	yamlFile := "example/path/to/yaml/file" | ||||
| 	yamlContent := []byte(`releases: | ||||
|  | @ -16,7 +19,7 @@ func TestReadFromYaml(t *testing.T) { | |||
|   namespace: mynamespace | ||||
|   chart: mychart | ||||
| `) | ||||
| 	state, err := readFromYaml(yamlContent, yamlFile) | ||||
| 	state, err := readFromYaml(yamlContent, yamlFile, logger) | ||||
| 	if err != nil { | ||||
| 		t.Errorf("unxpected error: %v", err) | ||||
| 	} | ||||
|  | @ -39,7 +42,7 @@ func TestReadFromYaml_StrictUnmarshalling(t *testing.T) { | |||
|   namespace: mynamespace | ||||
|   releases: mychart | ||||
| `) | ||||
| 	_, err := readFromYaml(yamlContent, yamlFile) | ||||
| 	_, err := readFromYaml(yamlContent, yamlFile, logger) | ||||
| 	if err == nil { | ||||
| 		t.Error("expected an error for wrong key 'releases' which is not in struct") | ||||
| 	} | ||||
|  | @ -51,7 +54,7 @@ func TestReadFromYaml_DeprecatedReleaseReferences(t *testing.T) { | |||
| - name: myrelease | ||||
|   chart: mychart | ||||
| `) | ||||
| 	state, err := readFromYaml(yamlContent, yamlFile) | ||||
| 	state, err := readFromYaml(yamlContent, yamlFile, logger) | ||||
| 	if err != nil { | ||||
| 		t.Errorf("unxpected error: %v", err) | ||||
| 	} | ||||
|  | @ -73,7 +76,7 @@ releases: | |||
| - name: myrelease2 | ||||
|   chart: mychart2 | ||||
| `) | ||||
| 	_, err := readFromYaml(yamlContent, yamlFile) | ||||
| 	_, err := readFromYaml(yamlContent, yamlFile, logger) | ||||
| 	if err == nil { | ||||
| 		t.Error("expected error") | ||||
| 	} | ||||
|  | @ -109,7 +112,7 @@ func TestReadFromYaml_FilterReleasesOnLabels(t *testing.T) { | |||
| 		{LabelFilter{positiveLabels: [][]string{[]string{"tier", "frontend"}}, negativeLabels: [][]string{[]string{"foo", "bar"}}}, | ||||
| 			[]bool{false, true, false}}, | ||||
| 	} | ||||
| 	state, err := readFromYaml(yamlContent, yamlFile) | ||||
| 	state, err := readFromYaml(yamlContent, yamlFile, logger) | ||||
| 	if err != nil { | ||||
| 		t.Errorf("unexpected error: %v", err) | ||||
| 	} | ||||
|  | @ -148,7 +151,7 @@ func TestReadFromYaml_FilterNegatives(t *testing.T) { | |||
| 		{LabelFilter{negativeLabels: [][]string{[]string{"stage", "pre"}, []string{"stage", "post"}}}, | ||||
| 			[]bool{false, false, true}}, | ||||
| 	} | ||||
| 	state, err := readFromYaml(yamlContent, yamlFile) | ||||
| 	state, err := readFromYaml(yamlContent, yamlFile, logger) | ||||
| 	if err != nil { | ||||
| 		t.Errorf("unexpected error: %v", err) | ||||
| 	} | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue