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 }