github.com/appscode/helm@v3.0.0-alpha.1+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  	"path/filepath"
    22  	"testing"
    23  
    24  	"helm.sh/helm/pkg/chart"
    25  	"helm.sh/helm/pkg/chart/loader"
    26  	"helm.sh/helm/pkg/chartutil"
    27  	"helm.sh/helm/pkg/release"
    28  )
    29  
    30  func TestUpgradeCmd(t *testing.T) {
    31  	tmpChart := testTempDir(t)
    32  	cfile := &chart.Chart{
    33  		Metadata: &chart.Metadata{
    34  			APIVersion:  chart.APIVersionV1,
    35  			Name:        "testUpgradeChart",
    36  			Description: "A Helm chart for Kubernetes",
    37  			Version:     "0.1.0",
    38  		},
    39  	}
    40  	chartPath := filepath.Join(tmpChart, cfile.Metadata.Name)
    41  	if err := chartutil.SaveDir(cfile, tmpChart); err != nil {
    42  		t.Fatalf("Error creating chart for upgrade: %v", err)
    43  	}
    44  	ch, err := loader.Load(chartPath)
    45  	if err != nil {
    46  		t.Fatalf("Error loading chart: %v", err)
    47  	}
    48  	_ = release.Mock(&release.MockReleaseOptions{
    49  		Name:  "funny-bunny",
    50  		Chart: ch,
    51  	})
    52  
    53  	// update chart version
    54  	cfile.Metadata.Version = "0.1.2"
    55  
    56  	if err := chartutil.SaveDir(cfile, tmpChart); err != nil {
    57  		t.Fatalf("Error creating chart: %v", err)
    58  	}
    59  	ch, err = loader.Load(chartPath)
    60  	if err != nil {
    61  		t.Fatalf("Error loading updated chart: %v", err)
    62  	}
    63  
    64  	// update chart version again
    65  	cfile.Metadata.Version = "0.1.3"
    66  
    67  	if err := chartutil.SaveDir(cfile, tmpChart); err != nil {
    68  		t.Fatalf("Error creating chart: %v", err)
    69  	}
    70  	var ch2 *chart.Chart
    71  	ch2, err = loader.Load(chartPath)
    72  	if err != nil {
    73  		t.Fatalf("Error loading updated chart: %v", err)
    74  	}
    75  
    76  	missingDepsPath := "testdata/testcharts/chart-missing-deps"
    77  	badDepsPath := "testdata/testcharts/chart-bad-requirements"
    78  
    79  	relMock := func(n string, v int, ch *chart.Chart) *release.Release {
    80  		return release.Mock(&release.MockReleaseOptions{Name: n, Version: v, Chart: ch})
    81  	}
    82  
    83  	tests := []cmdTestCase{
    84  		{
    85  			name:   "upgrade a release",
    86  			cmd:    fmt.Sprintf("upgrade funny-bunny '%s'", chartPath),
    87  			golden: "output/upgrade.txt",
    88  			rels:   []*release.Release{relMock("funny-bunny", 2, ch)},
    89  		},
    90  		{
    91  			name:   "upgrade a release with timeout",
    92  			cmd:    fmt.Sprintf("upgrade funny-bunny --timeout 120s '%s'", chartPath),
    93  			golden: "output/upgrade-with-timeout.txt",
    94  			rels:   []*release.Release{relMock("funny-bunny", 3, ch2)},
    95  		},
    96  		{
    97  			name:   "upgrade a release with --reset-values",
    98  			cmd:    fmt.Sprintf("upgrade funny-bunny --reset-values '%s'", chartPath),
    99  			golden: "output/upgrade-with-reset-values.txt",
   100  			rels:   []*release.Release{relMock("funny-bunny", 4, ch2)},
   101  		},
   102  		{
   103  			name:   "upgrade a release with --reuse-values",
   104  			cmd:    fmt.Sprintf("upgrade funny-bunny --reuse-values '%s'", chartPath),
   105  			golden: "output/upgrade-with-reset-values2.txt",
   106  			rels:   []*release.Release{relMock("funny-bunny", 5, ch2)},
   107  		},
   108  		{
   109  			name:   "install a release with 'upgrade --install'",
   110  			cmd:    fmt.Sprintf("upgrade zany-bunny -i '%s'", chartPath),
   111  			golden: "output/upgrade-with-install.txt",
   112  			rels:   []*release.Release{relMock("zany-bunny", 1, ch)},
   113  		},
   114  		{
   115  			name:   "install a release with 'upgrade --install' and timeout",
   116  			cmd:    fmt.Sprintf("upgrade crazy-bunny -i --timeout 120s '%s'", chartPath),
   117  			golden: "output/upgrade-with-install-timeout.txt",
   118  			rels:   []*release.Release{relMock("crazy-bunny", 1, ch)},
   119  		},
   120  		{
   121  			name:   "upgrade a release with wait",
   122  			cmd:    fmt.Sprintf("upgrade crazy-bunny --wait '%s'", chartPath),
   123  			golden: "output/upgrade-with-wait.txt",
   124  			rels:   []*release.Release{relMock("crazy-bunny", 2, ch2)},
   125  		},
   126  		{
   127  			name:      "upgrade a release with missing dependencies",
   128  			cmd:       fmt.Sprintf("upgrade bonkers-bunny%s", missingDepsPath),
   129  			golden:    "output/upgrade-with-missing-dependencies.txt",
   130  			wantError: true,
   131  		},
   132  		{
   133  			name:      "upgrade a release with bad dependencies",
   134  			cmd:       fmt.Sprintf("upgrade bonkers-bunny '%s'", badDepsPath),
   135  			golden:    "output/upgrade-with-bad-dependencies.txt",
   136  			wantError: true,
   137  		},
   138  	}
   139  	runTestCmd(t, tests)
   140  }