github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/provider/oracle/storage_volumes_test.go (about) 1 // Copyright 2017 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package oracle_test 5 6 import ( 7 "errors" 8 9 "github.com/juju/clock" 10 "github.com/juju/go-oracle-cloud/api" 11 "github.com/juju/go-oracle-cloud/response" 12 jc "github.com/juju/testing/checkers" 13 gc "gopkg.in/check.v1" 14 "gopkg.in/juju/names.v2" 15 16 "github.com/juju/juju/environs" 17 "github.com/juju/juju/environs/context" 18 "github.com/juju/juju/provider/oracle" 19 oracletesting "github.com/juju/juju/provider/oracle/testing" 20 "github.com/juju/juju/storage" 21 "github.com/juju/juju/testing" 22 ) 23 24 type oracleVolumeSource struct { 25 testing.BaseSuite 26 27 callCtx context.ProviderCallContext 28 } 29 30 var _ = gc.Suite(&oracleVolumeSource{}) 31 32 func (s *oracleVolumeSource) SetUpTest(c *gc.C) { 33 s.BaseSuite.SetUpTest(c) 34 oracletesting.DefaultFakeStorageAPI.ResetCalls() 35 // Reset name from changes in environ_test SetUpTest() 36 // not required here. 37 oracletesting.DefaultEnvironAPI.FakeInstance.All.Result[0].Name = "/Compute-a432100/sgiulitti@cloudbase.com/0/ebc4ce91-56bb-4120-ba78-13762597f837" 38 s.callCtx = context.NewCloudCallContext() 39 } 40 41 func (o *oracleVolumeSource) NewVolumeSource( 42 c *gc.C, 43 fakestorage *oracletesting.FakeStorageAPI, 44 fakeenv *oracletesting.FakeEnvironAPI, 45 ) storage.VolumeSource { 46 47 var client oracle.EnvironAPI 48 if fakeenv == nil { 49 client = &api.Client{} 50 } else { 51 client = fakeenv 52 } 53 54 environ, err := oracle.NewOracleEnviron( 55 &oracle.EnvironProvider{}, 56 environs.OpenParams{ 57 Config: testing.ModelConfig(c), 58 }, 59 client, 60 &advancingClock, 61 ) 62 c.Assert(err, gc.IsNil) 63 c.Assert(environ, gc.NotNil) 64 source, err := oracle.NewOracleVolumeSource(environ, 65 "controller-uuid", 66 "some-uuid-things-with-magic", 67 fakestorage, 68 clock.WallClock, 69 ) 70 c.Assert(err, gc.IsNil) 71 c.Assert(source, gc.NotNil) 72 return source 73 } 74 75 func (o *oracleVolumeSource) TestCreateVolumesWithEmptyParams(c *gc.C) { 76 source := o.NewVolumeSource(c, oracletesting.DefaultFakeStorageAPI, nil) 77 result, err := source.CreateVolumes(o.callCtx, nil) 78 c.Assert(err, gc.IsNil) 79 c.Assert(result, gc.NotNil) 80 } 81 82 func (o *oracleVolumeSource) TestCreateVolumes(c *gc.C) { 83 source := o.NewVolumeSource(c, oracletesting.DefaultFakeStorageAPI, nil) 84 results, err := source.CreateVolumes(o.callCtx, []storage.VolumeParams{ 85 { 86 Size: uint64(10000), 87 Provider: oracle.DefaultTypes[0], 88 }, 89 }) 90 c.Assert(err, gc.IsNil) 91 c.Assert(results, gc.HasLen, 1) 92 c.Assert(results[0].Error, jc.ErrorIsNil) 93 } 94 95 func (o *oracleVolumeSource) TestCreateVolumesAlreadyExists(c *gc.C) { 96 source := o.NewVolumeSource(c, &oracletesting.FakeStorageAPI{ 97 FakeComposer: oracletesting.FakeComposer{ 98 Compose: "/Compute-acme/jack.jones@example.com/allowed_video_servers", 99 }, 100 FakeStorageVolume: oracletesting.FakeStorageVolume{ 101 StorageVolume: response.StorageVolume{ 102 Name: "foo", 103 Size: 123 * 1024 * 1024, 104 Tags: []string{ 105 "juju-model-uuid=some-uuid-things-with-magic", 106 }, 107 }, 108 CreateErr: &api.ErrStatusConflict{}, 109 }, 110 }, nil) 111 volumeTag := names.NewVolumeTag("666") 112 results, err := source.CreateVolumes(o.callCtx, []storage.VolumeParams{{ 113 Tag: volumeTag, 114 Size: uint64(10000), 115 Provider: oracle.DefaultTypes[0], 116 }}) 117 c.Assert(err, jc.ErrorIsNil) 118 c.Assert(results, gc.HasLen, 1) 119 c.Assert(results[0].Error, jc.ErrorIsNil) 120 c.Assert(results[0].Volume, jc.DeepEquals, &storage.Volume{ 121 volumeTag, 122 storage.VolumeInfo{ 123 VolumeId: "foo", 124 Size: 123, 125 Persistent: true, 126 }, 127 }) 128 } 129 130 func (o *oracleVolumeSource) TestCreateVolumeError(c *gc.C) { 131 fake := &oracletesting.FakeStorageAPI{ 132 FakeComposer: oracletesting.FakeComposer{ 133 Compose: "/Compute-acme/jack.jones@example.com/allowed_video_servers", 134 }, 135 FakeStorageVolume: oracletesting.FakeStorageVolume{ 136 CreateErr: errors.New("FakeStorageVolumeErr"), 137 }, 138 } 139 source := o.NewVolumeSource(c, fake, nil) 140 results, err := source.CreateVolumes(o.callCtx, []storage.VolumeParams{ 141 { 142 Size: uint64(10000), 143 Provider: oracle.DefaultTypes[0], 144 }, 145 }) 146 c.Assert(err, gc.IsNil) 147 c.Assert(results, gc.HasLen, 1) 148 c.Assert(results[0].Error, gc.NotNil) 149 c.Assert(results[0].Error, gc.ErrorMatches, "FakeStorageVolumeErr") 150 } 151 152 func (o *oracleVolumeSource) TestListVolumes(c *gc.C) { 153 source := o.NewVolumeSource(c, oracletesting.DefaultFakeStorageAPI, nil) 154 volumes, err := source.ListVolumes(o.callCtx) 155 c.Assert(err, gc.IsNil) 156 c.Assert(volumes, gc.NotNil) 157 } 158 159 func (o *oracleVolumeSource) TestListVolumesWithErrors(c *gc.C) { 160 for _, fake := range []*oracletesting.FakeStorageAPI{ 161 { 162 FakeComposer: oracletesting.FakeComposer{ 163 Compose: "/Compute-acme/jack.jones@example.com/allowed_video_servers", 164 }, 165 FakeStorageVolume: oracletesting.FakeStorageVolume{ 166 AllErr: errors.New("FakeStorageVolumeErr"), 167 }, 168 }, 169 } { 170 source := o.NewVolumeSource(c, fake, nil) 171 _, err := source.ListVolumes(o.callCtx) 172 c.Assert(err, gc.NotNil) 173 } 174 } 175 176 func (o *oracleVolumeSource) TestDescribeVolumes(c *gc.C) { 177 source := o.NewVolumeSource(c, oracletesting.DefaultFakeStorageAPI, nil) 178 volumes, err := source.DescribeVolumes(o.callCtx, []string{}) 179 c.Assert(err, gc.IsNil) 180 c.Assert(volumes, gc.NotNil) 181 182 volumes, err = source.DescribeVolumes(o.callCtx, []string{"JujuTools_storage"}) 183 c.Assert(err, gc.IsNil) 184 c.Assert(volumes, gc.NotNil) 185 } 186 187 func (o *oracleVolumeSource) TestDescribeVolumesWithErrors(c *gc.C) { 188 for _, fake := range []*oracletesting.FakeStorageAPI{ 189 { 190 FakeComposer: oracletesting.FakeComposer{ 191 Compose: "/Compute-acme/jack.jones@example.com/allowed_video_servers", 192 }, 193 FakeStorageVolume: oracletesting.FakeStorageVolume{ 194 AllErr: errors.New("FakeStorageVolumeErr"), 195 }, 196 }, 197 } { 198 source := o.NewVolumeSource(c, fake, nil) 199 _, err := source.DescribeVolumes(o.callCtx, []string{"JujuTools_storage"}) 200 c.Assert(err, gc.NotNil) 201 } 202 } 203 204 func (o *oracleVolumeSource) TestDestroyVolumes(c *gc.C) { 205 source := o.NewVolumeSource(c, oracletesting.DefaultFakeStorageAPI, nil) 206 errs, err := source.DestroyVolumes(o.callCtx, []string{"foo"}) 207 c.Assert(err, gc.IsNil) 208 c.Assert(errs, jc.DeepEquals, []error{nil}) 209 } 210 211 func (o *oracleVolumeSource) TestDestroyVolumesWithErrors(c *gc.C) { 212 for _, fake := range []*oracletesting.FakeStorageAPI{ 213 { 214 FakeComposer: oracletesting.FakeComposer{ 215 Compose: "/Compute-acme/jack.jones@example.com/allowed_video_servers", 216 }, 217 FakeStorageVolume: oracletesting.FakeStorageVolume{ 218 DeleteErr: errors.New("FakeStorageVolumeErr"), 219 }, 220 }, 221 } { 222 source := o.NewVolumeSource(c, fake, nil) 223 errs, err := source.DestroyVolumes(o.callCtx, []string{"JujuTools_storage"}) 224 c.Assert(err, gc.IsNil) 225 for _, val := range errs { 226 c.Assert(val, gc.NotNil) 227 } 228 } 229 } 230 231 func (o *oracleVolumeSource) TestReleaseVolumes(c *gc.C) { 232 o.PatchValue( 233 &oracletesting.DefaultFakeStorageAPI.StorageVolume.Tags, 234 []string{"abc", "juju-model-uuid=foo", "bar=baz"}, 235 ) 236 237 source := o.NewVolumeSource(c, oracletesting.DefaultFakeStorageAPI, nil) 238 errs, err := source.ReleaseVolumes(o.callCtx, []string{"foo"}) 239 c.Assert(err, gc.IsNil) 240 c.Assert(errs, jc.DeepEquals, []error{nil}) 241 242 oracletesting.DefaultFakeStorageAPI.FakeStorageVolume.CheckCallNames( 243 c, "StorageVolumeDetails", "UpdateStorageVolume", 244 ) 245 updateCall := oracletesting.DefaultFakeStorageAPI.FakeStorageVolume.Calls()[1] 246 arg0 := updateCall.Args[0].(api.StorageVolumeParams) 247 c.Assert(arg0.Tags, jc.DeepEquals, []string{"abc", "bar=baz"}) 248 } 249 250 func (o *oracleVolumeSource) TestReleaseVolumesUnchanged(c *gc.C) { 251 // Volume has no tags, which means there's no update required. 252 o.PatchValue( 253 &oracletesting.DefaultFakeStorageAPI.StorageVolume.Tags, 254 []string{}, 255 ) 256 257 source := o.NewVolumeSource(c, oracletesting.DefaultFakeStorageAPI, nil) 258 errs, err := source.ReleaseVolumes(o.callCtx, []string{"foo"}) 259 c.Assert(err, gc.IsNil) 260 c.Assert(errs, jc.DeepEquals, []error{nil}) 261 262 oracletesting.DefaultFakeStorageAPI.FakeStorageVolume.CheckCallNames( 263 c, "StorageVolumeDetails", 264 ) 265 } 266 267 func (o *oracleVolumeSource) TestImportVolume(c *gc.C) { 268 // Volume has no tags, which means there's no update required. 269 o.PatchValue( 270 &oracletesting.DefaultFakeStorageAPI.StorageVolume.Tags, 271 []string{"abc"}, 272 ) 273 274 source := o.NewVolumeSource(c, oracletesting.DefaultFakeStorageAPI, nil) 275 c.Assert(source, gc.Implements, new(storage.VolumeImporter)) 276 277 info, err := source.(storage.VolumeImporter).ImportVolume(o.callCtx, "foo", map[string]string{"bar": "baz"}) 278 c.Assert(err, gc.IsNil) 279 c.Assert(info, jc.DeepEquals, storage.VolumeInfo{ 280 VolumeId: "/Compute-a432100/sgiulitti@cloudbase.com/JujuTools_storage", 281 Size: 10, 282 Persistent: true, 283 }) 284 285 oracletesting.DefaultFakeStorageAPI.FakeStorageVolume.CheckCallNames( 286 c, "StorageVolumeDetails", "UpdateStorageVolume", 287 ) 288 updateCall := oracletesting.DefaultFakeStorageAPI.FakeStorageVolume.Calls()[1] 289 arg0 := updateCall.Args[0].(api.StorageVolumeParams) 290 c.Assert(arg0.Tags, jc.DeepEquals, []string{"abc", "bar=baz"}) 291 } 292 293 func (o *oracleVolumeSource) TestValidateVolumeParamsWithError(c *gc.C) { 294 source := o.NewVolumeSource(c, nil, nil) 295 err := source.ValidateVolumeParams( 296 storage.VolumeParams{ 297 Size: uint64(3921739812739812739), 298 }, 299 ) 300 c.Assert(err, gc.NotNil) 301 } 302 303 func (o *oracleVolumeSource) TestValidateVolumeParams(c *gc.C) { 304 source := o.NewVolumeSource(c, nil, nil) 305 err := source.ValidateVolumeParams( 306 storage.VolumeParams{ 307 Size: uint64(9999), 308 }, 309 ) 310 c.Assert(err, gc.IsNil) 311 } 312 313 func (o *oracleVolumeSource) TestAttachVolumes(c *gc.C) { 314 source := o.NewVolumeSource(c, oracletesting.DefaultFakeStorageAPI, oracletesting.DefaultEnvironAPI) 315 _, err := source.AttachVolumes(o.callCtx, []storage.VolumeAttachmentParams{ 316 { 317 AttachmentParams: storage.AttachmentParams{ 318 Provider: oracle.DefaultTypes[0], 319 InstanceId: "0", 320 ReadOnly: false, 321 }, 322 VolumeId: "1", 323 }, 324 }) 325 c.Assert(err, gc.IsNil) 326 } 327 328 func (o *oracleVolumeSource) TestDetachVolumes(c *gc.C) { 329 source := o.NewVolumeSource(c, oracletesting.DefaultFakeStorageAPI, nil) 330 errs, err := source.DetachVolumes(o.callCtx, []storage.VolumeAttachmentParams{ 331 { 332 AttachmentParams: storage.AttachmentParams{ 333 Provider: oracle.DefaultTypes[0], 334 InstanceId: "JujuTools_storage", 335 ReadOnly: false, 336 }, 337 VolumeId: "1", 338 }, 339 }) 340 c.Assert(err, gc.IsNil) 341 c.Assert(errs, gc.NotNil) 342 } 343 344 func (o *oracleVolumeSource) TestDetachVolumesWithErrors(c *gc.C) { 345 source := o.NewVolumeSource(c, &oracletesting.FakeStorageAPI{ 346 FakeComposer: oracletesting.FakeComposer{ 347 Compose: "/Compute-acme/jack.jones@example.com/allowed_video_servers", 348 }, 349 FakeStorageAttachment: oracletesting.FakeStorageAttachment{ 350 AllErr: errors.New("FakeStorageAttachmentErr"), 351 }}, oracletesting.DefaultEnvironAPI) 352 _, err := source.DetachVolumes(o.callCtx, []storage.VolumeAttachmentParams{ 353 { 354 AttachmentParams: storage.AttachmentParams{ 355 Provider: oracle.DefaultTypes[0], 356 InstanceId: "JujuTools_storage", 357 ReadOnly: false, 358 }, 359 VolumeId: "1", 360 }, 361 }) 362 c.Assert(err, gc.NotNil) 363 364 source = o.NewVolumeSource(c, &oracletesting.FakeStorageAPI{ 365 FakeComposer: oracletesting.FakeComposer{ 366 Compose: "/Compute-acme/jack.jones@example.com/allowed_video_servers", 367 }, 368 FakeStorageAttachment: oracletesting.FakeStorageAttachment{ 369 All: response.AllStorageAttachments{ 370 Result: []response.StorageAttachment{ 371 { 372 Account: nil, 373 Hypervisor: nil, 374 Index: 1, 375 Instance_name: "/Compute-a432100/sgiulitti@cloudbase.com/JujuTools/ebc4ce91-56bb-4120-ba78-13762597f837", 376 Storage_volume_name: "/Compute-a432100/sgiulitti@cloudbase.com/JujuTools_storage", 377 Name: "/Compute-a432100/sgiulitti@cloudbase.com/JujuTools/ebc4ce91-56bb-4120-ba78-13762597f837/1f90e657-f852-45ad-afbf-9a94f640a7ae", 378 Readonly: false, 379 State: "attached", 380 Uri: "https://compute.uscom-central-1.oraclecloud.com/storage/attachment/Compute-a432100/sgiulitti%40cloudbase.com/JujuTools/ebc4ce91-56bb-4120-ba78-13762597f837/1f90e657-f852-45ad-afbf-9a94f640a7ae", 381 }, 382 }, 383 }, 384 DeleteErr: errors.New("FakeStorageAttachmentErr")}}, oracletesting.DefaultEnvironAPI) 385 results, err := source.DetachVolumes(o.callCtx, []storage.VolumeAttachmentParams{ 386 { 387 AttachmentParams: storage.AttachmentParams{ 388 Provider: oracle.DefaultTypes[0], 389 InstanceId: "JujuTools_storage", 390 ReadOnly: false, 391 }, 392 VolumeId: "1", 393 }, 394 }) 395 396 c.Assert(err, gc.IsNil) 397 for _, val := range results { 398 c.Assert(val, gc.NotNil) 399 } 400 }