1 package cmd
2
3 import (
4 "bytes"
5 "path/filepath"
6 "testing"
7
8 cnicharts "github.com/linkerd/linkerd2/pkg/charts/cni"
9 "github.com/linkerd/linkerd2/testutil"
10 "helm.sh/helm/v3/pkg/chart"
11 "helm.sh/helm/v3/pkg/chartutil"
12 "helm.sh/helm/v3/pkg/engine"
13 "sigs.k8s.io/yaml"
14 )
15
16 func TestRenderCniHelm(t *testing.T) {
17
18
19
20
21
22
23 t.Run("Cni Install with defaults", func(t *testing.T) {
24 chartCni := chartCniPlugin(t)
25 testRenderCniHelm(t, chartCni, &chartutil.Values{}, "install_cni_helm_default_output.golden")
26 })
27
28 t.Run("Cni Install with overridden values", func(t *testing.T) {
29 chartCni := chartCniPlugin(t)
30 overrideJSON :=
31 `{
32 "namespace": "linkerd-test",
33 "inboundProxyPort": 1234,
34 "outboundProxyPort": 5678,
35 "logLevel": "debug",
36 "image": {
37 "name": "cr.l5d.io/linkerd/cni-plugin",
38 "version": "v1.4.0"
39 },
40 "proxyUID": 1111,
41 "proxyGID": 1111,
42 "destCNINetDir": "/etc/cni/net.d-test",
43 "destCNIBinDir": "/opt/cni/bin-test",
44 "useWaitFlag": true,
45 "cliVersion": "test-version",
46 "priorityClassName": "system-node-critical",
47 "revisionHistoryLimir": 10
48 }`
49
50 var overrideConfig chartutil.Values
51 err := yaml.Unmarshal([]byte(overrideJSON), &overrideConfig)
52 if err != nil {
53 t.Fatal("Unexpected error", err)
54 }
55 testRenderCniHelm(t, chartCni, &overrideConfig, "install_cni_helm_override_output.golden")
56 })
57
58 }
59
60 func testRenderCniHelm(t *testing.T, chart *chart.Chart, overrideConfig *chartutil.Values, goldenFileName string) {
61 var (
62 chartName = "linkerd2-cni"
63 namespace = "linkerd-test"
64 )
65
66 releaseOptions := chartutil.ReleaseOptions{
67 Name: chartName,
68 Namespace: namespace,
69 IsUpgrade: false,
70 IsInstall: true,
71 }
72
73 valuesToRender, err := chartutil.ToRenderValues(chart, *overrideConfig, releaseOptions, nil)
74 if err != nil {
75 t.Fatal("Unexpected error", err)
76 }
77
78 rendered, err := engine.Render(chart, valuesToRender)
79 if err != nil {
80 t.Fatal("Unexpected error", err)
81 }
82
83 var buf bytes.Buffer
84 for _, template := range chart.Templates {
85 source := chartName + "/" + template.Name
86 v, exists := rendered[source]
87 if !exists {
88
89 continue
90 }
91 buf.WriteString("---\n# Source: " + source + "\n")
92 buf.WriteString(v)
93 }
94
95 if err := testDataDiffer.DiffTestYAML(goldenFileName, buf.String()); err != nil {
96 t.Error(err)
97 }
98 }
99
100 func chartCniPlugin(t *testing.T) *chart.Chart {
101 rawValues, err := readCniTestValues(t)
102 if err != nil {
103 t.Fatal("Unexpected error", err)
104 }
105
106 var values chartutil.Values
107 err = yaml.Unmarshal(rawValues, &values)
108 if err != nil {
109 t.Fatal("Unexpected error", err)
110 }
111 chartPartials := chartPartials([]string{
112 "templates/_helpers.tpl",
113 "templates/_metadata.tpl",
114 "templates/_tolerations.tpl",
115 "templates/_resources.tpl",
116 })
117
118 cniChart := &chart.Chart{
119 Metadata: &chart.Metadata{
120 Name: helmCNIDefaultChartName,
121 Sources: []string{
122 filepath.Join("..", "..", "..", "charts", "linkerd2-cni"),
123 },
124 },
125 Values: values,
126 }
127
128 cniChart.AddDependency(chartPartials)
129
130 cniChart.Templates = append(cniChart.Templates, &chart.File{
131 Name: "templates/cni-plugin.yaml",
132 })
133
134 for _, template := range cniChart.Templates {
135 filepath := filepath.Join(cniChart.Metadata.Sources[0], template.Name)
136 template.Data = []byte(testutil.ReadTestdata(filepath))
137 }
138
139 return cniChart
140 }
141
142 func readCniTestValues(t *testing.T) ([]byte, error) {
143 values, err := cnicharts.NewValues()
144 if err != nil {
145 t.Fatal("Unexpected error", err)
146 }
147
148 return yaml.Marshal(values)
149 }
150
View as plain text