...

Source file src/edge-infra.dev/pkg/f8n/warehouse/lift/render/render.go

Documentation: edge-infra.dev/pkg/f8n/warehouse/lift/render

     1  // Package render templates the contents of manifests pulled from pallets and
     2  // defines the total set of valid template variables.
     3  package render
     4  
     5  import (
     6  	"fmt"
     7  	"io"
     8  
     9  	envsubst "github.com/drone/envsubst/v2"
    10  
    11  	"edge-infra.dev/pkg/f8n/warehouse/lift"
    12  	"edge-infra.dev/pkg/lib/uuid"
    13  )
    14  
    15  // Render inflates rendering rendering parameters into bytes read from Reader r
    16  // and returns the result.
    17  //
    18  // Parameters are applied right to left, latest wins in the case of conflicting
    19  // key values across maps. Maps can only contain keys present in Parameters
    20  func Render(r io.Reader, palletParams []string, params ...map[string]string) ([]byte, error) {
    21  	// merge the params slice into one. the params slice includes
    22  	// params from the warehouse.yaml and the other rendering params
    23  	// like cluster-provider and pallet-name
    24  	totalParams := make(map[string]string, 0)
    25  	for _, singleParams := range params {
    26  		for key, val := range singleParams {
    27  			totalParams[key] = val
    28  		}
    29  	}
    30  	handled, err := HandleParams(palletParams, totalParams)
    31  	if err != nil {
    32  		return nil, err
    33  	}
    34  	data, err := io.ReadAll(r)
    35  	if err != nil {
    36  		return nil, fmt.Errorf("failed to read manifest data: %w", err)
    37  	}
    38  
    39  	out, err := envsubst.Eval(string(data), func(s string) string {
    40  		return handled[s]
    41  	})
    42  	return []byte(out), err
    43  }
    44  
    45  func HandleParams(palletParams []string, params map[string]string) (map[string]string, error) {
    46  	var missingParams []string
    47  	for _, necessaryParam := range palletParams {
    48  		switch {
    49  		case necessaryParam == lift.ClusterUUIDRenderingParameter:
    50  			id := uuid.FromUUID(params[lift.ClusterUUIDRenderingParameter])
    51  			if params[lift.ClusterHashRenderingParameter] != "" &&
    52  				params[lift.ClusterHashRenderingParameter] != id.Hash() {
    53  				return nil, fmt.Errorf("rendering parameter %s cannot be manually set",
    54  					lift.ClusterHashRenderingParameter)
    55  			}
    56  			if params[lift.ClusterUUIDRenderingParameter] != "" {
    57  				params[lift.ClusterHashRenderingParameter] = id.Hash()
    58  			}
    59  		}
    60  		if val, ok := params[necessaryParam]; ok {
    61  			if val == "" {
    62  				missingParams = append(missingParams, necessaryParam)
    63  			}
    64  		}
    65  	}
    66  	if len(missingParams) != 0 {
    67  		return nil, fmt.Errorf("missing parameters %s", missingParams)
    68  	}
    69  	return params, nil
    70  }
    71  

View as plain text