...
1
2
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
16
17
18
19
20 func Render(r io.Reader, palletParams []string, params ...map[string]string) ([]byte, error) {
21
22
23
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