...

Source file src/github.com/linkerd/linkerd2/cli/cmd/install_cni_helm_test.go

Documentation: github.com/linkerd/linkerd2/cli/cmd

     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  	// read the cni plugin chart and its defaults from the local folder.
    18  	// override most defaults with pinned values.
    19  	// use the Helm lib to render the templates.
    20  	// the golden file is generated using the following `helm template` command:
    21  	// bin/helm template --set namespace="linkerd-test" --set inboundProxyPort=1234 --set outboundProxyPort=5678 --set cniPluginImage="cr.l5d.io/linkerd/cni-plugin-test" --set cniPluginVersion="test-version" --set logLevel="debug" --set proxyUID=1111 --set proxyGID=1111 --set destCNINetDir="/etc/cni/net.d-test" --set destCNIBinDir="/opt/cni/bin-test" --set useWaitFlag=true --set cliVersion=test-version charts/linkerd2-cni
    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  			// skip partial templates
    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