github.com/danielqsj/helm@v2.0.0-alpha.4.0.20160908204436-976e0ba5199b+incompatible/pkg/storage/driver/cfgmaps_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 driver
    18  
    19  import (
    20  	"reflect"
    21  	"testing"
    22  
    23  	rspb "k8s.io/helm/pkg/proto/hapi/release"
    24  
    25  	"k8s.io/kubernetes/pkg/api"
    26  	kberrs "k8s.io/kubernetes/pkg/api/errors"
    27  	"k8s.io/kubernetes/pkg/client/unversioned"
    28  )
    29  
    30  var _ Driver = &ConfigMaps{}
    31  
    32  func TestConfigMapName(t *testing.T) {
    33  	c := newTestFixture(t)
    34  	if c.Name() != ConfigMapsDriverName {
    35  		t.Errorf("Expected name to be %q, got %q", ConfigMapsDriverName, c.Name())
    36  	}
    37  }
    38  
    39  func TestConfigMapGet(t *testing.T) {
    40  	key := "key-1"
    41  	rel := newTestRelease(key, 1, rspb.Status_DEPLOYED)
    42  
    43  	cfgmaps := newTestFixture(t, []*rspb.Release{rel}...)
    44  
    45  	// get release with key
    46  	got, err := cfgmaps.Get(key)
    47  	if err != nil {
    48  		t.Fatalf("Failed to get release: %s", err)
    49  	}
    50  	// compare fetched release with original
    51  	if !reflect.DeepEqual(rel, got) {
    52  		t.Errorf("Expected {%q}, got {%q}", rel, got)
    53  	}
    54  }
    55  
    56  func TestConfigMapList(t *testing.T) {
    57  	cfgmaps := newTestFixture(t, []*rspb.Release{
    58  		newTestRelease("key-1", 1, rspb.Status_DELETED),
    59  		newTestRelease("key-2", 1, rspb.Status_DELETED),
    60  		newTestRelease("key-3", 1, rspb.Status_DEPLOYED),
    61  		newTestRelease("key-4", 1, rspb.Status_DEPLOYED),
    62  		newTestRelease("key-5", 1, rspb.Status_SUPERSEDED),
    63  		newTestRelease("key-6", 1, rspb.Status_SUPERSEDED),
    64  	}...)
    65  
    66  	// list all deleted releases
    67  	del, err := cfgmaps.List(func(rel *rspb.Release) bool {
    68  		return rel.Info.Status.Code == rspb.Status_DELETED
    69  	})
    70  	// check
    71  	if err != nil {
    72  		t.Errorf("Failed to list deleted: %s", err)
    73  	}
    74  	if len(del) != 2 {
    75  		t.Errorf("Expected 2 deleted, got %d:\n%v\n", len(del), del)
    76  	}
    77  
    78  	// list all deployed releases
    79  	dpl, err := cfgmaps.List(func(rel *rspb.Release) bool {
    80  		return rel.Info.Status.Code == rspb.Status_DEPLOYED
    81  	})
    82  	// check
    83  	if err != nil {
    84  		t.Errorf("Failed to list deployed: %s", err)
    85  	}
    86  	if len(dpl) != 2 {
    87  		t.Errorf("Expected 2 deployed, got %d", len(dpl))
    88  	}
    89  
    90  	// list all superseded releases
    91  	ssd, err := cfgmaps.List(func(rel *rspb.Release) bool {
    92  		return rel.Info.Status.Code == rspb.Status_SUPERSEDED
    93  	})
    94  	// check
    95  	if err != nil {
    96  		t.Errorf("Failed to list superseded: %s", err)
    97  	}
    98  	if len(ssd) != 2 {
    99  		t.Errorf("Expected 2 superseded, got %d", len(ssd))
   100  	}
   101  }
   102  
   103  func TestConfigMapCreate(t *testing.T) {
   104  	cfgmaps := newTestFixture(t)
   105  
   106  	key := "key-1"
   107  	rel := newTestRelease(key, 1, rspb.Status_DEPLOYED)
   108  
   109  	// store the release in a configmap
   110  	if err := cfgmaps.Create(rel); err != nil {
   111  		t.Fatalf("Failed to create release with key %q: %s", key, err)
   112  	}
   113  
   114  	// get the release back
   115  	got, err := cfgmaps.Get(key)
   116  	if err != nil {
   117  		t.Fatalf("Failed to get release with key %q: %s", key, err)
   118  	}
   119  
   120  	// compare created release with original
   121  	if !reflect.DeepEqual(rel, got) {
   122  		t.Errorf("Expected {%q}, got {%q}", rel, got)
   123  	}
   124  }
   125  
   126  func TestConfigMapUpdate(t *testing.T) {
   127  	key := "key-1"
   128  	rel := newTestRelease(key, 1, rspb.Status_DEPLOYED)
   129  
   130  	cfgmaps := newTestFixture(t, []*rspb.Release{rel}...)
   131  
   132  	// modify release status code & version
   133  	rel = newTestRelease(key, 2, rspb.Status_SUPERSEDED)
   134  
   135  	// perform the update
   136  	if err := cfgmaps.Update(rel); err != nil {
   137  		t.Fatalf("Failed to update release: %s", err)
   138  	}
   139  
   140  	// fetch the updated release
   141  	got, err := cfgmaps.Get(key)
   142  	if err != nil {
   143  		t.Fatalf("Failed to get release with key %q: %s", key, err)
   144  	}
   145  
   146  	// check release has actually been updated by comparing modified fields
   147  	switch {
   148  	case rel.Info.Status.Code != got.Info.Status.Code:
   149  		t.Errorf("Expected status %s, got status %s", rel.Info.Status.Code, got.Info.Status.Code)
   150  	case rel.Version != got.Version:
   151  		t.Errorf("Expected version %d, got version %d", rel.Version, got.Version)
   152  	}
   153  }
   154  
   155  // newTestFixture initializes a MockConfigMapsInterface.
   156  // ConfigMaps are created for each release provided.
   157  func newTestFixture(t *testing.T, releases ...*rspb.Release) *ConfigMaps {
   158  	var mock MockConfigMapsInterface
   159  	mock.Init(t, releases...)
   160  
   161  	return NewConfigMaps(&mock)
   162  }
   163  
   164  // newTestRelease creates a release object for testing.
   165  func newTestRelease(key string, version int32, status rspb.Status_Code) *rspb.Release {
   166  	return &rspb.Release{Name: key, Info: &rspb.Info{Status: &rspb.Status{Code: status}}, Version: version}
   167  }
   168  
   169  // MockConfigMapsInterface mocks a kubernetes ConfigMapsInterface
   170  type MockConfigMapsInterface struct {
   171  	unversioned.ConfigMapsInterface
   172  
   173  	objects map[string]*api.ConfigMap
   174  }
   175  
   176  func (mock *MockConfigMapsInterface) Init(t *testing.T, releases ...*rspb.Release) {
   177  	mock.objects = map[string]*api.ConfigMap{}
   178  
   179  	for _, rls := range releases {
   180  		cfgmap, err := newConfigMapsObject(rls, nil)
   181  		if err != nil {
   182  			t.Fatalf("Failed to create configmap: %s", err)
   183  		}
   184  		mock.objects[rls.Name] = cfgmap
   185  	}
   186  }
   187  
   188  func (mock *MockConfigMapsInterface) Get(name string) (*api.ConfigMap, error) {
   189  	object, ok := mock.objects[name]
   190  	if !ok {
   191  		return nil, kberrs.NewNotFound(api.Resource("tests"), name)
   192  	}
   193  	return object, nil
   194  }
   195  
   196  func (mock *MockConfigMapsInterface) List(opts api.ListOptions) (*api.ConfigMapList, error) {
   197  	var list api.ConfigMapList
   198  	for _, cfgmap := range mock.objects {
   199  		list.Items = append(list.Items, *cfgmap)
   200  	}
   201  	return &list, nil
   202  }
   203  
   204  func (mock *MockConfigMapsInterface) Create(cfgmap *api.ConfigMap) (*api.ConfigMap, error) {
   205  	name := cfgmap.ObjectMeta.Name
   206  	if object, ok := mock.objects[name]; ok {
   207  		return object, kberrs.NewAlreadyExists(api.Resource("tests"), name)
   208  	}
   209  	mock.objects[name] = cfgmap
   210  	return cfgmap, nil
   211  }
   212  
   213  func (mock *MockConfigMapsInterface) Update(cfgmap *api.ConfigMap) (*api.ConfigMap, error) {
   214  	name := cfgmap.ObjectMeta.Name
   215  	if _, ok := mock.objects[name]; !ok {
   216  		return nil, kberrs.NewNotFound(api.Resource("tests"), name)
   217  	}
   218  	mock.objects[name] = cfgmap
   219  	return cfgmap, nil
   220  }
   221  
   222  func (mock *MockConfigMapsInterface) Delete(name string) error {
   223  	if _, ok := mock.objects[name]; !ok {
   224  		return kberrs.NewNotFound(api.Resource("tests"), name)
   225  	}
   226  	delete(mock.objects, name)
   227  	return nil
   228  }