github.com/keleustes/helm@v3.0.0-beta.3+incompatible/cmd/helm/upgrade_test.go (about)

     1  /*
     2  Copyright The Helm Authors.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package main
    18  
    19  import (
    20  	"fmt"
    21  	"io/ioutil"
    22  	"path/filepath"
    23  	"strings"
    24  	"testing"
    25  
    26  	"helm.sh/helm/internal/test/ensure"
    27  	"helm.sh/helm/pkg/chart"
    28  	"helm.sh/helm/pkg/chart/loader"
    29  	"helm.sh/helm/pkg/chartutil"
    30  	"helm.sh/helm/pkg/release"
    31  )
    32  
    33  func TestUpgradeCmd(t *testing.T) {
    34  	tmpChart := ensure.TempDir(t)
    35  	cfile := &chart.Chart{
    36  		Metadata: &chart.Metadata{
    37  			APIVersion:  chart.APIVersionV1,
    38  			Name:        "testUpgradeChart",
    39  			Description: "A Helm chart for Kubernetes",
    40  			Version:     "0.1.0",
    41  		},
    42  	}
    43  	chartPath := filepath.Join(tmpChart, cfile.Metadata.Name)
    44  	if err := chartutil.SaveDir(cfile, tmpChart); err != nil {
    45  		t.Fatalf("Error creating chart for upgrade: %v", err)
    46  	}
    47  	ch, err := loader.Load(chartPath)
    48  	if err != nil {
    49  		t.Fatalf("Error loading chart: %v", err)
    50  	}
    51  	_ = release.Mock(&release.MockReleaseOptions{
    52  		Name:  "funny-bunny",
    53  		Chart: ch,
    54  	})
    55  
    56  	// update chart version
    57  	cfile.Metadata.Version = "0.1.2"
    58  
    59  	if err := chartutil.SaveDir(cfile, tmpChart); err != nil {
    60  		t.Fatalf("Error creating chart: %v", err)
    61  	}
    62  	ch, err = loader.Load(chartPath)
    63  	if err != nil {
    64  		t.Fatalf("Error loading updated chart: %v", err)
    65  	}
    66  
    67  	// update chart version again
    68  	cfile.Metadata.Version = "0.1.3"
    69  
    70  	if err := chartutil.SaveDir(cfile, tmpChart); err != nil {
    71  		t.Fatalf("Error creating chart: %v", err)
    72  	}
    73  	var ch2 *chart.Chart
    74  	ch2, err = loader.Load(chartPath)
    75  	if err != nil {
    76  		t.Fatalf("Error loading updated chart: %v", err)
    77  	}
    78  
    79  	missingDepsPath := "testdata/testcharts/chart-missing-deps"
    80  	badDepsPath := "testdata/testcharts/chart-bad-requirements"
    81  
    82  	relMock := func(n string, v int, ch *chart.Chart) *release.Release {
    83  		return release.Mock(&release.MockReleaseOptions{Name: n, Version: v, Chart: ch})
    84  	}
    85  
    86  	tests := []cmdTestCase{
    87  		{
    88  			name:   "upgrade a release",
    89  			cmd:    fmt.Sprintf("upgrade funny-bunny '%s'", chartPath),
    90  			golden: "output/upgrade.txt",
    91  			rels:   []*release.Release{relMock("funny-bunny", 2, ch)},
    92  		},
    93  		{
    94  			name:   "upgrade a release with timeout",
    95  			cmd:    fmt.Sprintf("upgrade funny-bunny --timeout 120s '%s'", chartPath),
    96  			golden: "output/upgrade-with-timeout.txt",
    97  			rels:   []*release.Release{relMock("funny-bunny", 3, ch2)},
    98  		},
    99  		{
   100  			name:   "upgrade a release with --reset-values",
   101  			cmd:    fmt.Sprintf("upgrade funny-bunny --reset-values '%s'", chartPath),
   102  			golden: "output/upgrade-with-reset-values.txt",
   103  			rels:   []*release.Release{relMock("funny-bunny", 4, ch2)},
   104  		},
   105  		{
   106  			name:   "upgrade a release with --reuse-values",
   107  			cmd:    fmt.Sprintf("upgrade funny-bunny --reuse-values '%s'", chartPath),
   108  			golden: "output/upgrade-with-reset-values2.txt",
   109  			rels:   []*release.Release{relMock("funny-bunny", 5, ch2)},
   110  		},
   111  		{
   112  			name:   "install a release with 'upgrade --install'",
   113  			cmd:    fmt.Sprintf("upgrade zany-bunny -i '%s'", chartPath),
   114  			golden: "output/upgrade-with-install.txt",
   115  			rels:   []*release.Release{relMock("zany-bunny", 1, ch)},
   116  		},
   117  		{
   118  			name:   "install a release with 'upgrade --install' and timeout",
   119  			cmd:    fmt.Sprintf("upgrade crazy-bunny -i --timeout 120s '%s'", chartPath),
   120  			golden: "output/upgrade-with-install-timeout.txt",
   121  			rels:   []*release.Release{relMock("crazy-bunny", 1, ch)},
   122  		},
   123  		{
   124  			name:   "upgrade a release with wait",
   125  			cmd:    fmt.Sprintf("upgrade crazy-bunny --wait '%s'", chartPath),
   126  			golden: "output/upgrade-with-wait.txt",
   127  			rels:   []*release.Release{relMock("crazy-bunny", 2, ch2)},
   128  		},
   129  		{
   130  			name:      "upgrade a release with missing dependencies",
   131  			cmd:       fmt.Sprintf("upgrade bonkers-bunny %s", missingDepsPath),
   132  			golden:    "output/upgrade-with-missing-dependencies.txt",
   133  			wantError: true,
   134  		},
   135  		{
   136  			name:      "upgrade a release with bad dependencies",
   137  			cmd:       fmt.Sprintf("upgrade bonkers-bunny '%s'", badDepsPath),
   138  			golden:    "output/upgrade-with-bad-dependencies.txt",
   139  			wantError: true,
   140  		},
   141  	}
   142  	runTestCmd(t, tests)
   143  }
   144  
   145  func TestUpgradeWithValue(t *testing.T) {
   146  	releaseName := "funny-bunny-v2"
   147  	relMock, ch, chartPath := prepareMockRelease(releaseName, t)
   148  
   149  	defer resetEnv()()
   150  
   151  	store := storageFixture()
   152  
   153  	store.Create(relMock(releaseName, 3, ch))
   154  
   155  	cmd := fmt.Sprintf("upgrade %s --set favoriteDrink=tea '%s'", releaseName, chartPath)
   156  	_, _, err := executeActionCommandC(store, cmd)
   157  	if err != nil {
   158  		t.Errorf("unexpected error, got '%v'", err)
   159  	}
   160  
   161  	updatedRel, err := store.Get(releaseName, 4)
   162  	if err != nil {
   163  		t.Errorf("unexpected error, got '%v'", err)
   164  	}
   165  
   166  	if !strings.Contains(updatedRel.Manifest, "drink: tea") {
   167  		t.Errorf("The value is not set correctly. manifest: %s", updatedRel.Manifest)
   168  	}
   169  
   170  }
   171  
   172  func TestUpgradeWithStringValue(t *testing.T) {
   173  	releaseName := "funny-bunny-v3"
   174  	relMock, ch, chartPath := prepareMockRelease(releaseName, t)
   175  
   176  	defer resetEnv()()
   177  
   178  	store := storageFixture()
   179  
   180  	store.Create(relMock(releaseName, 3, ch))
   181  
   182  	cmd := fmt.Sprintf("upgrade %s --set-string favoriteDrink=coffee '%s'", releaseName, chartPath)
   183  	_, _, err := executeActionCommandC(store, cmd)
   184  	if err != nil {
   185  		t.Errorf("unexpected error, got '%v'", err)
   186  	}
   187  
   188  	updatedRel, err := store.Get(releaseName, 4)
   189  	if err != nil {
   190  		t.Errorf("unexpected error, got '%v'", err)
   191  	}
   192  
   193  	if !strings.Contains(updatedRel.Manifest, "drink: coffee") {
   194  		t.Errorf("The value is not set correctly. manifest: %s", updatedRel.Manifest)
   195  	}
   196  
   197  }
   198  
   199  func TestUpgradeWithValuesFile(t *testing.T) {
   200  
   201  	releaseName := "funny-bunny-v4"
   202  	relMock, ch, chartPath := prepareMockRelease(releaseName, t)
   203  
   204  	defer resetEnv()()
   205  
   206  	store := storageFixture()
   207  
   208  	store.Create(relMock(releaseName, 3, ch))
   209  
   210  	cmd := fmt.Sprintf("upgrade %s --values testdata/testcharts/upgradetest/values.yaml '%s'", releaseName, chartPath)
   211  	_, _, err := executeActionCommandC(store, cmd)
   212  	if err != nil {
   213  		t.Errorf("unexpected error, got '%v'", err)
   214  	}
   215  
   216  	updatedRel, err := store.Get(releaseName, 4)
   217  	if err != nil {
   218  		t.Errorf("unexpected error, got '%v'", err)
   219  	}
   220  
   221  	if !strings.Contains(updatedRel.Manifest, "drink: beer") {
   222  		t.Errorf("The value is not set correctly. manifest: %s", updatedRel.Manifest)
   223  	}
   224  
   225  }
   226  
   227  func prepareMockRelease(releaseName string, t *testing.T) (func(n string, v int, ch *chart.Chart) *release.Release, *chart.Chart, string) {
   228  	tmpChart := ensure.TempDir(t)
   229  	configmapData, err := ioutil.ReadFile("testdata/testcharts/upgradetest/templates/configmap.yaml")
   230  	if err != nil {
   231  		t.Fatalf("Error loading template yaml %v", err)
   232  	}
   233  	cfile := &chart.Chart{
   234  		Metadata: &chart.Metadata{
   235  			APIVersion:  chart.APIVersionV1,
   236  			Name:        "testUpgradeChart",
   237  			Description: "A Helm chart for Kubernetes",
   238  			Version:     "0.1.0",
   239  		},
   240  		Templates: []*chart.File{{Name: "templates/configmap.yaml", Data: configmapData}},
   241  	}
   242  	chartPath := filepath.Join(tmpChart, cfile.Metadata.Name)
   243  	if err := chartutil.SaveDir(cfile, tmpChart); err != nil {
   244  		t.Fatalf("Error creating chart for upgrade: %v", err)
   245  	}
   246  	ch, err := loader.Load(chartPath)
   247  	if err != nil {
   248  		t.Fatalf("Error loading chart: %v", err)
   249  	}
   250  	_ = release.Mock(&release.MockReleaseOptions{
   251  		Name:  releaseName,
   252  		Chart: ch,
   253  	})
   254  
   255  	relMock := func(n string, v int, ch *chart.Chart) *release.Release {
   256  		return release.Mock(&release.MockReleaseOptions{Name: n, Version: v, Chart: ch})
   257  	}
   258  
   259  	return relMock, ch, chartPath
   260  }