pkg/safeguards/preprocessing/preprocessing_helpers.go (70 lines of code) (raw):
package preprocessing
import (
"fmt"
"os"
"path/filepath"
"gopkg.in/yaml.v3"
"helm.sh/helm/v3/pkg/chart"
"helm.sh/helm/v3/pkg/chartutil"
)
// Returns values from values.yaml and release options specified in values.yaml
func getValues(chart *chart.Chart, valuesPath string, opt chartutil.ReleaseOptions, dirName string) (chartutil.Values, error) {
// Load values file
valuesFile, err := os.ReadFile(valuesPath)
if err != nil {
return nil, fmt.Errorf("failed to read values file: %s", err)
}
vals := map[string]interface{}{}
if err := yaml.Unmarshal(valuesFile, &vals); err != nil {
return nil, fmt.Errorf("failed to parse values.yaml: %s", err)
}
mergedValues, err := getReleaseOptions(chart, vals, opt, dirName)
return mergedValues, err
}
// Extracts release options from either CLI flags, values.yaml, or name of containing directory
func getReleaseOptions(chart *chart.Chart, vals map[string]interface{}, opt chartutil.ReleaseOptions, dirName string) (chartutil.Values, error) {
// Extract release options from values
var options chartutil.ReleaseOptions
if opt.Name != "" && opt.Namespace != "" {
options = opt
} else {
var releaseName string
var releaseNamespace string
if opt.Name != "" {
releaseName = opt.Name
} else {
rName, ok := vals["releaseName"].(string)
if !ok || rName == "" {
releaseName = dirName
} else {
releaseName = rName
}
}
if opt.Namespace != "" {
releaseNamespace = opt.Namespace
} else {
rNamespace, ok := vals["releaseNamespace"].(string)
if !ok || rNamespace == "" {
releaseNamespace = dirName
} else {
releaseNamespace = rNamespace
}
}
options = chartutil.ReleaseOptions{
Name: releaseName,
Namespace: releaseNamespace,
}
}
// Combine chart values with release options
config := chartutil.Values(vals)
mergedValues, err := chartutil.ToRenderValues(chart, config, options, nil)
if err != nil {
return nil, fmt.Errorf("failed to merge values: %s", err)
}
return mergedValues, nil
}
// IsYAML determines if a file is of the YAML extension or not
func IsYAML(path string) bool {
return filepath.Ext(path) == ".yaml" || filepath.Ext(path) == ".yml"
}
// IsDirectory determines if a file represented by path is a directory or not
func IsDirectory(path string) (bool, error) {
fileInfo, err := os.Stat(path)
if err != nil {
return false, err
}
return fileInfo.IsDir(), nil
}