infra/blueprint-test/pkg/kpt/setters.go (77 lines of code) (raw):

package kpt import ( "fmt" "os" "strings" "sigs.k8s.io/kustomize/kyaml/kio" "sigs.k8s.io/kustomize/kyaml/kio/kioutil" "sigs.k8s.io/kustomize/kyaml/yaml" ) // UpsertSetters inserts or updates setters if apply-setters fn config is discovered. func UpsertSetters(nodes []*yaml.RNode, setters map[string]string) error { kf, err := findKptfile(nodes) if err != nil { return err } // no pipeline defined for pkg if kf.Pipeline == nil { return nil } for _, fn := range kf.Pipeline.Mutators { if !strings.Contains(fn.Image, "apply-setters") { continue } // ignoring inlined configMap in Kptfile for now // all blueprint examples will have setters defined via configPath if fn.ConfigPath != "" { settersConfig, err := findSetterNode(nodes, fn.ConfigPath) if err != nil { return err } setterData := settersConfig.GetDataMap() for sKey, sVal := range setters { setterData[sKey] = sVal } settersConfig.SetDataMap(setterData) } } return nil } // findSetterNode finds setter node from a slice of nodes. func findSetterNode(nodes []*yaml.RNode, path string) (*yaml.RNode, error) { for _, node := range nodes { np := node.GetAnnotations()[kioutil.PathAnnotation] if np == path { return node, nil } } return nil, fmt.Errorf(`file %s doesn't exist, please ensure the file specified in "configPath" exists and retry`, path) } // Generates setters from environment variables. // Setter names are generated from variable name by lowercasing and replacing "_" to "-". func GenerateSetterKVFromEnvVar(e string) (string, string, error) { sVal, found := os.LookupEnv(e) if !found { return "", "", fmt.Errorf("unable to find envvar %s", e) } sKey := strings.ReplaceAll(strings.ToLower(e), "_", "-") return sKey, sVal, nil } // MergeSetters merges two setter maps a and b. // If duplicate key map b takes precedence. func MergeSetters(a, b map[string]string) map[string]string { merged := make(map[string]string, len(a)+len(b)) for k, v := range a { merged[k] = v } for k, v := range b { merged[k] = v } return merged } // ReadPkgResources returns a slice of resources from a dir. func ReadPkgResources(dir string) ([]*yaml.RNode, error) { p := &kio.LocalPackageReader{ PackagePath: dir, PackageFileName: "Kptfile", MatchFilesGlob: append(kio.DefaultMatch, "Kptfile"), IncludeSubpackages: true, } return p.Read() } // WritePkgResources writes a slice of resources to a dir. func WritePkgResources(dir string, rs []*yaml.RNode) error { p := &kio.LocalPackageWriter{ PackagePath: dir, } return p.Write(rs) }