| 
									
										
										
										
											2016-08-01 13:22:50 +08:00
										 |  |  | /* | 
					
						
							| 
									
										
										
										
											2018-08-25 03:03:55 +08:00
										 |  |  | Copyright The Helm Authors. | 
					
						
							| 
									
										
										
										
											2016-08-01 13:22:50 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | Licensed under the Apache License, Version 2.0 (the "License"); | 
					
						
							|  |  |  | you may not use this file except in compliance with the License. | 
					
						
							|  |  |  | You may obtain a copy of the License at | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     http://www.apache.org/licenses/LICENSE-2.0
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Unless required by applicable law or agreed to in writing, software | 
					
						
							|  |  |  | distributed under the License is distributed on an "AS IS" BASIS, | 
					
						
							|  |  |  | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
					
						
							|  |  |  | See the License for the specific language governing permissions and | 
					
						
							|  |  |  | limitations under the License. | 
					
						
							|  |  |  | */ | 
					
						
							| 
									
										
										
										
											2016-08-06 00:14:12 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-13 07:06:06 +08:00
										 |  |  | package storage // import "helm.sh/helm/pkg/storage"
 | 
					
						
							| 
									
										
										
										
											2016-08-01 13:22:50 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2016-09-08 22:39:26 +08:00
										 |  |  | 	"fmt" | 
					
						
							|  |  |  | 	"reflect" | 
					
						
							|  |  |  | 	"testing" | 
					
						
							| 
									
										
										
										
											2016-08-01 13:22:50 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-13 07:06:06 +08:00
										 |  |  | 	rspb "helm.sh/helm/pkg/release" | 
					
						
							|  |  |  | 	"helm.sh/helm/pkg/storage/driver" | 
					
						
							| 
									
										
										
										
											2016-08-01 13:22:50 +08:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-02 07:44:36 +08:00
										 |  |  | func TestStorageCreate(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2016-09-08 22:39:26 +08:00
										 |  |  | 	// initialize storage
 | 
					
						
							|  |  |  | 	storage := Init(driver.NewMemory()) | 
					
						
							| 
									
										
										
										
											2016-08-10 01:45:17 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-08 22:39:26 +08:00
										 |  |  | 	// create fake release
 | 
					
						
							|  |  |  | 	rls := ReleaseTestData{ | 
					
						
							|  |  |  | 		Name:    "angry-beaver", | 
					
						
							|  |  |  | 		Version: 1, | 
					
						
							|  |  |  | 	}.ToRelease() | 
					
						
							| 
									
										
										
										
											2016-08-01 13:22:50 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-08 22:39:26 +08:00
										 |  |  | 	assertErrNil(t.Fatal, storage.Create(rls), "StoreRelease") | 
					
						
							| 
									
										
										
										
											2016-08-02 07:44:36 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-08 22:39:26 +08:00
										 |  |  | 	// fetch the release
 | 
					
						
							|  |  |  | 	res, err := storage.Get(rls.Name, rls.Version) | 
					
						
							|  |  |  | 	assertErrNil(t.Fatal, err, "QueryRelease") | 
					
						
							| 
									
										
										
										
											2016-09-02 03:07:12 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-08 22:39:26 +08:00
										 |  |  | 	// verify the fetched and created release are the same
 | 
					
						
							|  |  |  | 	if !reflect.DeepEqual(rls, res) { | 
					
						
							| 
									
										
										
										
											2018-04-19 05:53:38 +08:00
										 |  |  | 		t.Fatalf("Expected %v, got %v", rls, res) | 
					
						
							| 
									
										
										
										
											2016-09-08 22:39:26 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-08-01 13:22:50 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-02 07:44:36 +08:00
										 |  |  | func TestStorageUpdate(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2016-09-08 22:39:26 +08:00
										 |  |  | 	// initialize storage
 | 
					
						
							|  |  |  | 	storage := Init(driver.NewMemory()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// create fake release
 | 
					
						
							|  |  |  | 	rls := ReleaseTestData{ | 
					
						
							|  |  |  | 		Name:    "angry-beaver", | 
					
						
							|  |  |  | 		Version: 1, | 
					
						
							| 
									
										
										
										
											2018-04-27 07:52:31 +08:00
										 |  |  | 		Status:  rspb.StatusDeployed, | 
					
						
							| 
									
										
										
										
											2016-09-08 22:39:26 +08:00
										 |  |  | 	}.ToRelease() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	assertErrNil(t.Fatal, storage.Create(rls), "StoreRelease") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// modify the release
 | 
					
						
							| 
									
										
										
										
											2018-06-15 06:25:45 +08:00
										 |  |  | 	rls.Info.Status = rspb.StatusUninstalled | 
					
						
							| 
									
										
										
										
											2016-09-08 22:39:26 +08:00
										 |  |  | 	assertErrNil(t.Fatal, storage.Update(rls), "UpdateRelease") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// retrieve the updated release
 | 
					
						
							|  |  |  | 	res, err := storage.Get(rls.Name, rls.Version) | 
					
						
							|  |  |  | 	assertErrNil(t.Fatal, err, "QueryRelease") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// verify updated and fetched releases are the same.
 | 
					
						
							|  |  |  | 	if !reflect.DeepEqual(rls, res) { | 
					
						
							| 
									
										
										
										
											2018-04-19 05:53:38 +08:00
										 |  |  | 		t.Fatalf("Expected %v, got %v", rls, res) | 
					
						
							| 
									
										
										
										
											2016-09-08 22:39:26 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-08-01 13:22:50 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-02 07:44:36 +08:00
										 |  |  | func TestStorageDelete(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2016-09-08 22:39:26 +08:00
										 |  |  | 	// initialize storage
 | 
					
						
							|  |  |  | 	storage := Init(driver.NewMemory()) | 
					
						
							| 
									
										
										
										
											2016-09-02 03:07:12 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-08 22:39:26 +08:00
										 |  |  | 	// create fake release
 | 
					
						
							|  |  |  | 	rls := ReleaseTestData{ | 
					
						
							|  |  |  | 		Name:    "angry-beaver", | 
					
						
							|  |  |  | 		Version: 1, | 
					
						
							|  |  |  | 	}.ToRelease() | 
					
						
							| 
									
										
										
										
											2017-06-30 07:28:12 +08:00
										 |  |  | 	rls2 := ReleaseTestData{ | 
					
						
							|  |  |  | 		Name:    "angry-beaver", | 
					
						
							|  |  |  | 		Version: 2, | 
					
						
							|  |  |  | 	}.ToRelease() | 
					
						
							| 
									
										
										
										
											2016-08-10 01:45:17 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-08 22:39:26 +08:00
										 |  |  | 	assertErrNil(t.Fatal, storage.Create(rls), "StoreRelease") | 
					
						
							| 
									
										
										
										
											2017-06-30 07:28:12 +08:00
										 |  |  | 	assertErrNil(t.Fatal, storage.Create(rls2), "StoreRelease") | 
					
						
							| 
									
										
										
										
											2016-08-01 13:34:50 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-08 22:39:26 +08:00
										 |  |  | 	// delete the release
 | 
					
						
							|  |  |  | 	res, err := storage.Delete(rls.Name, rls.Version) | 
					
						
							|  |  |  | 	assertErrNil(t.Fatal, err, "DeleteRelease") | 
					
						
							| 
									
										
										
										
											2016-08-01 13:22:50 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-08 22:39:26 +08:00
										 |  |  | 	// verify updated and fetched releases are the same.
 | 
					
						
							|  |  |  | 	if !reflect.DeepEqual(rls, res) { | 
					
						
							| 
									
										
										
										
											2018-04-19 05:53:38 +08:00
										 |  |  | 		t.Fatalf("Expected %v, got %v", rls, res) | 
					
						
							| 
									
										
										
										
											2016-09-08 22:39:26 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-06-30 07:28:12 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	hist, err := storage.History(rls.Name) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Errorf("unexpected error: %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// We have now deleted one of the two records.
 | 
					
						
							|  |  |  | 	if len(hist) != 1 { | 
					
						
							|  |  |  | 		t.Errorf("expected 1 record for deleted release version, got %d", len(hist)) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if hist[0].Version != 2 { | 
					
						
							|  |  |  | 		t.Errorf("Expected version to be 2, got %d", hist[0].Version) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-08-01 13:22:50 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-02 07:44:36 +08:00
										 |  |  | func TestStorageList(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2016-09-08 22:39:26 +08:00
										 |  |  | 	// initialize storage
 | 
					
						
							|  |  |  | 	storage := Init(driver.NewMemory()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// setup storage with test releases
 | 
					
						
							|  |  |  | 	setup := func() { | 
					
						
							|  |  |  | 		// release records
 | 
					
						
							| 
									
										
										
										
											2018-04-27 07:52:31 +08:00
										 |  |  | 		rls0 := ReleaseTestData{Name: "happy-catdog", Status: rspb.StatusSuperseded}.ToRelease() | 
					
						
							|  |  |  | 		rls1 := ReleaseTestData{Name: "livid-human", Status: rspb.StatusSuperseded}.ToRelease() | 
					
						
							|  |  |  | 		rls2 := ReleaseTestData{Name: "relaxed-cat", Status: rspb.StatusSuperseded}.ToRelease() | 
					
						
							|  |  |  | 		rls3 := ReleaseTestData{Name: "hungry-hippo", Status: rspb.StatusDeployed}.ToRelease() | 
					
						
							|  |  |  | 		rls4 := ReleaseTestData{Name: "angry-beaver", Status: rspb.StatusDeployed}.ToRelease() | 
					
						
							| 
									
										
										
										
											2018-06-15 06:25:45 +08:00
										 |  |  | 		rls5 := ReleaseTestData{Name: "opulent-frog", Status: rspb.StatusUninstalled}.ToRelease() | 
					
						
							|  |  |  | 		rls6 := ReleaseTestData{Name: "happy-liger", Status: rspb.StatusUninstalled}.ToRelease() | 
					
						
							| 
									
										
										
										
											2016-09-08 22:39:26 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		// create the release records in the storage
 | 
					
						
							|  |  |  | 		assertErrNil(t.Fatal, storage.Create(rls0), "Storing release 'rls0'") | 
					
						
							|  |  |  | 		assertErrNil(t.Fatal, storage.Create(rls1), "Storing release 'rls1'") | 
					
						
							|  |  |  | 		assertErrNil(t.Fatal, storage.Create(rls2), "Storing release 'rls2'") | 
					
						
							|  |  |  | 		assertErrNil(t.Fatal, storage.Create(rls3), "Storing release 'rls3'") | 
					
						
							|  |  |  | 		assertErrNil(t.Fatal, storage.Create(rls4), "Storing release 'rls4'") | 
					
						
							|  |  |  | 		assertErrNil(t.Fatal, storage.Create(rls5), "Storing release 'rls5'") | 
					
						
							|  |  |  | 		assertErrNil(t.Fatal, storage.Create(rls6), "Storing release 'rls6'") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var listTests = []struct { | 
					
						
							|  |  |  | 		Description string | 
					
						
							|  |  |  | 		NumExpected int | 
					
						
							|  |  |  | 		ListFunc    func() ([]*rspb.Release, error) | 
					
						
							|  |  |  | 	}{ | 
					
						
							|  |  |  | 		{"ListDeployed", 2, storage.ListDeployed}, | 
					
						
							|  |  |  | 		{"ListReleases", 7, storage.ListReleases}, | 
					
						
							| 
									
										
										
										
											2018-06-15 06:25:45 +08:00
										 |  |  | 		{"ListUninstalled", 2, storage.ListUninstalled}, | 
					
						
							| 
									
										
										
										
											2016-09-08 22:39:26 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	setup() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for _, tt := range listTests { | 
					
						
							|  |  |  | 		list, err := tt.ListFunc() | 
					
						
							|  |  |  | 		assertErrNil(t.Fatal, err, tt.Description) | 
					
						
							|  |  |  | 		// verify the count of releases returned
 | 
					
						
							|  |  |  | 		if len(list) != tt.NumExpected { | 
					
						
							|  |  |  | 			t.Errorf("ListReleases(%s): expected %d, actual %d", | 
					
						
							|  |  |  | 				tt.Description, | 
					
						
							|  |  |  | 				tt.NumExpected, | 
					
						
							|  |  |  | 				len(list)) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-09-02 03:07:12 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestStorageDeployed(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2016-09-08 22:39:26 +08:00
										 |  |  | 	storage := Init(driver.NewMemory()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	const name = "angry-bird" | 
					
						
							| 
									
										
										
										
											2018-04-20 02:09:42 +08:00
										 |  |  | 	const vers = 4 | 
					
						
							| 
									
										
										
										
											2016-09-08 22:39:26 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// setup storage with test releases
 | 
					
						
							|  |  |  | 	setup := func() { | 
					
						
							|  |  |  | 		// release records
 | 
					
						
							| 
									
										
										
										
											2018-04-27 07:52:31 +08:00
										 |  |  | 		rls0 := ReleaseTestData{Name: name, Version: 1, Status: rspb.StatusSuperseded}.ToRelease() | 
					
						
							|  |  |  | 		rls1 := ReleaseTestData{Name: name, Version: 2, Status: rspb.StatusSuperseded}.ToRelease() | 
					
						
							|  |  |  | 		rls2 := ReleaseTestData{Name: name, Version: 3, Status: rspb.StatusSuperseded}.ToRelease() | 
					
						
							|  |  |  | 		rls3 := ReleaseTestData{Name: name, Version: 4, Status: rspb.StatusDeployed}.ToRelease() | 
					
						
							| 
									
										
										
										
											2016-09-08 22:39:26 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		// create the release records in the storage
 | 
					
						
							|  |  |  | 		assertErrNil(t.Fatal, storage.Create(rls0), "Storing release 'angry-bird' (v1)") | 
					
						
							|  |  |  | 		assertErrNil(t.Fatal, storage.Create(rls1), "Storing release 'angry-bird' (v2)") | 
					
						
							|  |  |  | 		assertErrNil(t.Fatal, storage.Create(rls2), "Storing release 'angry-bird' (v3)") | 
					
						
							|  |  |  | 		assertErrNil(t.Fatal, storage.Create(rls3), "Storing release 'angry-bird' (v4)") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	setup() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-30 07:28:12 +08:00
										 |  |  | 	rls, err := storage.Last(name) | 
					
						
							| 
									
										
										
										
											2016-09-08 22:39:26 +08:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("Failed to query for deployed release: %s\n", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	switch { | 
					
						
							|  |  |  | 	case rls == nil: | 
					
						
							|  |  |  | 		t.Fatalf("Release is nil") | 
					
						
							|  |  |  | 	case rls.Name != name: | 
					
						
							|  |  |  | 		t.Fatalf("Expected release name %q, actual %q\n", name, rls.Name) | 
					
						
							|  |  |  | 	case rls.Version != vers: | 
					
						
							|  |  |  | 		t.Fatalf("Expected release version %d, actual %d\n", vers, rls.Version) | 
					
						
							| 
									
										
										
										
											2018-04-27 07:52:31 +08:00
										 |  |  | 	case rls.Info.Status != rspb.StatusDeployed: | 
					
						
							|  |  |  | 		t.Fatalf("Expected release status 'DEPLOYED', actual %s\n", rls.Info.Status.String()) | 
					
						
							| 
									
										
										
										
											2016-09-08 22:39:26 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-08-02 07:44:36 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2016-08-01 13:22:50 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-05 04:33:02 +08:00
										 |  |  | func TestStorageHistory(t *testing.T) { | 
					
						
							|  |  |  | 	storage := Init(driver.NewMemory()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	const name = "angry-bird" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// setup storage with test releases
 | 
					
						
							|  |  |  | 	setup := func() { | 
					
						
							|  |  |  | 		// release records
 | 
					
						
							| 
									
										
										
										
											2018-04-27 07:52:31 +08:00
										 |  |  | 		rls0 := ReleaseTestData{Name: name, Version: 1, Status: rspb.StatusSuperseded}.ToRelease() | 
					
						
							|  |  |  | 		rls1 := ReleaseTestData{Name: name, Version: 2, Status: rspb.StatusSuperseded}.ToRelease() | 
					
						
							|  |  |  | 		rls2 := ReleaseTestData{Name: name, Version: 3, Status: rspb.StatusSuperseded}.ToRelease() | 
					
						
							|  |  |  | 		rls3 := ReleaseTestData{Name: name, Version: 4, Status: rspb.StatusDeployed}.ToRelease() | 
					
						
							| 
									
										
										
										
											2016-10-05 04:33:02 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		// create the release records in the storage
 | 
					
						
							|  |  |  | 		assertErrNil(t.Fatal, storage.Create(rls0), "Storing release 'angry-bird' (v1)") | 
					
						
							|  |  |  | 		assertErrNil(t.Fatal, storage.Create(rls1), "Storing release 'angry-bird' (v2)") | 
					
						
							|  |  |  | 		assertErrNil(t.Fatal, storage.Create(rls2), "Storing release 'angry-bird' (v3)") | 
					
						
							|  |  |  | 		assertErrNil(t.Fatal, storage.Create(rls3), "Storing release 'angry-bird' (v4)") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	setup() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	h, err := storage.History(name) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("Failed to query for release history (%q): %s\n", name, err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if len(h) != 4 { | 
					
						
							|  |  |  | 		t.Fatalf("Release history (%q) is empty\n", name) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-30 07:28:12 +08:00
										 |  |  | func TestStorageRemoveLeastRecent(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2016-12-03 08:14:07 +08:00
										 |  |  | 	storage := Init(driver.NewMemory()) | 
					
						
							| 
									
										
										
										
											2017-06-30 07:28:12 +08:00
										 |  |  | 	storage.Log = t.Logf | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Make sure that specifying this at the outset doesn't cause any bugs.
 | 
					
						
							|  |  |  | 	storage.MaxHistory = 10 | 
					
						
							| 
									
										
										
										
											2016-12-03 08:14:07 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	const name = "angry-bird" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// setup storage with test releases
 | 
					
						
							| 
									
										
										
										
											2017-06-30 07:28:12 +08:00
										 |  |  | 	setup := func() { | 
					
						
							|  |  |  | 		// release records
 | 
					
						
							| 
									
										
										
										
											2018-04-27 07:52:31 +08:00
										 |  |  | 		rls0 := ReleaseTestData{Name: name, Version: 1, Status: rspb.StatusSuperseded}.ToRelease() | 
					
						
							|  |  |  | 		rls1 := ReleaseTestData{Name: name, Version: 2, Status: rspb.StatusSuperseded}.ToRelease() | 
					
						
							|  |  |  | 		rls2 := ReleaseTestData{Name: name, Version: 3, Status: rspb.StatusSuperseded}.ToRelease() | 
					
						
							|  |  |  | 		rls3 := ReleaseTestData{Name: name, Version: 4, Status: rspb.StatusDeployed}.ToRelease() | 
					
						
							| 
									
										
										
										
											2017-06-30 07:28:12 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		// create the release records in the storage
 | 
					
						
							|  |  |  | 		assertErrNil(t.Fatal, storage.Create(rls0), "Storing release 'angry-bird' (v1)") | 
					
						
							|  |  |  | 		assertErrNil(t.Fatal, storage.Create(rls1), "Storing release 'angry-bird' (v2)") | 
					
						
							|  |  |  | 		assertErrNil(t.Fatal, storage.Create(rls2), "Storing release 'angry-bird' (v3)") | 
					
						
							|  |  |  | 		assertErrNil(t.Fatal, storage.Create(rls3), "Storing release 'angry-bird' (v4)") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	setup() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Because we have not set a limit, we expect 4.
 | 
					
						
							|  |  |  | 	expect := 4 | 
					
						
							|  |  |  | 	if hist, err := storage.History(name); err != nil { | 
					
						
							|  |  |  | 		t.Fatal(err) | 
					
						
							|  |  |  | 	} else if len(hist) != expect { | 
					
						
							|  |  |  | 		t.Fatalf("expected %d items in history, got %d", expect, len(hist)) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	storage.MaxHistory = 3 | 
					
						
							| 
									
										
										
										
											2018-04-27 07:52:31 +08:00
										 |  |  | 	rls5 := ReleaseTestData{Name: name, Version: 5, Status: rspb.StatusDeployed}.ToRelease() | 
					
						
							| 
									
										
										
										
											2017-06-30 07:28:12 +08:00
										 |  |  | 	assertErrNil(t.Fatal, storage.Create(rls5), "Storing release 'angry-bird' (v5)") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// On inserting the 5th record, we expect two records to be pruned from history.
 | 
					
						
							|  |  |  | 	hist, err := storage.History(name) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Fatal(err) | 
					
						
							|  |  |  | 	} else if len(hist) != storage.MaxHistory { | 
					
						
							|  |  |  | 		for _, item := range hist { | 
					
						
							|  |  |  | 			t.Logf("%s %v", item.Name, item.Version) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		t.Fatalf("expected %d items in history, got %d", storage.MaxHistory, len(hist)) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// We expect the existing records to be 3, 4, and 5.
 | 
					
						
							|  |  |  | 	for i, item := range hist { | 
					
						
							| 
									
										
										
										
											2018-04-20 02:09:42 +08:00
										 |  |  | 		v := item.Version | 
					
						
							| 
									
										
										
										
											2017-06-30 07:28:12 +08:00
										 |  |  | 		if expect := i + 3; v != expect { | 
					
						
							|  |  |  | 			t.Errorf("Expected release %d, got %d", expect, v) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestStorageLast(t *testing.T) { | 
					
						
							|  |  |  | 	storage := Init(driver.NewMemory()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	const name = "angry-bird" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Set up storage with test releases.
 | 
					
						
							| 
									
										
										
										
											2016-12-03 08:14:07 +08:00
										 |  |  | 	setup := func() { | 
					
						
							|  |  |  | 		// release records
 | 
					
						
							| 
									
										
										
										
											2018-04-27 07:52:31 +08:00
										 |  |  | 		rls0 := ReleaseTestData{Name: name, Version: 1, Status: rspb.StatusSuperseded}.ToRelease() | 
					
						
							|  |  |  | 		rls1 := ReleaseTestData{Name: name, Version: 2, Status: rspb.StatusSuperseded}.ToRelease() | 
					
						
							|  |  |  | 		rls2 := ReleaseTestData{Name: name, Version: 3, Status: rspb.StatusSuperseded}.ToRelease() | 
					
						
							|  |  |  | 		rls3 := ReleaseTestData{Name: name, Version: 4, Status: rspb.StatusFailed}.ToRelease() | 
					
						
							| 
									
										
										
										
											2016-12-03 08:14:07 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		// create the release records in the storage
 | 
					
						
							|  |  |  | 		assertErrNil(t.Fatal, storage.Create(rls0), "Storing release 'angry-bird' (v1)") | 
					
						
							|  |  |  | 		assertErrNil(t.Fatal, storage.Create(rls1), "Storing release 'angry-bird' (v2)") | 
					
						
							|  |  |  | 		assertErrNil(t.Fatal, storage.Create(rls2), "Storing release 'angry-bird' (v3)") | 
					
						
							|  |  |  | 		assertErrNil(t.Fatal, storage.Create(rls3), "Storing release 'angry-bird' (v4)") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	setup() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	h, err := storage.Last(name) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("Failed to query for release history (%q): %s\n", name, err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if h.Version != 4 { | 
					
						
							|  |  |  | 		t.Errorf("Expected revision 4, got %d", h.Version) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-02 07:44:36 +08:00
										 |  |  | type ReleaseTestData struct { | 
					
						
							| 
									
										
										
										
											2016-09-08 22:39:26 +08:00
										 |  |  | 	Name      string | 
					
						
							| 
									
										
										
										
											2018-04-20 02:09:42 +08:00
										 |  |  | 	Version   int | 
					
						
							| 
									
										
										
										
											2016-09-08 22:39:26 +08:00
										 |  |  | 	Manifest  string | 
					
						
							|  |  |  | 	Namespace string | 
					
						
							| 
									
										
										
										
											2019-02-13 02:18:33 +08:00
										 |  |  | 	Status    rspb.Status | 
					
						
							| 
									
										
										
										
											2016-08-02 07:44:36 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (test ReleaseTestData) ToRelease() *rspb.Release { | 
					
						
							| 
									
										
										
										
											2016-09-08 22:39:26 +08:00
										 |  |  | 	return &rspb.Release{ | 
					
						
							|  |  |  | 		Name:      test.Name, | 
					
						
							|  |  |  | 		Version:   test.Version, | 
					
						
							|  |  |  | 		Manifest:  test.Manifest, | 
					
						
							|  |  |  | 		Namespace: test.Namespace, | 
					
						
							| 
									
										
										
										
											2018-04-27 07:52:31 +08:00
										 |  |  | 		Info:      &rspb.Info{Status: test.Status}, | 
					
						
							| 
									
										
										
										
											2016-09-08 22:39:26 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-08-02 07:44:36 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2016-08-01 13:34:50 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-02 07:44:36 +08:00
										 |  |  | func assertErrNil(eh func(args ...interface{}), err error, message string) { | 
					
						
							| 
									
										
										
										
											2016-09-08 22:39:26 +08:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		eh(fmt.Sprintf("%s: %q", message, err)) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-08-02 07:44:36 +08:00
										 |  |  | } |