github.com/gridai/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 }