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  }