github.com/cloud-green/juju@v0.0.0-20151002100041-a00291338d3d/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", 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) TestDescribeVolumes(c *gc.C) { 201 s.FakeConn.GoogleDisk = s.BaseDisk 202 volName := "home-zone--c930380d-8337-4bf5-b07a-9dbb5ae771e4" 203 res, err := s.source.DescribeVolumes([]string{volName}) 204 c.Check(err, jc.ErrorIsNil) 205 c.Assert(res, gc.HasLen, 1) 206 c.Assert(res[0].VolumeInfo.Size, gc.Equals, uint64(1024)) 207 c.Assert(res[0].VolumeInfo.VolumeId, gc.Equals, volName) 208 209 diskCalled, call := s.FakeConn.WasCalled("Disk") 210 c.Check(call, gc.HasLen, 1) 211 c.Assert(diskCalled, jc.IsTrue) 212 c.Assert(call[0].ZoneName, gc.Equals, "home-zone") 213 c.Assert(call[0].ID, gc.Equals, volName) 214 } 215 216 func (s *volumeSourceSuite) TestAttachVolumes(c *gc.C) { 217 volName := "home-zone--c930380d-8337-4bf5-b07a-9dbb5ae771e4" 218 attachments := []storage.VolumeAttachmentParams{*s.attachmentParams} 219 s.FakeConn.AttachedDisk = &google.AttachedDisk{ 220 VolumeName: s.BaseDisk.Name, 221 DeviceName: "home-zone-1234567", 222 Mode: "READ_WRITE", 223 } 224 res, err := s.source.AttachVolumes(attachments) 225 c.Check(err, jc.ErrorIsNil) 226 c.Assert(res, gc.HasLen, 1) 227 c.Assert(res[0].VolumeAttachment.Volume.String(), gc.Equals, "volume-0") 228 c.Assert(res[0].VolumeAttachment.Machine.String(), gc.Equals, "machine-0") 229 c.Assert(res[0].VolumeAttachment.VolumeAttachmentInfo.DeviceName, gc.Equals, "home-zone-1234567") 230 231 // Disk Was attached 232 attachCalled, call := s.FakeConn.WasCalled("AttachDisk") 233 c.Check(call, gc.HasLen, 1) 234 c.Assert(attachCalled, jc.IsTrue) 235 c.Assert(call[0].ZoneName, gc.Equals, "home-zone") 236 c.Assert(call[0].VolumeName, gc.Equals, volName) 237 c.Assert(call[0].InstanceId, gc.Equals, string(s.instId)) 238 239 } 240 241 func (s *volumeSourceSuite) TestDetachVolumes(c *gc.C) { 242 volName := "home-zone--c930380d-8337-4bf5-b07a-9dbb5ae771e4" 243 attachments := []storage.VolumeAttachmentParams{*s.attachmentParams} 244 errs, err := s.source.DetachVolumes(attachments) 245 c.Check(err, jc.ErrorIsNil) 246 c.Assert(errs, gc.HasLen, 1) 247 c.Assert(errs[0], jc.ErrorIsNil) 248 249 // Disk Was detached 250 attachCalled, call := s.FakeConn.WasCalled("DetachDisk") 251 c.Check(call, gc.HasLen, 1) 252 c.Assert(attachCalled, jc.IsTrue) 253 c.Assert(call[0].ZoneName, gc.Equals, "home-zone") 254 c.Assert(call[0].InstanceId, gc.Equals, string(s.instId)) 255 c.Assert(call[0].VolumeName, gc.Equals, volName) 256 }