github.com/cloudposse/helm@v2.2.3+incompatible/pkg/helm/helm_test.go (about) 1 /* 2 Copyright 2016 The Kubernetes Authors All rights reserved. 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 helm // import "k8s.io/helm/pkg/helm" 18 19 import ( 20 "errors" 21 "path/filepath" 22 "reflect" 23 "testing" 24 25 "github.com/golang/protobuf/proto" 26 "golang.org/x/net/context" 27 28 "k8s.io/helm/pkg/chartutil" 29 cpb "k8s.io/helm/pkg/proto/hapi/chart" 30 rls "k8s.io/helm/pkg/proto/hapi/release" 31 tpb "k8s.io/helm/pkg/proto/hapi/services" 32 ) 33 34 // path to example charts relative to pkg/helm. 35 const chartsDir = "../../docs/examples/" 36 37 // sentinel error to indicate to the helm client to not send the request to tiller. 38 var errSkip = errors.New("test: skip") 39 40 // Verify ReleaseListOption's are applied to a ListReleasesRequest correctly. 41 func TestListReleases_VerifyOptions(t *testing.T) { 42 // Options testdata 43 var limit = 2 44 var offset = "offset" 45 var filter = "filter" 46 var sortBy = int32(2) 47 var sortOrd = int32(1) 48 var codes = []rls.Status_Code{ 49 rls.Status_FAILED, 50 rls.Status_DELETED, 51 rls.Status_DEPLOYED, 52 rls.Status_SUPERSEDED, 53 } 54 var namespace = "namespace" 55 56 // Expected ListReleasesRequest message 57 exp := &tpb.ListReleasesRequest{ 58 Limit: int64(limit), 59 Offset: offset, 60 Filter: filter, 61 SortBy: tpb.ListSort_SortBy(sortBy), 62 SortOrder: tpb.ListSort_SortOrder(sortOrd), 63 StatusCodes: codes, 64 Namespace: namespace, 65 } 66 67 // Options used in ListReleases 68 ops := []ReleaseListOption{ 69 ReleaseListSort(sortBy), 70 ReleaseListOrder(sortOrd), 71 ReleaseListLimit(limit), 72 ReleaseListOffset(offset), 73 ReleaseListFilter(filter), 74 ReleaseListStatuses(codes), 75 ReleaseListNamespace(namespace), 76 } 77 78 // BeforeCall option to intercept helm client ListReleasesRequest 79 b4c := BeforeCall(func(_ context.Context, msg proto.Message) error { 80 switch act := msg.(type) { 81 case *tpb.ListReleasesRequest: 82 t.Logf("ListReleasesRequest: %#+v\n", act) 83 assert(t, exp, act) 84 default: 85 t.Fatalf("expected message of type ListReleasesRequest, got %T\n", act) 86 } 87 return errSkip 88 }) 89 90 NewClient(b4c).ListReleases(ops...) 91 } 92 93 // Verify InstallOption's are applied to an InstallReleaseRequest correctly. 94 func TestInstallRelease_VerifyOptions(t *testing.T) { 95 // Options testdata 96 var disableHooks = true 97 var releaseName = "test" 98 var namespace = "default" 99 var reuseName = true 100 var dryRun = true 101 var chartName = "alpine" 102 var overrides = []byte("key1=value1,key2=value2") 103 104 // Expected InstallReleaseRequest message 105 exp := &tpb.InstallReleaseRequest{ 106 Chart: loadChart(t, chartName), 107 Values: &cpb.Config{Raw: string(overrides)}, 108 DryRun: dryRun, 109 Name: releaseName, 110 DisableHooks: disableHooks, 111 Namespace: namespace, 112 ReuseName: reuseName, 113 } 114 115 // Options used in InstallRelease 116 ops := []InstallOption{ 117 ValueOverrides(overrides), 118 InstallDryRun(dryRun), 119 ReleaseName(releaseName), 120 InstallReuseName(reuseName), 121 InstallDisableHooks(disableHooks), 122 } 123 124 // BeforeCall option to intercept helm client InstallReleaseRequest 125 b4c := BeforeCall(func(_ context.Context, msg proto.Message) error { 126 switch act := msg.(type) { 127 case *tpb.InstallReleaseRequest: 128 t.Logf("InstallReleaseRequest: %#+v\n", act) 129 assert(t, exp, act) 130 default: 131 t.Fatalf("expected message of type InstallReleaseRequest, got %T\n", act) 132 } 133 return errSkip 134 }) 135 136 NewClient(b4c).InstallRelease(chartName, namespace, ops...) 137 } 138 139 // Verify DeleteOptions's are applied to an UninstallReleaseRequest correctly. 140 func TestDeleteRelease_VerifyOptions(t *testing.T) { 141 // Options testdata 142 var releaseName = "test" 143 var disableHooks = true 144 var purgeFlag = true 145 146 // Expected DeleteReleaseRequest message 147 exp := &tpb.UninstallReleaseRequest{ 148 Name: releaseName, 149 Purge: purgeFlag, 150 DisableHooks: disableHooks, 151 } 152 153 // Options used in DeleteRelease 154 ops := []DeleteOption{ 155 DeletePurge(purgeFlag), 156 DeleteDisableHooks(disableHooks), 157 } 158 159 // BeforeCall option to intercept helm client DeleteReleaseRequest 160 b4c := BeforeCall(func(_ context.Context, msg proto.Message) error { 161 switch act := msg.(type) { 162 case *tpb.UninstallReleaseRequest: 163 t.Logf("UninstallReleaseRequest: %#+v\n", act) 164 assert(t, exp, act) 165 default: 166 t.Fatalf("expected message of type UninstallReleaseRequest, got %T\n", act) 167 } 168 return errSkip 169 }) 170 171 NewClient(b4c).DeleteRelease(releaseName, ops...) 172 } 173 174 // Verify UpdateOption's are applied to an UpdateReleaseRequest correctly. 175 func TestUpdateRelease_VerifyOptions(t *testing.T) { 176 // Options testdata 177 var chartName = "alpine" 178 var releaseName = "test" 179 var disableHooks = true 180 var overrides = []byte("key1=value1,key2=value2") 181 var dryRun = false 182 183 // Expected UpdateReleaseRequest message 184 exp := &tpb.UpdateReleaseRequest{ 185 Name: releaseName, 186 Chart: loadChart(t, chartName), 187 Values: &cpb.Config{Raw: string(overrides)}, 188 DryRun: dryRun, 189 DisableHooks: disableHooks, 190 } 191 192 // Options used in UpdateRelease 193 ops := []UpdateOption{ 194 UpgradeDryRun(dryRun), 195 UpdateValueOverrides(overrides), 196 UpgradeDisableHooks(disableHooks), 197 } 198 199 // BeforeCall option to intercept helm client UpdateReleaseRequest 200 b4c := BeforeCall(func(_ context.Context, msg proto.Message) error { 201 switch act := msg.(type) { 202 case *tpb.UpdateReleaseRequest: 203 t.Logf("UpdateReleaseRequest: %#+v\n", act) 204 assert(t, exp, act) 205 default: 206 t.Fatalf("expected message of type UpdateReleaseRequest, got %T\n", act) 207 } 208 return errSkip 209 }) 210 211 NewClient(b4c).UpdateRelease(releaseName, chartName, ops...) 212 } 213 214 // Verify RollbackOption's are applied to a RollbackReleaseRequest correctly. 215 func TestRollbackRelease_VerifyOptions(t *testing.T) { 216 // Options testdata 217 var disableHooks = true 218 var releaseName = "test" 219 var revision = int32(2) 220 var dryRun = true 221 222 // Expected RollbackReleaseRequest message 223 exp := &tpb.RollbackReleaseRequest{ 224 Name: releaseName, 225 DryRun: dryRun, 226 Version: revision, 227 DisableHooks: disableHooks, 228 } 229 230 // Options used in RollbackRelease 231 ops := []RollbackOption{ 232 RollbackDryRun(dryRun), 233 RollbackVersion(revision), 234 RollbackDisableHooks(disableHooks), 235 } 236 237 // BeforeCall option to intercept helm client RollbackReleaseRequest 238 b4c := BeforeCall(func(_ context.Context, msg proto.Message) error { 239 switch act := msg.(type) { 240 case *tpb.RollbackReleaseRequest: 241 t.Logf("RollbackReleaseRequest: %#+v\n", act) 242 assert(t, exp, act) 243 default: 244 t.Fatalf("expected message of type RollbackReleaseRequest, got %T\n", act) 245 } 246 return errSkip 247 }) 248 249 NewClient(b4c).RollbackRelease(releaseName, ops...) 250 } 251 252 // Verify StatusOption's are applied to a GetReleaseStatusRequest correctly. 253 func TestReleaseStatus_VerifyOptions(t *testing.T) { 254 // Options testdata 255 var releaseName = "test" 256 var revision = int32(2) 257 258 // Expected GetReleaseStatusRequest message 259 exp := &tpb.GetReleaseStatusRequest{ 260 Name: releaseName, 261 Version: revision, 262 } 263 264 // BeforeCall option to intercept helm client GetReleaseStatusRequest 265 b4c := BeforeCall(func(_ context.Context, msg proto.Message) error { 266 switch act := msg.(type) { 267 case *tpb.GetReleaseStatusRequest: 268 t.Logf("GetReleaseStatusRequest: %#+v\n", act) 269 assert(t, exp, act) 270 default: 271 t.Fatalf("expected message of type GetReleaseStatusRequest, got %T\n", act) 272 } 273 return errSkip 274 }) 275 276 NewClient(b4c).ReleaseStatus(releaseName, StatusReleaseVersion(revision)) 277 } 278 279 // Verify ContentOption's are applied to a GetReleaseContentRequest correctly. 280 func TestReleaseContent_VerifyOptions(t *testing.T) { 281 // Options testdata 282 var releaseName = "test" 283 var revision = int32(2) 284 285 // Expected GetReleaseContentRequest message 286 exp := &tpb.GetReleaseContentRequest{ 287 Name: releaseName, 288 Version: revision, 289 } 290 291 // BeforeCall option to intercept helm client GetReleaseContentRequest 292 b4c := BeforeCall(func(_ context.Context, msg proto.Message) error { 293 switch act := msg.(type) { 294 case *tpb.GetReleaseContentRequest: 295 t.Logf("GetReleaseContentRequest: %#+v\n", act) 296 assert(t, exp, act) 297 default: 298 t.Fatalf("expected message of type GetReleaseContentRequest, got %T\n", act) 299 } 300 return errSkip 301 }) 302 303 NewClient(b4c).ReleaseContent(releaseName, ContentReleaseVersion(revision)) 304 } 305 306 func assert(t *testing.T, expect, actual interface{}) { 307 if !reflect.DeepEqual(expect, actual) { 308 t.Fatalf("expected %#+v, actual %#+v\n", expect, actual) 309 } 310 } 311 312 func loadChart(t *testing.T, name string) *cpb.Chart { 313 c, err := chartutil.Load(filepath.Join(chartsDir, name)) 314 if err != nil { 315 t.Fatalf("failed to load test chart (%q): %s\n", name, err) 316 } 317 return c 318 }