github.com/sgoings/helm@v2.0.0-alpha.2.0.20170406211108-734e92851ac3+incompatible/pkg/storage/storage_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 storage // import "k8s.io/helm/pkg/storage"
    18  
    19  import (
    20  	"fmt"
    21  	"reflect"
    22  	"testing"
    23  
    24  	rspb "k8s.io/helm/pkg/proto/hapi/release"
    25  	"k8s.io/helm/pkg/storage/driver"
    26  )
    27  
    28  func TestStorageCreate(t *testing.T) {
    29  	// initialize storage
    30  	storage := Init(driver.NewMemory())
    31  
    32  	// create fake release
    33  	rls := ReleaseTestData{
    34  		Name:    "angry-beaver",
    35  		Version: 1,
    36  	}.ToRelease()
    37  
    38  	assertErrNil(t.Fatal, storage.Create(rls), "StoreRelease")
    39  
    40  	// fetch the release
    41  	res, err := storage.Get(rls.Name, rls.Version)
    42  	assertErrNil(t.Fatal, err, "QueryRelease")
    43  
    44  	// verify the fetched and created release are the same
    45  	if !reflect.DeepEqual(rls, res) {
    46  		t.Fatalf("Expected %q, got %q", rls, res)
    47  	}
    48  }
    49  
    50  func TestStorageUpdate(t *testing.T) {
    51  	// initialize storage
    52  	storage := Init(driver.NewMemory())
    53  
    54  	// create fake release
    55  	rls := ReleaseTestData{
    56  		Name:    "angry-beaver",
    57  		Version: 1,
    58  		Status:  rspb.Status_DEPLOYED,
    59  	}.ToRelease()
    60  
    61  	assertErrNil(t.Fatal, storage.Create(rls), "StoreRelease")
    62  
    63  	// modify the release
    64  	rls.Info.Status.Code = rspb.Status_DELETED
    65  	assertErrNil(t.Fatal, storage.Update(rls), "UpdateRelease")
    66  
    67  	// retrieve the updated release
    68  	res, err := storage.Get(rls.Name, rls.Version)
    69  	assertErrNil(t.Fatal, err, "QueryRelease")
    70  
    71  	// verify updated and fetched releases are the same.
    72  	if !reflect.DeepEqual(rls, res) {
    73  		t.Fatalf("Expected %q, got %q", rls, res)
    74  	}
    75  }
    76  
    77  func TestStorageDelete(t *testing.T) {
    78  	// initialize storage
    79  	storage := Init(driver.NewMemory())
    80  
    81  	// create fake release
    82  	rls := ReleaseTestData{
    83  		Name:    "angry-beaver",
    84  		Version: 1,
    85  	}.ToRelease()
    86  
    87  	assertErrNil(t.Fatal, storage.Create(rls), "StoreRelease")
    88  
    89  	// delete the release
    90  	res, err := storage.Delete(rls.Name, rls.Version)
    91  	assertErrNil(t.Fatal, err, "DeleteRelease")
    92  
    93  	// verify updated and fetched releases are the same.
    94  	if !reflect.DeepEqual(rls, res) {
    95  		t.Fatalf("Expected %q, got %q", rls, res)
    96  	}
    97  }
    98  
    99  func TestStorageList(t *testing.T) {
   100  	// initialize storage
   101  	storage := Init(driver.NewMemory())
   102  
   103  	// setup storage with test releases
   104  	setup := func() {
   105  		// release records
   106  		rls0 := ReleaseTestData{Name: "happy-catdog", Status: rspb.Status_SUPERSEDED}.ToRelease()
   107  		rls1 := ReleaseTestData{Name: "livid-human", Status: rspb.Status_SUPERSEDED}.ToRelease()
   108  		rls2 := ReleaseTestData{Name: "relaxed-cat", Status: rspb.Status_SUPERSEDED}.ToRelease()
   109  		rls3 := ReleaseTestData{Name: "hungry-hippo", Status: rspb.Status_DEPLOYED}.ToRelease()
   110  		rls4 := ReleaseTestData{Name: "angry-beaver", Status: rspb.Status_DEPLOYED}.ToRelease()
   111  		rls5 := ReleaseTestData{Name: "opulent-frog", Status: rspb.Status_DELETED}.ToRelease()
   112  		rls6 := ReleaseTestData{Name: "happy-liger", Status: rspb.Status_DELETED}.ToRelease()
   113  
   114  		// create the release records in the storage
   115  		assertErrNil(t.Fatal, storage.Create(rls0), "Storing release 'rls0'")
   116  		assertErrNil(t.Fatal, storage.Create(rls1), "Storing release 'rls1'")
   117  		assertErrNil(t.Fatal, storage.Create(rls2), "Storing release 'rls2'")
   118  		assertErrNil(t.Fatal, storage.Create(rls3), "Storing release 'rls3'")
   119  		assertErrNil(t.Fatal, storage.Create(rls4), "Storing release 'rls4'")
   120  		assertErrNil(t.Fatal, storage.Create(rls5), "Storing release 'rls5'")
   121  		assertErrNil(t.Fatal, storage.Create(rls6), "Storing release 'rls6'")
   122  	}
   123  
   124  	var listTests = []struct {
   125  		Description string
   126  		NumExpected int
   127  		ListFunc    func() ([]*rspb.Release, error)
   128  	}{
   129  		{"ListDeleted", 2, storage.ListDeleted},
   130  		{"ListDeployed", 2, storage.ListDeployed},
   131  		{"ListReleases", 7, storage.ListReleases},
   132  	}
   133  
   134  	setup()
   135  
   136  	for _, tt := range listTests {
   137  		list, err := tt.ListFunc()
   138  		assertErrNil(t.Fatal, err, tt.Description)
   139  		// verify the count of releases returned
   140  		if len(list) != tt.NumExpected {
   141  			t.Errorf("ListReleases(%s): expected %d, actual %d",
   142  				tt.Description,
   143  				tt.NumExpected,
   144  				len(list))
   145  		}
   146  	}
   147  }
   148  
   149  func TestStorageDeployed(t *testing.T) {
   150  	storage := Init(driver.NewMemory())
   151  
   152  	const name = "angry-bird"
   153  	const vers = int32(4)
   154  
   155  	// setup storage with test releases
   156  	setup := func() {
   157  		// release records
   158  		rls0 := ReleaseTestData{Name: name, Version: 1, Status: rspb.Status_SUPERSEDED}.ToRelease()
   159  		rls1 := ReleaseTestData{Name: name, Version: 2, Status: rspb.Status_SUPERSEDED}.ToRelease()
   160  		rls2 := ReleaseTestData{Name: name, Version: 3, Status: rspb.Status_SUPERSEDED}.ToRelease()
   161  		rls3 := ReleaseTestData{Name: name, Version: 4, Status: rspb.Status_DEPLOYED}.ToRelease()
   162  
   163  		// create the release records in the storage
   164  		assertErrNil(t.Fatal, storage.Create(rls0), "Storing release 'angry-bird' (v1)")
   165  		assertErrNil(t.Fatal, storage.Create(rls1), "Storing release 'angry-bird' (v2)")
   166  		assertErrNil(t.Fatal, storage.Create(rls2), "Storing release 'angry-bird' (v3)")
   167  		assertErrNil(t.Fatal, storage.Create(rls3), "Storing release 'angry-bird' (v4)")
   168  	}
   169  
   170  	setup()
   171  
   172  	rls, err := storage.Deployed(name)
   173  	if err != nil {
   174  		t.Fatalf("Failed to query for deployed release: %s\n", err)
   175  	}
   176  
   177  	switch {
   178  	case rls == nil:
   179  		t.Fatalf("Release is nil")
   180  	case rls.Name != name:
   181  		t.Fatalf("Expected release name %q, actual %q\n", name, rls.Name)
   182  	case rls.Version != vers:
   183  		t.Fatalf("Expected release version %d, actual %d\n", vers, rls.Version)
   184  	case rls.Info.Status.Code != rspb.Status_DEPLOYED:
   185  		t.Fatalf("Expected release status 'DEPLOYED', actual %s\n", rls.Info.Status.Code)
   186  	}
   187  }
   188  
   189  func TestStorageHistory(t *testing.T) {
   190  	storage := Init(driver.NewMemory())
   191  
   192  	const name = "angry-bird"
   193  
   194  	// setup storage with test releases
   195  	setup := func() {
   196  		// release records
   197  		rls0 := ReleaseTestData{Name: name, Version: 1, Status: rspb.Status_SUPERSEDED}.ToRelease()
   198  		rls1 := ReleaseTestData{Name: name, Version: 2, Status: rspb.Status_SUPERSEDED}.ToRelease()
   199  		rls2 := ReleaseTestData{Name: name, Version: 3, Status: rspb.Status_SUPERSEDED}.ToRelease()
   200  		rls3 := ReleaseTestData{Name: name, Version: 4, Status: rspb.Status_DEPLOYED}.ToRelease()
   201  
   202  		// create the release records in the storage
   203  		assertErrNil(t.Fatal, storage.Create(rls0), "Storing release 'angry-bird' (v1)")
   204  		assertErrNil(t.Fatal, storage.Create(rls1), "Storing release 'angry-bird' (v2)")
   205  		assertErrNil(t.Fatal, storage.Create(rls2), "Storing release 'angry-bird' (v3)")
   206  		assertErrNil(t.Fatal, storage.Create(rls3), "Storing release 'angry-bird' (v4)")
   207  	}
   208  
   209  	setup()
   210  
   211  	h, err := storage.History(name)
   212  	if err != nil {
   213  		t.Fatalf("Failed to query for release history (%q): %s\n", name, err)
   214  	}
   215  	if len(h) != 4 {
   216  		t.Fatalf("Release history (%q) is empty\n", name)
   217  	}
   218  }
   219  
   220  func TestStorageLast(t *testing.T) {
   221  	storage := Init(driver.NewMemory())
   222  
   223  	const name = "angry-bird"
   224  
   225  	// setup storage with test releases
   226  	setup := func() {
   227  		// release records
   228  		rls0 := ReleaseTestData{Name: name, Version: 1, Status: rspb.Status_SUPERSEDED}.ToRelease()
   229  		rls1 := ReleaseTestData{Name: name, Version: 2, Status: rspb.Status_SUPERSEDED}.ToRelease()
   230  		rls2 := ReleaseTestData{Name: name, Version: 3, Status: rspb.Status_SUPERSEDED}.ToRelease()
   231  		rls3 := ReleaseTestData{Name: name, Version: 4, Status: rspb.Status_FAILED}.ToRelease()
   232  
   233  		// create the release records in the storage
   234  		assertErrNil(t.Fatal, storage.Create(rls0), "Storing release 'angry-bird' (v1)")
   235  		assertErrNil(t.Fatal, storage.Create(rls1), "Storing release 'angry-bird' (v2)")
   236  		assertErrNil(t.Fatal, storage.Create(rls2), "Storing release 'angry-bird' (v3)")
   237  		assertErrNil(t.Fatal, storage.Create(rls3), "Storing release 'angry-bird' (v4)")
   238  	}
   239  
   240  	setup()
   241  
   242  	h, err := storage.Last(name)
   243  	if err != nil {
   244  		t.Fatalf("Failed to query for release history (%q): %s\n", name, err)
   245  	}
   246  
   247  	if h.Version != 4 {
   248  		t.Errorf("Expected revision 4, got %d", h.Version)
   249  	}
   250  }
   251  
   252  type ReleaseTestData struct {
   253  	Name      string
   254  	Version   int32
   255  	Manifest  string
   256  	Namespace string
   257  	Status    rspb.Status_Code
   258  }
   259  
   260  func (test ReleaseTestData) ToRelease() *rspb.Release {
   261  	return &rspb.Release{
   262  		Name:      test.Name,
   263  		Version:   test.Version,
   264  		Manifest:  test.Manifest,
   265  		Namespace: test.Namespace,
   266  		Info:      &rspb.Info{Status: &rspb.Status{Code: test.Status}},
   267  	}
   268  }
   269  
   270  func assertErrNil(eh func(args ...interface{}), err error, message string) {
   271  	if err != nil {
   272  		eh(fmt.Sprintf("%s: %q", message, err))
   273  	}
   274  }