github.com/mhilton/juju-juju@v0.0.0-20150901100907-a94dd2c73455/provider/gce/disks_test.go (about)

     1  // Copyright 2014 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package gce_test
     5  
     6  import (
     7  	"github.com/juju/names"
     8  	jc "github.com/juju/testing/checkers"
     9  	gc "gopkg.in/check.v1"
    10  
    11  	"github.com/juju/juju/environs/config"
    12  	"github.com/juju/juju/instance"
    13  	"github.com/juju/juju/provider/gce"
    14  	"github.com/juju/juju/provider/gce/google"
    15  	"github.com/juju/juju/storage"
    16  )
    17  
    18  type storageProviderSuite struct {
    19  	gce.BaseSuite
    20  	provider storage.Provider
    21  }
    22  
    23  var _ = gc.Suite(&storageProviderSuite{})
    24  
    25  func (s *storageProviderSuite) SetUpTest(c *gc.C) {
    26  	s.BaseSuite.SetUpTest(c)
    27  	s.provider = gce.GCEStorageProvider()
    28  }
    29  
    30  func (s *storageProviderSuite) TestValidateConfig(c *gc.C) {
    31  	// ValidateConfig performs no validation at all yet, this test
    32  	// it is just here to make sure that the placeholder will
    33  	// accept a config.
    34  	cfg := &storage.Config{}
    35  	err := s.provider.ValidateConfig(cfg)
    36  	c.Check(err, jc.ErrorIsNil)
    37  }
    38  
    39  func (s *storageProviderSuite) TestBlockStorageSupport(c *gc.C) {
    40  	supports := s.provider.Supports(storage.StorageKindBlock)
    41  	c.Check(supports, jc.IsTrue)
    42  }
    43  
    44  func (s *storageProviderSuite) TestFSStorageSupport(c *gc.C) {
    45  	supports := s.provider.Supports(storage.StorageKindFilesystem)
    46  	c.Check(supports, jc.IsFalse)
    47  }
    48  
    49  func (s *storageProviderSuite) TestFSSource(c *gc.C) {
    50  	eConfig := &config.Config{}
    51  	sConfig := &storage.Config{}
    52  	_, err := s.provider.FilesystemSource(eConfig, sConfig)
    53  	c.Check(err, gc.ErrorMatches, "filesystems not supported")
    54  }
    55  
    56  func (s *storageProviderSuite) TestVolumeSource(c *gc.C) {
    57  	connCfg := s.BaseSuite.Config
    58  	storageCfg := &storage.Config{}
    59  	_, err := s.provider.VolumeSource(connCfg, storageCfg)
    60  	c.Check(err, jc.ErrorIsNil)
    61  }
    62  
    63  type volumeSourceSuite struct {
    64  	gce.BaseSuite
    65  	provider         storage.Provider
    66  	source           storage.VolumeSource
    67  	params           []storage.VolumeParams
    68  	instId           instance.Id
    69  	attachmentParams *storage.VolumeAttachmentParams
    70  }
    71  
    72  var _ = gc.Suite(&volumeSourceSuite{})
    73  
    74  func (s *volumeSourceSuite) SetUpTest(c *gc.C) {
    75  	s.BaseSuite.SetUpTest(c)
    76  	s.provider = gce.GCEStorageProvider()
    77  	var err error
    78  	s.source, err = s.provider.VolumeSource(s.BaseSuite.Config, &storage.Config{})
    79  	c.Check(err, jc.ErrorIsNil)
    80  
    81  	inst := gce.NewInstance(s.BaseInstance, s.Env)
    82  	vTag := names.NewVolumeTag("0")
    83  	mTag := names.NewMachineTag("0")
    84  	s.instId = inst.Id()
    85  	s.attachmentParams = &storage.VolumeAttachmentParams{
    86  		AttachmentParams: storage.AttachmentParams{
    87  			Provider:   gce.GCEProviderType,
    88  			Machine:    mTag,
    89  			InstanceId: s.instId,
    90  		},
    91  		VolumeId: s.BaseDisk.Name,
    92  		Volume:   names.NewVolumeTag("0"),
    93  	}
    94  	s.params = []storage.VolumeParams{{
    95  		Tag:        vTag,
    96  		Size:       1024,
    97  		Provider:   gce.GCEProviderType,
    98  		Attachment: s.attachmentParams,
    99  	}}
   100  
   101  }
   102  
   103  func (s *volumeSourceSuite) TestCreateVolumesNoInstance(c *gc.C) {
   104  	res, err := s.source.CreateVolumes(s.params)
   105  	c.Check(err, jc.ErrorIsNil)
   106  	c.Check(res, gc.HasLen, 1)
   107  	expectedErr := "cannot obtain \"spam\" from instance cache: cannot attach to non-running instance spam"
   108  	c.Assert(res[0].Error, gc.ErrorMatches, expectedErr)
   109  
   110  }
   111  
   112  func (s *volumeSourceSuite) TestCreateVolumesNoDiskCreated(c *gc.C) {
   113  	s.FakeConn.Insts = []google.Instance{*s.BaseInstance}
   114  	res, err := s.source.CreateVolumes(s.params)
   115  	c.Check(err, jc.ErrorIsNil)
   116  	c.Check(res, gc.HasLen, 1)
   117  	c.Assert(res[0].Error, gc.ErrorMatches, "unexpected number of disks created: 0")
   118  
   119  }
   120  
   121  func (s *volumeSourceSuite) TestCreateVolumes(c *gc.C) {
   122  	s.FakeConn.Insts = []google.Instance{*s.BaseInstance}
   123  	s.FakeConn.GoogleDisks = []*google.Disk{s.BaseDisk}
   124  	s.FakeConn.GoogleDisk = s.BaseDisk
   125  	s.FakeConn.AttachedDisk = &google.AttachedDisk{
   126  		VolumeName: s.BaseDisk.Name,
   127  		DeviceName: "home-zone-1234567",
   128  		Mode:       "READ_WRITE",
   129  	}
   130  	res, err := s.source.CreateVolumes(s.params)
   131  	c.Check(err, jc.ErrorIsNil)
   132  	c.Check(res, gc.HasLen, 1)
   133  	// Volume was created
   134  	c.Assert(res[0].Error, jc.ErrorIsNil)
   135  	c.Assert(res[0].Volume.VolumeId, gc.Equals, s.BaseDisk.Name)
   136  
   137  	// Volume was also attached as indicated by Attachment in params.
   138  	c.Assert(res[0].VolumeAttachment.DeviceName, gc.Equals, "home-zone-1234567")
   139  	c.Assert(res[0].VolumeAttachment.Machine.String(), gc.Equals, "machine-0")
   140  	c.Assert(res[0].VolumeAttachment.ReadOnly, jc.IsFalse)
   141  	c.Assert(res[0].VolumeAttachment.Volume.String(), gc.Equals, "volume-0")
   142  
   143  	// Internals where properly called
   144  	// Disk Creation
   145  	createCalled, call := s.FakeConn.WasCalled("CreateDisks")
   146  	c.Check(call, gc.HasLen, 1)
   147  	c.Assert(createCalled, jc.IsTrue)
   148  	c.Assert(call[0].ZoneName, gc.Equals, "home-zone")
   149  	c.Assert(call[0].Disks[0].Name, jc.HasPrefix, "home-zone--")
   150  
   151  	// Instance existence Checking
   152  	instanceDisksCalled, call := s.FakeConn.WasCalled("InstanceDisks")
   153  	c.Check(call, gc.HasLen, 1)
   154  	c.Assert(instanceDisksCalled, jc.IsTrue)
   155  	c.Assert(call[0].ZoneName, gc.Equals, "home-zone")
   156  	c.Assert(call[0].InstanceId, gc.Equals, string(s.instId))
   157  
   158  	// Disk Was attached
   159  	attachCalled, call := s.FakeConn.WasCalled("AttachDisk")
   160  	c.Check(call, gc.HasLen, 1)
   161  	c.Assert(attachCalled, jc.IsTrue)
   162  	c.Assert(call[0].ZoneName, gc.Equals, "home-zone")
   163  	c.Assert(call[0].VolumeName, jc.HasPrefix, "home-zone--")
   164  	c.Assert(call[0].InstanceId, gc.Equals, string(s.instId))
   165  }
   166  
   167  func (s *volumeSourceSuite) TestDestroyVolumes(c *gc.C) {
   168  	errs, err := s.source.DestroyVolumes([]string{"a--volume-name"})
   169  	c.Check(err, jc.ErrorIsNil)
   170  	c.Check(errs, gc.HasLen, 1)
   171  	c.Assert(errs[0], jc.ErrorIsNil)
   172  
   173  	destroyCalled, call := s.FakeConn.WasCalled("RemoveDisk")
   174  	c.Check(call, gc.HasLen, 1)
   175  	c.Assert(destroyCalled, jc.IsTrue)
   176  	c.Assert(call[0].ZoneName, gc.Equals, "a")
   177  	c.Assert(call[0].ID, gc.Equals, "a--volume-name")
   178  }
   179  
   180  func (s *volumeSourceSuite) TestListVolumes(c *gc.C) {
   181  	s.FakeConn.GoogleDisks = []*google.Disk{s.BaseDisk}
   182  	s.FakeConn.Zones = []google.AvailabilityZone{google.NewZone("home-zone", "Ready", "", "")}
   183  	vols, err := s.source.ListVolumes()
   184  	c.Check(err, jc.ErrorIsNil)
   185  	c.Assert(vols, gc.HasLen, 1)
   186  
   187  	azsCalled, call := s.FakeConn.WasCalled("AvailabilityZones")
   188  	c.Check(call, gc.HasLen, 1)
   189  	c.Assert(azsCalled, jc.IsTrue)
   190  	c.Assert(call[0].Region, gc.Equals, "")
   191  
   192  	disksCalled, call := s.FakeConn.WasCalled("Disks")
   193  	c.Check(call, gc.HasLen, 1)
   194  	c.Assert(disksCalled, jc.IsTrue)
   195  	c.Assert(call[0].ZoneName, gc.Equals, "home-zone")
   196  }
   197  
   198  func (s *volumeSourceSuite) TestDescribeVolumes(c *gc.C) {
   199  	s.FakeConn.GoogleDisk = s.BaseDisk
   200  	volName := "home-zone--c930380d-8337-4bf5-b07a-9dbb5ae771e4"
   201  	res, err := s.source.DescribeVolumes([]string{volName})
   202  	c.Check(err, jc.ErrorIsNil)
   203  	c.Assert(res, gc.HasLen, 1)
   204  	c.Assert(res[0].VolumeInfo.Size, gc.Equals, uint64(1024))
   205  	c.Assert(res[0].VolumeInfo.VolumeId, gc.Equals, volName)
   206  
   207  	diskCalled, call := s.FakeConn.WasCalled("Disk")
   208  	c.Check(call, gc.HasLen, 1)
   209  	c.Assert(diskCalled, jc.IsTrue)
   210  	c.Assert(call[0].ZoneName, gc.Equals, "home-zone")
   211  	c.Assert(call[0].ID, gc.Equals, volName)
   212  }
   213  
   214  func (s *volumeSourceSuite) TestAttachVolumes(c *gc.C) {
   215  	volName := "home-zone--c930380d-8337-4bf5-b07a-9dbb5ae771e4"
   216  	attachments := []storage.VolumeAttachmentParams{*s.attachmentParams}
   217  	s.FakeConn.AttachedDisk = &google.AttachedDisk{
   218  		VolumeName: s.BaseDisk.Name,
   219  		DeviceName: "home-zone-1234567",
   220  		Mode:       "READ_WRITE",
   221  	}
   222  	res, err := s.source.AttachVolumes(attachments)
   223  	c.Check(err, jc.ErrorIsNil)
   224  	c.Assert(res, gc.HasLen, 1)
   225  	c.Assert(res[0].VolumeAttachment.Volume.String(), gc.Equals, "volume-0")
   226  	c.Assert(res[0].VolumeAttachment.Machine.String(), gc.Equals, "machine-0")
   227  	c.Assert(res[0].VolumeAttachment.VolumeAttachmentInfo.DeviceName, gc.Equals, "home-zone-1234567")
   228  
   229  	// Disk Was attached
   230  	attachCalled, call := s.FakeConn.WasCalled("AttachDisk")
   231  	c.Check(call, gc.HasLen, 1)
   232  	c.Assert(attachCalled, jc.IsTrue)
   233  	c.Assert(call[0].ZoneName, gc.Equals, "home-zone")
   234  	c.Assert(call[0].VolumeName, gc.Equals, volName)
   235  	c.Assert(call[0].InstanceId, gc.Equals, string(s.instId))
   236  
   237  }
   238  
   239  func (s *volumeSourceSuite) TestDetachVolumes(c *gc.C) {
   240  	volName := "home-zone--c930380d-8337-4bf5-b07a-9dbb5ae771e4"
   241  	attachments := []storage.VolumeAttachmentParams{*s.attachmentParams}
   242  	errs, err := s.source.DetachVolumes(attachments)
   243  	c.Check(err, jc.ErrorIsNil)
   244  	c.Assert(errs, gc.HasLen, 1)
   245  	c.Assert(errs[0], jc.ErrorIsNil)
   246  
   247  	// Disk Was detached
   248  	attachCalled, call := s.FakeConn.WasCalled("DetachDisk")
   249  	c.Check(call, gc.HasLen, 1)
   250  	c.Assert(attachCalled, jc.IsTrue)
   251  	c.Assert(call[0].ZoneName, gc.Equals, "home-zone")
   252  	c.Assert(call[0].InstanceId, gc.Equals, string(s.instId))
   253  	c.Assert(call[0].VolumeName, gc.Equals, volName)
   254  }