// Package render templates the contents of manifests pulled from pallets and // defines the total set of valid template variables. package render import ( "fmt" "io" envsubst "github.com/drone/envsubst/v2" "edge-infra.dev/pkg/f8n/warehouse/lift" "edge-infra.dev/pkg/lib/uuid" ) // Render inflates rendering rendering parameters into bytes read from Reader r // and returns the result. // // Parameters are applied right to left, latest wins in the case of conflicting // key values across maps. Maps can only contain keys present in Parameters func Render(r io.Reader, palletParams []string, params ...map[string]string) ([]byte, error) { // merge the params slice into one. the params slice includes // params from the warehouse.yaml and the other rendering params // like cluster-provider and pallet-name totalParams := make(map[string]string, 0) for _, singleParams := range params { for key, val := range singleParams { totalParams[key] = val } } handled, err := HandleParams(palletParams, totalParams) if err != nil { return nil, err } data, err := io.ReadAll(r) if err != nil { return nil, fmt.Errorf("failed to read manifest data: %w", err) } out, err := envsubst.Eval(string(data), func(s string) string { return handled[s] }) return []byte(out), err } func HandleParams(palletParams []string, params map[string]string) (map[string]string, error) { var missingParams []string for _, necessaryParam := range palletParams { switch { case necessaryParam == lift.ClusterUUIDRenderingParameter: id := uuid.FromUUID(params[lift.ClusterUUIDRenderingParameter]) if params[lift.ClusterHashRenderingParameter] != "" && params[lift.ClusterHashRenderingParameter] != id.Hash() { return nil, fmt.Errorf("rendering parameter %s cannot be manually set", lift.ClusterHashRenderingParameter) } if params[lift.ClusterUUIDRenderingParameter] != "" { params[lift.ClusterHashRenderingParameter] = id.Hash() } } if val, ok := params[necessaryParam]; ok { if val == "" { missingParams = append(missingParams, necessaryParam) } } } if len(missingParams) != 0 { return nil, fmt.Errorf("missing parameters %s", missingParams) } return params, nil }