feat(state): add missingFileHandlerConfig and related logic
Signed-off-by: yxxhero <aiopsclub@163.com>
This commit is contained in:
		
							parent
							
								
									6fd4048653
								
							
						
					
					
						commit
						dd11bcfe93
					
				|  | @ -412,6 +412,10 @@ helmfiles: | |||
| # If set to "Error", return an error when a subhelmfile points to a | ||||
| # non-existent path. The default behavior is to print a warning and continue. | ||||
| missingFileHandler: Error | ||||
| missingFileHandlerConfig: | ||||
|   # Ignores missing git branch error so that the Debug/Info/Warn handler can treat a missing branch as non-error. | ||||
|   # See https://github.com/helmfile/helmfile/issues/392 | ||||
|   ignoreMissingGitBranch: true | ||||
| 
 | ||||
| # | ||||
| # Advanced Configuration: Environments | ||||
|  |  | |||
|  | @ -224,6 +224,31 @@ func (c *StateCreator) loadBases(envValues, overrodeEnv *environment.Environment | |||
| 	return layers[0], nil | ||||
| } | ||||
| 
 | ||||
| // getEnvMissingFileHandlerConfig returns the first non-nil MissingFileHandlerConfig from the environment spec, state, or default.
 | ||||
| func (st *HelmState) getEnvMissingFileHandlerConfig(es EnvironmentSpec) *MissingFileHandlerConfig { | ||||
| 	switch { | ||||
| 	case es.MissingFileHandlerConfig != nil: | ||||
| 		return es.MissingFileHandlerConfig | ||||
| 	case st.MissingFileHandlerConfig != nil: | ||||
| 		return st.MissingFileHandlerConfig | ||||
| 	default: | ||||
| 		return nil | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // getEnvMissingFileHandler returns the first non-nil MissingFileHandler from the environment spec, state, or default.
 | ||||
| func (st *HelmState) getEnvMissingFileHandler(es EnvironmentSpec) *string { | ||||
| 	defaultMissingFileHandler := "Error" | ||||
| 	switch { | ||||
| 	case es.MissingFileHandler != nil: | ||||
| 		return es.MissingFileHandler | ||||
| 	case st.MissingFileHandler != nil: | ||||
| 		return st.MissingFileHandler | ||||
| 	default: | ||||
| 		return &defaultMissingFileHandler | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // nolint: unparam
 | ||||
| func (c *StateCreator) loadEnvValues(st *HelmState, name string, failOnMissingEnv bool, ctxEnv, overrode *environment.Environment) (*environment.Environment, error) { | ||||
| 	secretVals := map[string]any{} | ||||
|  | @ -240,7 +265,7 @@ func (c *StateCreator) loadEnvValues(st *HelmState, name string, failOnMissingEn | |||
| 		var envSecretFiles []string | ||||
| 		if len(envSpec.Secrets) > 0 { | ||||
| 			for _, urlOrPath := range envSpec.Secrets { | ||||
| 				resolved, skipped, err := st.storage().resolveFile(envSpec.MissingFileHandler, "environment values", urlOrPath, envSpec.MissingFileHandlerConfig.resolveFileOptions()...) | ||||
| 				resolved, skipped, err := st.storage().resolveFile(st.getEnvMissingFileHandler(envSpec), "environment values", urlOrPath, st.getEnvMissingFileHandlerConfig(envSpec).resolveFileOptions()...) | ||||
| 				if err != nil { | ||||
| 					return nil, err | ||||
| 				} | ||||
|  |  | |||
|  | @ -14,5 +14,5 @@ type EnvironmentSpec struct { | |||
| 	// a message about the missing file at the log-level.
 | ||||
| 	MissingFileHandler *string `yaml:"missingFileHandler,omitempty"` | ||||
| 	// MissingFileHandlerConfig is composed of various settings for the MissingFileHandler
 | ||||
| 	MissingFileHandlerConfig MissingFileHandlerConfig `yaml:"missingFileHandlerConfig,omitempty"` | ||||
| 	MissingFileHandlerConfig *MissingFileHandlerConfig `yaml:"missingFileHandlerConfig,omitempty"` | ||||
| } | ||||
|  |  | |||
|  | @ -350,7 +350,7 @@ func (st *HelmState) PrepareChartify(helm helmexec.Interface, release *ReleaseSp | |||
| 
 | ||||
| 	jsonPatches := release.JSONPatches | ||||
| 	if len(jsonPatches) > 0 { | ||||
| 		generatedFiles, err := st.generateTemporaryReleaseValuesFiles(release, jsonPatches, release.MissingFileHandler) | ||||
| 		generatedFiles, err := st.generateTemporaryReleaseValuesFiles(release, jsonPatches) | ||||
| 		if err != nil { | ||||
| 			return nil, clean, err | ||||
| 		} | ||||
|  | @ -364,7 +364,7 @@ func (st *HelmState) PrepareChartify(helm helmexec.Interface, release *ReleaseSp | |||
| 
 | ||||
| 	strategicMergePatches := release.StrategicMergePatches | ||||
| 	if len(strategicMergePatches) > 0 { | ||||
| 		generatedFiles, err := st.generateTemporaryReleaseValuesFiles(release, strategicMergePatches, release.MissingFileHandler) | ||||
| 		generatedFiles, err := st.generateTemporaryReleaseValuesFiles(release, strategicMergePatches) | ||||
| 		if err != nil { | ||||
| 			return nil, clean, err | ||||
| 		} | ||||
|  | @ -378,7 +378,7 @@ func (st *HelmState) PrepareChartify(helm helmexec.Interface, release *ReleaseSp | |||
| 
 | ||||
| 	transformers := release.Transformers | ||||
| 	if len(transformers) > 0 { | ||||
| 		generatedFiles, err := st.generateTemporaryReleaseValuesFiles(release, transformers, release.MissingFileHandler) | ||||
| 		generatedFiles, err := st.generateTemporaryReleaseValuesFiles(release, transformers) | ||||
| 		if err != nil { | ||||
| 			return nil, clean, err | ||||
| 		} | ||||
|  |  | |||
|  | @ -84,9 +84,9 @@ type ReleaseSetSpec struct { | |||
| 	// If set to "Error", return an error when a subhelmfile points to a
 | ||||
| 	// non-existent path. The default behavior is to print a warning. Note the
 | ||||
| 	// differing default compared to other MissingFileHandlers.
 | ||||
| 	MissingFileHandler string `yaml:"missingFileHandler,omitempty"` | ||||
| 	MissingFileHandler *string `yaml:"missingFileHandler,omitempty"` | ||||
| 	// MissingFileHandlerConfig is composed of various settings for the MissingFileHandler
 | ||||
| 	MissingFileHandlerConfig MissingFileHandlerConfig `yaml:"missingFileHandlerConfig,omitempty"` | ||||
| 	MissingFileHandlerConfig *MissingFileHandlerConfig `yaml:"missingFileHandlerConfig,omitempty"` | ||||
| 
 | ||||
| 	LockFile string `yaml:"lockFilePath,omitempty"` | ||||
| } | ||||
|  | @ -307,6 +307,10 @@ type ReleaseSpec struct { | |||
| 	// MissingFileHandler is set to either "Error" or "Warn". "Error" instructs helmfile to fail when unable to find a values or secrets file. When "Warn", it prints the file and continues.
 | ||||
| 	// The default value for MissingFileHandler is "Error".
 | ||||
| 	MissingFileHandler *string `yaml:"missingFileHandler,omitempty"` | ||||
| 
 | ||||
| 	// MissingFileHandlerConfig is composed of various settings for the MissingFileHandler
 | ||||
| 	MissingFileHandlerConfig *MissingFileHandlerConfig `yaml:"missingFileHandlerConfig,omitempty"` | ||||
| 
 | ||||
| 	// Needs is the [KUBECONTEXT/][NS/]NAME representations of releases that this release depends on.
 | ||||
| 	Needs []string `yaml:"needs,omitempty"` | ||||
| 
 | ||||
|  | @ -3194,7 +3198,7 @@ func (st *HelmState) ExpandedHelmfiles() ([]SubHelmfileSpec, error) { | |||
| 		} | ||||
| 		if len(matches) == 0 { | ||||
| 			err := fmt.Errorf("no matches for path: %s", hf.Path) | ||||
| 			if st.MissingFileHandler == "Error" { | ||||
| 			if *st.MissingFileHandler == "Error" { | ||||
| 				return nil, err | ||||
| 			} | ||||
| 			st.logger.Warnf("no matches for path: %s", hf.Path) | ||||
|  | @ -3241,19 +3245,54 @@ func (st *HelmState) removeFiles(files []string) { | |||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (c MissingFileHandlerConfig) resolveFileOptions() []resolveFileOption { | ||||
| func (c *MissingFileHandlerConfig) resolveFileOptions() []resolveFileOption { | ||||
| 	if c == nil { | ||||
| 		return []resolveFileOption{ | ||||
| 			ignoreMissingGitBranch(false), | ||||
| 		} | ||||
| 	} | ||||
| 	return []resolveFileOption{ | ||||
| 		ignoreMissingGitBranch(c.IgnoreMissingGitBranch), | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (st *HelmState) generateTemporaryReleaseValuesFiles(release *ReleaseSpec, values []any, missingFileHandler *string) ([]string, error) { | ||||
| // getReleaseMissingFileHandlerConfig returns the first non-nil MissingFileHandlerConfig in the following order:
 | ||||
| // - release.MissingFileHandlerConfig
 | ||||
| // - st.MissingFileHandlerConfig
 | ||||
| func (st *HelmState) getReleaseMissingFileHandlerConfig(release *ReleaseSpec) *MissingFileHandlerConfig { | ||||
| 	switch { | ||||
| 	case release.MissingFileHandlerConfig != nil: | ||||
| 		return release.MissingFileHandlerConfig | ||||
| 	case st.MissingFileHandlerConfig != nil: | ||||
| 		return st.MissingFileHandlerConfig | ||||
| 	default: | ||||
| 		return nil | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // getReleaseMissingFileHandler returns the first non-nil MissingFileHandler in the following order:
 | ||||
| // - release.MissingFileHandler
 | ||||
| // - st.MissingFileHandler
 | ||||
| // - "Error"
 | ||||
| func (st *HelmState) getReleaseMissingFileHandler(release *ReleaseSpec) *string { | ||||
| 	defaultMissingFileHandler := "Error" | ||||
| 	switch { | ||||
| 	case release.MissingFileHandler != nil: | ||||
| 		return release.MissingFileHandler | ||||
| 	case st.MissingFileHandler != nil: | ||||
| 		return st.MissingFileHandler | ||||
| 	default: | ||||
| 		return &defaultMissingFileHandler | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (st *HelmState) generateTemporaryReleaseValuesFiles(release *ReleaseSpec, values []any) ([]string, error) { | ||||
| 	generatedFiles := []string{} | ||||
| 
 | ||||
| 	for _, value := range values { | ||||
| 		switch typedValue := value.(type) { | ||||
| 		case string: | ||||
| 			paths, skip, err := st.storage().resolveFile(missingFileHandler, "values", typedValue, st.MissingFileHandlerConfig.resolveFileOptions()...) | ||||
| 			paths, skip, err := st.storage().resolveFile(st.getReleaseMissingFileHandler(release), "values", typedValue, st.getReleaseMissingFileHandlerConfig(release).resolveFileOptions()...) | ||||
| 			if err != nil { | ||||
| 				return generatedFiles, err | ||||
| 			} | ||||
|  | @ -3334,7 +3373,7 @@ func (st *HelmState) generateVanillaValuesFiles(release *ReleaseSpec) ([]string, | |||
| 		return nil, fmt.Errorf("Failed to render values in %s for release %s: type %T isn't supported", st.FilePath, release.Name, valuesMapSecretsRendered["values"]) | ||||
| 	} | ||||
| 
 | ||||
| 	generatedFiles, err := st.generateTemporaryReleaseValuesFiles(release, valuesSecretsRendered, release.MissingFileHandler) | ||||
| 	generatedFiles, err := st.generateTemporaryReleaseValuesFiles(release, valuesSecretsRendered) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | @ -3400,7 +3439,7 @@ func (st *HelmState) generateSecretValuesFiles(helm helmexec.Interface, release | |||
| 		generatedDecryptedFiles = append(generatedDecryptedFiles, valfile) | ||||
| 	} | ||||
| 
 | ||||
| 	generatedFiles, err := st.generateTemporaryReleaseValuesFiles(release, generatedDecryptedFiles, release.MissingFileHandler) | ||||
| 	generatedFiles, err := st.generateTemporaryReleaseValuesFiles(release, generatedDecryptedFiles) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue