github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/caas/kubernetes/provider/storage_test.go (about) 1 // Copyright 2018 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package provider_test 5 6 import ( 7 "github.com/golang/mock/gomock" 8 jc "github.com/juju/testing/checkers" 9 gc "gopkg.in/check.v1" 10 core "k8s.io/api/core/v1" 11 "k8s.io/apimachinery/pkg/api/resource" 12 "k8s.io/apimachinery/pkg/apis/meta/v1" 13 14 "github.com/juju/juju/caas/kubernetes/provider" 15 "github.com/juju/juju/environs/context" 16 "github.com/juju/juju/storage" 17 ) 18 19 var _ = gc.Suite(&storageSuite{}) 20 21 type storageSuite struct { 22 BaseSuite 23 } 24 25 func (s *storageSuite) k8sProvider(c *gc.C, ctrl *gomock.Controller) storage.Provider { 26 return provider.StorageProvider(s.k8sClient, testNamespace) 27 } 28 29 func (s *storageSuite) TestValidateConfig(c *gc.C) { 30 ctrl := s.setupBroker(c) 31 defer ctrl.Finish() 32 33 p := s.k8sProvider(c, ctrl) 34 cfg, err := storage.NewConfig("name", provider.K8s_ProviderType, map[string]interface{}{ 35 "storage-class": "my-storage", 36 "storage-provisioner": "aws-storage", 37 "storage-label": "storage-fred", 38 }) 39 c.Assert(err, jc.ErrorIsNil) 40 err = p.ValidateConfig(cfg) 41 c.Assert(err, jc.ErrorIsNil) 42 c.Assert(cfg.Attrs(), jc.DeepEquals, map[string]interface{}{ 43 "storage-class": "my-storage", 44 "storage-provisioner": "aws-storage", 45 "storage-label": "storage-fred", 46 }) 47 } 48 49 func (s *storageSuite) TestValidateConfigError(c *gc.C) { 50 ctrl := s.setupBroker(c) 51 defer ctrl.Finish() 52 53 p := s.k8sProvider(c, ctrl) 54 cfg, err := storage.NewConfig("name", provider.K8s_ProviderType, map[string]interface{}{ 55 "storage-class": "", 56 "storage-provisioner": "aws-storage", 57 }) 58 c.Assert(err, jc.ErrorIsNil) 59 err = p.ValidateConfig(cfg) 60 c.Assert(err, gc.ErrorMatches, "storage-class must be specified if storage-provisioner is specified") 61 } 62 63 func (s *storageSuite) TestValidateConfigExistingStorageClass(c *gc.C) { 64 ctrl := s.setupBroker(c) 65 defer ctrl.Finish() 66 67 cfg, err := provider.NewStorageConfig(map[string]interface{}{}, "juju-unit-storage") 68 c.Assert(err, jc.ErrorIsNil) 69 c.Assert(provider.ExistingStorageClass(cfg), gc.Equals, "juju-unit-storage") 70 } 71 72 func (s *storageSuite) TestNewStorageConfig(c *gc.C) { 73 ctrl := s.setupBroker(c) 74 defer ctrl.Finish() 75 76 cfg, err := provider.NewStorageConfig(map[string]interface{}{ 77 "storage-class": "juju-ebs", 78 "storage-provisioner": "ebs", 79 "parameters.type": "gp2", 80 }, "juju-unit-storage") 81 c.Assert(err, jc.ErrorIsNil) 82 c.Assert(provider.StorageClass(cfg), gc.Equals, "juju-ebs") 83 c.Assert(provider.StorageProvisioner(cfg), gc.Equals, "ebs") 84 c.Assert(provider.ExistingStorageClass(cfg), gc.Equals, "juju-unit-storage") 85 c.Assert(provider.StorageParameters(cfg), jc.DeepEquals, map[string]string{"type": "gp2"}) 86 } 87 88 func (s *storageSuite) TestSupports(c *gc.C) { 89 ctrl := s.setupBroker(c) 90 defer ctrl.Finish() 91 92 p := s.k8sProvider(c, ctrl) 93 c.Assert(p.Supports(storage.StorageKindBlock), jc.IsTrue) 94 c.Assert(p.Supports(storage.StorageKindFilesystem), jc.IsFalse) 95 } 96 97 func (s *storageSuite) TestScope(c *gc.C) { 98 ctrl := s.setupBroker(c) 99 defer ctrl.Finish() 100 101 p := s.k8sProvider(c, ctrl) 102 c.Assert(p.Scope(), gc.Equals, storage.ScopeEnviron) 103 } 104 105 func (s *storageSuite) TestDestroyVolumes(c *gc.C) { 106 ctrl := s.setupBroker(c) 107 defer ctrl.Finish() 108 109 gomock.InOrder( 110 s.mockPersistentVolumes.EXPECT().Delete("vol-1", s.deleteOptions(v1.DeletePropagationForeground)).Times(1). 111 Return(nil), 112 ) 113 114 p := s.k8sProvider(c, ctrl) 115 vs, err := p.VolumeSource(&storage.Config{}) 116 c.Assert(err, jc.ErrorIsNil) 117 118 errs, err := vs.DestroyVolumes(&context.CloudCallContext{}, []string{"vol-1"}) 119 c.Assert(err, jc.ErrorIsNil) 120 c.Assert(errs, jc.DeepEquals, []error{nil}) 121 } 122 123 func (s *storageSuite) TestDestroyVolumesNotFoundIgnored(c *gc.C) { 124 ctrl := s.setupBroker(c) 125 defer ctrl.Finish() 126 127 gomock.InOrder( 128 s.mockPersistentVolumes.EXPECT().Delete("vol-1", s.deleteOptions(v1.DeletePropagationForeground)).Times(1). 129 Return(s.k8sNotFoundError()), 130 ) 131 132 p := s.k8sProvider(c, ctrl) 133 vs, err := p.VolumeSource(&storage.Config{}) 134 c.Assert(err, jc.ErrorIsNil) 135 136 errs, err := vs.DestroyVolumes(&context.CloudCallContext{}, []string{"vol-1"}) 137 c.Assert(err, jc.ErrorIsNil) 138 c.Assert(errs, jc.DeepEquals, []error{nil}) 139 } 140 141 func (s *storageSuite) TestListVolumes(c *gc.C) { 142 ctrl := s.setupBroker(c) 143 defer ctrl.Finish() 144 145 gomock.InOrder( 146 s.mockPersistentVolumes.EXPECT().List(v1.ListOptions{}).Times(1). 147 Return(&core.PersistentVolumeList{Items: []core.PersistentVolume{ 148 {ObjectMeta: v1.ObjectMeta{Name: "vol-1"}}}}, nil), 149 ) 150 151 p := s.k8sProvider(c, ctrl) 152 vs, err := p.VolumeSource(&storage.Config{}) 153 c.Assert(err, jc.ErrorIsNil) 154 155 vols, err := vs.ListVolumes(&context.CloudCallContext{}) 156 c.Assert(err, jc.ErrorIsNil) 157 c.Assert(vols, jc.DeepEquals, []string{"vol-1"}) 158 } 159 160 func (s *storageSuite) TestDescribeVolumes(c *gc.C) { 161 ctrl := s.setupBroker(c) 162 defer ctrl.Finish() 163 164 gomock.InOrder( 165 s.mockPersistentVolumes.EXPECT().List(v1.ListOptions{}).Times(1). 166 Return(&core.PersistentVolumeList{Items: []core.PersistentVolume{ 167 {ObjectMeta: v1.ObjectMeta{Name: "vol-id"}, 168 Spec: core.PersistentVolumeSpec{ 169 PersistentVolumeReclaimPolicy: core.PersistentVolumeReclaimRetain, 170 Capacity: core.ResourceList{core.ResourceStorage: resource.MustParse("100Mi")}}, 171 }}}, nil), 172 ) 173 174 p := s.k8sProvider(c, ctrl) 175 vs, err := p.VolumeSource(&storage.Config{}) 176 c.Assert(err, jc.ErrorIsNil) 177 178 result, err := vs.DescribeVolumes(&context.CloudCallContext{}, []string{"vol-id"}) 179 c.Assert(err, jc.ErrorIsNil) 180 c.Assert(result, jc.DeepEquals, []storage.DescribeVolumesResult{{ 181 VolumeInfo: &storage.VolumeInfo{VolumeId: "vol-id", Size: 68, Persistent: true}, 182 }}) 183 }