github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/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  	jc "github.com/juju/testing/checkers"
     8  	gc "gopkg.in/check.v1"
     9  	"gopkg.in/juju/names.v2"
    10  
    11  	"github.com/juju/juju/instance"
    12  	"github.com/juju/juju/provider/gce"
    13  	"github.com/juju/juju/provider/gce/google"
    14  	"github.com/juju/juju/storage"
    15  )
    16  
    17  type storageProviderSuite struct {
    18  	gce.BaseSuite
    19  	provider storage.Provider
    20  }
    21  
    22  var _ = gc.Suite(&storageProviderSuite{})
    23  
    24  func (s *storageProviderSuite) SetUpTest(c *gc.C) {
    25  	s.BaseSuite.SetUpTest(c)
    26  
    27  	var err error
    28  	s.provider, err = s.Env.StorageProvider("gce")
    29  	c.Assert(err, jc.ErrorIsNil)
    30  }
    31  
    32  func (s *storageProviderSuite) TestValidateConfig(c *gc.C) {
    33  	// ValidateConfig performs no validation at all yet, this test
    34  	// it is just here to make sure that the placeholder will
    35  	// accept a config.
    36  	cfg := &storage.Config{}
    37  	err := s.provider.ValidateConfig(cfg)
    38  	c.Check(err, jc.ErrorIsNil)
    39  }
    40  
    41  func (s *storageProviderSuite) TestBlockStorageSupport(c *gc.C) {
    42  	supports := s.provider.Supports(storage.StorageKindBlock)
    43  	c.Check(supports, jc.IsTrue)
    44  }
    45  
    46  func (s *storageProviderSuite) TestFSStorageSupport(c *gc.C) {
    47  	supports := s.provider.Supports(storage.StorageKindFilesystem)
    48  	c.Check(supports, jc.IsFalse)
    49  }
    50  
    51  func (s *storageProviderSuite) TestFSSource(c *gc.C) {
    52  	sConfig := &storage.Config{}
    53  	_, err := s.provider.FilesystemSource(sConfig)
    54  	c.Check(err, gc.ErrorMatches, "filesystems not supported")
    55  }
    56  
    57  func (s *storageProviderSuite) TestVolumeSource(c *gc.C) {
    58  	storageCfg := &storage.Config{}
    59  	_, err := s.provider.VolumeSource(storageCfg)
    60  	c.Check(err, jc.ErrorIsNil)
    61  }
    62  
    63  type volumeSourceSuite struct {
    64  	gce.BaseSuite
    65  	source           storage.VolumeSource
    66  	params           []storage.VolumeParams
    67  	instId           instance.Id
    68  	attachmentParams *storage.VolumeAttachmentParams
    69  }
    70  
    71  var _ = gc.Suite(&volumeSourceSuite{})
    72  
    73  func (s *volumeSourceSuite) SetUpTest(c *gc.C) {
    74  	s.BaseSuite.SetUpTest(c)
    75  
    76  	provider, err := s.Env.StorageProvider("gce")
    77  	c.Assert(err, jc.ErrorIsNil)
    78  	s.source, err = provider.VolumeSource(&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",
    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",
    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  	c.Assert(res[0].Volume.HardwareId, gc.Equals, "")
   137  
   138  	// Volume was also attached as indicated by Attachment in params.
   139  	c.Assert(res[0].VolumeAttachment.DeviceName, gc.Equals, "")
   140  	c.Assert(res[0].VolumeAttachment.DeviceLink, gc.Equals, "/dev/disk/by-id/google-home-zone-1234567")
   141  	c.Assert(res[0].VolumeAttachment.Machine.String(), gc.Equals, "machine-0")
   142  	c.Assert(res[0].VolumeAttachment.ReadOnly, jc.IsFalse)
   143  	c.Assert(res[0].VolumeAttachment.Volume.String(), gc.Equals, "volume-0")
   144  
   145  	// Internals where properly called
   146  	// Disk Creation
   147  	createCalled, call := s.FakeConn.WasCalled("CreateDisks")
   148  	c.Check(call, gc.HasLen, 1)
   149  	c.Assert(createCalled, jc.IsTrue)
   150  	c.Assert(call[0].ZoneName, gc.Equals, "home-zone")
   151  	c.Assert(call[0].Disks[0].Name, jc.HasPrefix, "home-zone--")
   152  
   153  	// Instance existence Checking
   154  	instanceDisksCalled, call := s.FakeConn.WasCalled("InstanceDisks")
   155  	c.Check(call, gc.HasLen, 1)
   156  	c.Assert(instanceDisksCalled, jc.IsTrue)
   157  	c.Assert(call[0].ZoneName, gc.Equals, "home-zone")
   158  	c.Assert(call[0].InstanceId, gc.Equals, string(s.instId))
   159  
   160  	// Disk Was attached
   161  	attachCalled, call := s.FakeConn.WasCalled("AttachDisk")
   162  	c.Check(call, gc.HasLen, 1)
   163  	c.Assert(attachCalled, jc.IsTrue)
   164  	c.Assert(call[0].ZoneName, gc.Equals, "home-zone")
   165  	c.Assert(call[0].VolumeName, jc.HasPrefix, "home-zone--")
   166  	c.Assert(call[0].InstanceId, gc.Equals, string(s.instId))
   167  }
   168  
   169  func (s *volumeSourceSuite) TestDestroyVolumes(c *gc.C) {
   170  	errs, err := s.source.DestroyVolumes([]string{"a--volume-name"})
   171  	c.Check(err, jc.ErrorIsNil)
   172  	c.Check(errs, gc.HasLen, 1)
   173  	c.Assert(errs[0], jc.ErrorIsNil)
   174  
   175  	destroyCalled, call := s.FakeConn.WasCalled("RemoveDisk")
   176  	c.Check(call, gc.HasLen, 1)
   177  	c.Assert(destroyCalled, jc.IsTrue)
   178  	c.Assert(call[0].ZoneName, gc.Equals, "a")
   179  	c.Assert(call[0].ID, gc.Equals, "a--volume-name")
   180  }
   181  
   182  func (s *volumeSourceSuite) TestListVolumes(c *gc.C) {
   183  	s.FakeConn.GoogleDisks = []*google.Disk{s.BaseDisk}
   184  	s.FakeConn.Zones = []google.AvailabilityZone{google.NewZone("home-zone", "Ready", "", "")}
   185  	vols, err := s.source.ListVolumes()
   186  	c.Check(err, jc.ErrorIsNil)
   187  	c.Assert(vols, gc.HasLen, 1)
   188  
   189  	azsCalled, call := s.FakeConn.WasCalled("AvailabilityZones")
   190  	c.Check(call, gc.HasLen, 1)
   191  	c.Assert(azsCalled, jc.IsTrue)
   192  	c.Assert(call[0].Region, gc.Equals, "")
   193  
   194  	disksCalled, call := s.FakeConn.WasCalled("Disks")
   195  	c.Check(call, gc.HasLen, 1)
   196  	c.Assert(disksCalled, jc.IsTrue)
   197  	c.Assert(call[0].ZoneName, gc.Equals, "home-zone")
   198  }
   199  
   200  func (s *volumeSourceSuite) TestListVolumesOnlyListsCurrentModelUUID(c *gc.C) {
   201  	otherDisk := &google.Disk{
   202  		Id:          1234568,
   203  		Name:        "home-zone--566fe7b2-c026-4a86-a2cc-84cb7f9a4868",
   204  		Zone:        "home-zone",
   205  		Status:      google.StatusReady,
   206  		Size:        1024,
   207  		Description: "a-different-model-uuid",
   208  	}
   209  	s.FakeConn.GoogleDisks = []*google.Disk{s.BaseDisk, otherDisk}
   210  	s.FakeConn.Zones = []google.AvailabilityZone{google.NewZone("home-zone", "Ready", "", "")}
   211  	vols, err := s.source.ListVolumes()
   212  	c.Check(err, jc.ErrorIsNil)
   213  	c.Assert(vols, gc.HasLen, 1)
   214  }
   215  
   216  func (s *volumeSourceSuite) TestListVolumesListsEmptyUUIDVolumes(c *gc.C) {
   217  	otherDisk := &google.Disk{
   218  		Id:          1234568,
   219  		Name:        "home-zone--566fe7b2-c026-4a86-a2cc-84cb7f9a4868",
   220  		Zone:        "home-zone",
   221  		Status:      google.StatusReady,
   222  		Size:        1024,
   223  		Description: "",
   224  	}
   225  	s.FakeConn.GoogleDisks = []*google.Disk{s.BaseDisk, otherDisk}
   226  	s.FakeConn.Zones = []google.AvailabilityZone{google.NewZone("home-zone", "Ready", "", "")}
   227  	vols, err := s.source.ListVolumes()
   228  	c.Check(err, jc.ErrorIsNil)
   229  	c.Assert(vols, gc.HasLen, 2)
   230  }
   231  
   232  func (s *volumeSourceSuite) TestListVolumesIgnoresNamesFormatteDifferently(c *gc.C) {
   233  	otherDisk := &google.Disk{
   234  		Id:          1234568,
   235  		Name:        "juju-566fe7b2-c026-4a86-a2cc-84cb7f9a4868",
   236  		Zone:        "home-zone",
   237  		Status:      google.StatusReady,
   238  		Size:        1024,
   239  		Description: "",
   240  	}
   241  	s.FakeConn.GoogleDisks = []*google.Disk{s.BaseDisk, otherDisk}
   242  	s.FakeConn.Zones = []google.AvailabilityZone{google.NewZone("home-zone", "Ready", "", "")}
   243  	vols, err := s.source.ListVolumes()
   244  	c.Check(err, jc.ErrorIsNil)
   245  	c.Assert(vols, gc.HasLen, 1)
   246  }
   247  
   248  func (s *volumeSourceSuite) TestDescribeVolumes(c *gc.C) {
   249  	s.FakeConn.GoogleDisk = s.BaseDisk
   250  	volName := "home-zone--c930380d-8337-4bf5-b07a-9dbb5ae771e4"
   251  	res, err := s.source.DescribeVolumes([]string{volName})
   252  	c.Check(err, jc.ErrorIsNil)
   253  	c.Assert(res, gc.HasLen, 1)
   254  	c.Assert(res[0].VolumeInfo.Size, gc.Equals, uint64(1024))
   255  	c.Assert(res[0].VolumeInfo.VolumeId, gc.Equals, volName)
   256  
   257  	diskCalled, call := s.FakeConn.WasCalled("Disk")
   258  	c.Check(call, gc.HasLen, 1)
   259  	c.Assert(diskCalled, jc.IsTrue)
   260  	c.Assert(call[0].ZoneName, gc.Equals, "home-zone")
   261  	c.Assert(call[0].ID, gc.Equals, volName)
   262  }
   263  
   264  func (s *volumeSourceSuite) TestAttachVolumes(c *gc.C) {
   265  	volName := "home-zone--c930380d-8337-4bf5-b07a-9dbb5ae771e4"
   266  	attachments := []storage.VolumeAttachmentParams{*s.attachmentParams}
   267  	s.FakeConn.AttachedDisk = &google.AttachedDisk{
   268  		VolumeName: s.BaseDisk.Name,
   269  		DeviceName: "home-zone-1234567",
   270  		Mode:       "READ_WRITE",
   271  	}
   272  	res, err := s.source.AttachVolumes(attachments)
   273  	c.Check(err, jc.ErrorIsNil)
   274  	c.Assert(res, gc.HasLen, 1)
   275  	c.Assert(res[0].VolumeAttachment.Volume.String(), gc.Equals, "volume-0")
   276  	c.Assert(res[0].VolumeAttachment.Machine.String(), gc.Equals, "machine-0")
   277  	c.Assert(res[0].VolumeAttachment.VolumeAttachmentInfo.DeviceName, gc.Equals, "home-zone-1234567")
   278  
   279  	// Disk Was attached
   280  	attachCalled, call := s.FakeConn.WasCalled("AttachDisk")
   281  	c.Check(call, gc.HasLen, 1)
   282  	c.Assert(attachCalled, jc.IsTrue)
   283  	c.Assert(call[0].ZoneName, gc.Equals, "home-zone")
   284  	c.Assert(call[0].VolumeName, gc.Equals, volName)
   285  	c.Assert(call[0].InstanceId, gc.Equals, string(s.instId))
   286  
   287  }
   288  
   289  func (s *volumeSourceSuite) TestDetachVolumes(c *gc.C) {
   290  	volName := "home-zone--c930380d-8337-4bf5-b07a-9dbb5ae771e4"
   291  	attachments := []storage.VolumeAttachmentParams{*s.attachmentParams}
   292  	errs, err := s.source.DetachVolumes(attachments)
   293  	c.Check(err, jc.ErrorIsNil)
   294  	c.Assert(errs, gc.HasLen, 1)
   295  	c.Assert(errs[0], jc.ErrorIsNil)
   296  
   297  	// Disk Was detached
   298  	attachCalled, call := s.FakeConn.WasCalled("DetachDisk")
   299  	c.Check(call, gc.HasLen, 1)
   300  	c.Assert(attachCalled, jc.IsTrue)
   301  	c.Assert(call[0].ZoneName, gc.Equals, "home-zone")
   302  	c.Assert(call[0].InstanceId, gc.Equals, string(s.instId))
   303  	c.Assert(call[0].VolumeName, gc.Equals, volName)
   304  }