github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/api/storageprovisioner/provisioner_test.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package storageprovisioner_test 5 6 import ( 7 "errors" 8 9 jc "github.com/juju/testing/checkers" 10 gc "gopkg.in/check.v1" 11 "gopkg.in/juju/names.v2" 12 13 "github.com/juju/juju/api/base/testing" 14 "github.com/juju/juju/api/storageprovisioner" 15 "github.com/juju/juju/apiserver/params" 16 "github.com/juju/juju/storage" 17 coretesting "github.com/juju/juju/testing" 18 ) 19 20 var _ = gc.Suite(&provisionerSuite{}) 21 22 type provisionerSuite struct { 23 coretesting.BaseSuite 24 } 25 26 var nullAPICaller = testing.APICallerFunc( 27 func(objType string, version int, id, request string, arg, result interface{}) error { 28 return nil 29 }, 30 ) 31 32 func (s *provisionerSuite) TestNewStateMachineScope(c *gc.C) { 33 st, err := storageprovisioner.NewState(nullAPICaller, names.NewMachineTag("123")) 34 c.Check(err, jc.ErrorIsNil) 35 c.Check(st, gc.NotNil) 36 } 37 38 func (s *provisionerSuite) TestNewStateModelScope(c *gc.C) { 39 st, err := storageprovisioner.NewState(nullAPICaller, names.NewModelTag("87927ace-9e41-4fd5-8103-1a6fb5ff7eb4")) 40 c.Check(err, jc.ErrorIsNil) 41 c.Check(st, gc.NotNil) 42 } 43 44 func (s *provisionerSuite) TestNewStateBadScope(c *gc.C) { 45 st, err := storageprovisioner.NewState(nullAPICaller, names.NewUnitTag("mysql/0")) 46 c.Check(st, gc.IsNil) 47 c.Check(err, gc.ErrorMatches, "expected ModelTag or MachineTag, got names.UnitTag") 48 } 49 50 func (s *provisionerSuite) TestWatchVolumes(c *gc.C) { 51 var callCount int 52 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 53 c.Check(objType, gc.Equals, "StorageProvisioner") 54 c.Check(version, gc.Equals, 0) 55 c.Check(id, gc.Equals, "") 56 c.Check(request, gc.Equals, "WatchVolumes") 57 c.Assert(result, gc.FitsTypeOf, ¶ms.StringsWatchResults{}) 58 *(result.(*params.StringsWatchResults)) = params.StringsWatchResults{ 59 Results: []params.StringsWatchResult{{ 60 Error: ¶ms.Error{Message: "FAIL"}, 61 }}, 62 } 63 callCount++ 64 return nil 65 }) 66 67 st, err := storageprovisioner.NewState(apiCaller, names.NewMachineTag("123")) 68 c.Assert(err, jc.ErrorIsNil) 69 _, err = st.WatchVolumes() 70 c.Check(err, gc.ErrorMatches, "FAIL") 71 c.Check(callCount, gc.Equals, 1) 72 } 73 74 func (s *provisionerSuite) TestWatchFilesystems(c *gc.C) { 75 var callCount int 76 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 77 c.Check(objType, gc.Equals, "StorageProvisioner") 78 c.Check(version, gc.Equals, 0) 79 c.Check(id, gc.Equals, "") 80 c.Check(request, gc.Equals, "WatchFilesystems") 81 c.Assert(result, gc.FitsTypeOf, ¶ms.StringsWatchResults{}) 82 *(result.(*params.StringsWatchResults)) = params.StringsWatchResults{ 83 Results: []params.StringsWatchResult{{ 84 Error: ¶ms.Error{Message: "FAIL"}, 85 }}, 86 } 87 callCount++ 88 return nil 89 }) 90 91 st, err := storageprovisioner.NewState(apiCaller, names.NewMachineTag("123")) 92 c.Assert(err, jc.ErrorIsNil) 93 _, err = st.WatchFilesystems() 94 c.Check(err, gc.ErrorMatches, "FAIL") 95 c.Check(callCount, gc.Equals, 1) 96 } 97 98 func (s *provisionerSuite) TestWatchVolumeAttachments(c *gc.C) { 99 var callCount int 100 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 101 c.Check(objType, gc.Equals, "StorageProvisioner") 102 c.Check(version, gc.Equals, 0) 103 c.Check(id, gc.Equals, "") 104 c.Check(request, gc.Equals, "WatchVolumeAttachments") 105 c.Assert(result, gc.FitsTypeOf, ¶ms.MachineStorageIdsWatchResults{}) 106 *(result.(*params.MachineStorageIdsWatchResults)) = params.MachineStorageIdsWatchResults{ 107 Results: []params.MachineStorageIdsWatchResult{{ 108 Error: ¶ms.Error{Message: "FAIL"}, 109 }}, 110 } 111 callCount++ 112 return nil 113 }) 114 115 st, err := storageprovisioner.NewState(apiCaller, names.NewMachineTag("123")) 116 c.Assert(err, jc.ErrorIsNil) 117 _, err = st.WatchVolumeAttachments() 118 c.Check(err, gc.ErrorMatches, "FAIL") 119 c.Check(callCount, gc.Equals, 1) 120 } 121 122 func (s *provisionerSuite) TestWatchFilesystemAttachments(c *gc.C) { 123 var callCount int 124 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 125 c.Check(objType, gc.Equals, "StorageProvisioner") 126 c.Check(version, gc.Equals, 0) 127 c.Check(id, gc.Equals, "") 128 c.Check(request, gc.Equals, "WatchFilesystemAttachments") 129 c.Assert(result, gc.FitsTypeOf, ¶ms.MachineStorageIdsWatchResults{}) 130 *(result.(*params.MachineStorageIdsWatchResults)) = params.MachineStorageIdsWatchResults{ 131 Results: []params.MachineStorageIdsWatchResult{{ 132 Error: ¶ms.Error{Message: "FAIL"}, 133 }}, 134 } 135 callCount++ 136 return nil 137 }) 138 139 st, err := storageprovisioner.NewState(apiCaller, names.NewMachineTag("123")) 140 c.Assert(err, jc.ErrorIsNil) 141 _, err = st.WatchFilesystemAttachments() 142 c.Check(err, gc.ErrorMatches, "FAIL") 143 c.Check(callCount, gc.Equals, 1) 144 } 145 146 func (s *provisionerSuite) TestWatchBlockDevices(c *gc.C) { 147 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 148 c.Check(objType, gc.Equals, "StorageProvisioner") 149 c.Check(version, gc.Equals, 0) 150 c.Check(id, gc.Equals, "") 151 c.Check(request, gc.Equals, "WatchBlockDevices") 152 c.Assert(arg, gc.DeepEquals, params.Entities{ 153 Entities: []params.Entity{{"machine-123"}}, 154 }) 155 c.Assert(result, gc.FitsTypeOf, ¶ms.NotifyWatchResults{}) 156 *(result.(*params.NotifyWatchResults)) = params.NotifyWatchResults{ 157 Results: []params.NotifyWatchResult{{ 158 Error: ¶ms.Error{Message: "FAIL"}, 159 }}, 160 } 161 return nil 162 }) 163 164 st, err := storageprovisioner.NewState(apiCaller, names.NewMachineTag("123")) 165 c.Assert(err, jc.ErrorIsNil) 166 _, err = st.WatchBlockDevices(names.NewMachineTag("123")) 167 c.Check(err, gc.ErrorMatches, "FAIL") 168 } 169 170 func (s *provisionerSuite) TestVolumes(c *gc.C) { 171 var callCount int 172 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 173 c.Check(objType, gc.Equals, "StorageProvisioner") 174 c.Check(version, gc.Equals, 0) 175 c.Check(id, gc.Equals, "") 176 c.Check(request, gc.Equals, "Volumes") 177 c.Check(arg, gc.DeepEquals, params.Entities{Entities: []params.Entity{{"volume-100"}}}) 178 c.Assert(result, gc.FitsTypeOf, ¶ms.VolumeResults{}) 179 *(result.(*params.VolumeResults)) = params.VolumeResults{ 180 Results: []params.VolumeResult{{ 181 Result: params.Volume{ 182 VolumeTag: "volume-100", 183 Info: params.VolumeInfo{ 184 VolumeId: "volume-id", 185 HardwareId: "abc", 186 Size: 1024, 187 }, 188 }, 189 }}, 190 } 191 callCount++ 192 return nil 193 }) 194 195 st, err := storageprovisioner.NewState(apiCaller, names.NewMachineTag("123")) 196 c.Assert(err, jc.ErrorIsNil) 197 volumes, err := st.Volumes([]names.VolumeTag{names.NewVolumeTag("100")}) 198 c.Check(err, jc.ErrorIsNil) 199 c.Check(callCount, gc.Equals, 1) 200 c.Assert(volumes, jc.DeepEquals, []params.VolumeResult{{ 201 Result: params.Volume{ 202 VolumeTag: "volume-100", 203 Info: params.VolumeInfo{ 204 VolumeId: "volume-id", 205 HardwareId: "abc", 206 Size: 1024, 207 }, 208 }, 209 }}) 210 } 211 212 func (s *provisionerSuite) TestFilesystems(c *gc.C) { 213 var callCount int 214 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 215 c.Check(objType, gc.Equals, "StorageProvisioner") 216 c.Check(version, gc.Equals, 0) 217 c.Check(id, gc.Equals, "") 218 c.Check(request, gc.Equals, "Filesystems") 219 c.Check(arg, gc.DeepEquals, params.Entities{Entities: []params.Entity{{"filesystem-100"}}}) 220 c.Assert(result, gc.FitsTypeOf, ¶ms.FilesystemResults{}) 221 *(result.(*params.FilesystemResults)) = params.FilesystemResults{ 222 Results: []params.FilesystemResult{{ 223 Result: params.Filesystem{ 224 FilesystemTag: "filesystem-100", 225 Info: params.FilesystemInfo{ 226 FilesystemId: "filesystem-id", 227 Size: 1024, 228 }, 229 }, 230 }}, 231 } 232 callCount++ 233 return nil 234 }) 235 236 st, err := storageprovisioner.NewState(apiCaller, names.NewMachineTag("123")) 237 c.Assert(err, jc.ErrorIsNil) 238 filesystems, err := st.Filesystems([]names.FilesystemTag{names.NewFilesystemTag("100")}) 239 c.Check(err, jc.ErrorIsNil) 240 c.Check(callCount, gc.Equals, 1) 241 c.Assert(filesystems, jc.DeepEquals, []params.FilesystemResult{{ 242 Result: params.Filesystem{ 243 FilesystemTag: "filesystem-100", 244 Info: params.FilesystemInfo{ 245 FilesystemId: "filesystem-id", 246 Size: 1024, 247 }, 248 }, 249 }}) 250 } 251 252 func (s *provisionerSuite) TestVolumeAttachments(c *gc.C) { 253 volumeAttachmentResults := []params.VolumeAttachmentResult{{ 254 Result: params.VolumeAttachment{ 255 MachineTag: "machine-100", 256 VolumeTag: "volume-100", 257 Info: params.VolumeAttachmentInfo{ 258 DeviceName: "xvdf1", 259 }, 260 }, 261 }} 262 263 var callCount int 264 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 265 c.Check(objType, gc.Equals, "StorageProvisioner") 266 c.Check(version, gc.Equals, 0) 267 c.Check(id, gc.Equals, "") 268 c.Check(request, gc.Equals, "VolumeAttachments") 269 c.Check(arg, gc.DeepEquals, params.MachineStorageIds{ 270 Ids: []params.MachineStorageId{{ 271 MachineTag: "machine-100", AttachmentTag: "volume-100", 272 }}, 273 }) 274 c.Assert(result, gc.FitsTypeOf, ¶ms.VolumeAttachmentResults{}) 275 *(result.(*params.VolumeAttachmentResults)) = params.VolumeAttachmentResults{ 276 Results: volumeAttachmentResults, 277 } 278 callCount++ 279 return nil 280 }) 281 282 st, err := storageprovisioner.NewState(apiCaller, names.NewMachineTag("123")) 283 c.Assert(err, jc.ErrorIsNil) 284 volumes, err := st.VolumeAttachments([]params.MachineStorageId{{ 285 MachineTag: "machine-100", AttachmentTag: "volume-100", 286 }}) 287 c.Check(err, jc.ErrorIsNil) 288 c.Check(callCount, gc.Equals, 1) 289 c.Assert(volumes, jc.DeepEquals, volumeAttachmentResults) 290 } 291 292 func (s *provisionerSuite) TestVolumeBlockDevices(c *gc.C) { 293 blockDeviceResults := []params.BlockDeviceResult{{ 294 Result: storage.BlockDevice{ 295 DeviceName: "xvdf1", 296 HardwareId: "kjlaksjdlasjdklasd123123", 297 Size: 1024, 298 }, 299 }} 300 301 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 302 c.Check(objType, gc.Equals, "StorageProvisioner") 303 c.Check(version, gc.Equals, 0) 304 c.Check(id, gc.Equals, "") 305 c.Check(request, gc.Equals, "VolumeBlockDevices") 306 c.Check(arg, gc.DeepEquals, params.MachineStorageIds{ 307 Ids: []params.MachineStorageId{{ 308 MachineTag: "machine-100", AttachmentTag: "volume-100", 309 }}, 310 }) 311 c.Assert(result, gc.FitsTypeOf, ¶ms.BlockDeviceResults{}) 312 *(result.(*params.BlockDeviceResults)) = params.BlockDeviceResults{ 313 Results: blockDeviceResults, 314 } 315 return nil 316 }) 317 318 st, err := storageprovisioner.NewState(apiCaller, names.NewMachineTag("123")) 319 c.Assert(err, jc.ErrorIsNil) 320 volumes, err := st.VolumeBlockDevices([]params.MachineStorageId{{ 321 MachineTag: "machine-100", AttachmentTag: "volume-100", 322 }}) 323 c.Check(err, jc.ErrorIsNil) 324 c.Assert(volumes, jc.DeepEquals, blockDeviceResults) 325 } 326 327 func (s *provisionerSuite) TestFilesystemAttachments(c *gc.C) { 328 filesystemAttachmentResults := []params.FilesystemAttachmentResult{{ 329 Result: params.FilesystemAttachment{ 330 MachineTag: "machine-100", 331 FilesystemTag: "filesystem-100", 332 Info: params.FilesystemAttachmentInfo{ 333 MountPoint: "/srv", 334 }, 335 }, 336 }} 337 338 var callCount int 339 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 340 c.Check(objType, gc.Equals, "StorageProvisioner") 341 c.Check(version, gc.Equals, 0) 342 c.Check(id, gc.Equals, "") 343 c.Check(request, gc.Equals, "FilesystemAttachments") 344 c.Check(arg, gc.DeepEquals, params.MachineStorageIds{ 345 Ids: []params.MachineStorageId{{ 346 MachineTag: "machine-100", AttachmentTag: "filesystem-100", 347 }}, 348 }) 349 c.Assert(result, gc.FitsTypeOf, ¶ms.FilesystemAttachmentResults{}) 350 *(result.(*params.FilesystemAttachmentResults)) = params.FilesystemAttachmentResults{ 351 Results: filesystemAttachmentResults, 352 } 353 callCount++ 354 return nil 355 }) 356 357 st, err := storageprovisioner.NewState(apiCaller, names.NewMachineTag("123")) 358 c.Assert(err, jc.ErrorIsNil) 359 filesystems, err := st.FilesystemAttachments([]params.MachineStorageId{{ 360 MachineTag: "machine-100", AttachmentTag: "filesystem-100", 361 }}) 362 c.Check(err, jc.ErrorIsNil) 363 c.Check(callCount, gc.Equals, 1) 364 c.Assert(filesystems, jc.DeepEquals, filesystemAttachmentResults) 365 } 366 367 func (s *provisionerSuite) TestVolumeParams(c *gc.C) { 368 var callCount int 369 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 370 c.Check(objType, gc.Equals, "StorageProvisioner") 371 c.Check(version, gc.Equals, 0) 372 c.Check(id, gc.Equals, "") 373 c.Check(request, gc.Equals, "VolumeParams") 374 c.Check(arg, gc.DeepEquals, params.Entities{Entities: []params.Entity{{"volume-100"}}}) 375 c.Assert(result, gc.FitsTypeOf, ¶ms.VolumeParamsResults{}) 376 *(result.(*params.VolumeParamsResults)) = params.VolumeParamsResults{ 377 Results: []params.VolumeParamsResult{{ 378 Result: params.VolumeParams{ 379 VolumeTag: "volume-100", 380 Size: 1024, 381 Provider: "loop", 382 }, 383 }}, 384 } 385 callCount++ 386 return nil 387 }) 388 389 st, err := storageprovisioner.NewState(apiCaller, names.NewMachineTag("123")) 390 c.Assert(err, jc.ErrorIsNil) 391 volumeParams, err := st.VolumeParams([]names.VolumeTag{names.NewVolumeTag("100")}) 392 c.Check(err, jc.ErrorIsNil) 393 c.Check(callCount, gc.Equals, 1) 394 c.Assert(volumeParams, jc.DeepEquals, []params.VolumeParamsResult{{ 395 Result: params.VolumeParams{ 396 VolumeTag: "volume-100", Size: 1024, Provider: "loop", 397 }, 398 }}) 399 } 400 401 func (s *provisionerSuite) TestFilesystemParams(c *gc.C) { 402 var callCount int 403 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 404 c.Check(objType, gc.Equals, "StorageProvisioner") 405 c.Check(version, gc.Equals, 0) 406 c.Check(id, gc.Equals, "") 407 c.Check(request, gc.Equals, "FilesystemParams") 408 c.Check(arg, gc.DeepEquals, params.Entities{Entities: []params.Entity{{"filesystem-100"}}}) 409 c.Assert(result, gc.FitsTypeOf, ¶ms.FilesystemParamsResults{}) 410 *(result.(*params.FilesystemParamsResults)) = params.FilesystemParamsResults{ 411 Results: []params.FilesystemParamsResult{{ 412 Result: params.FilesystemParams{ 413 FilesystemTag: "filesystem-100", 414 Size: 1024, 415 Provider: "loop", 416 }, 417 }}, 418 } 419 callCount++ 420 return nil 421 }) 422 423 st, err := storageprovisioner.NewState(apiCaller, names.NewMachineTag("123")) 424 c.Assert(err, jc.ErrorIsNil) 425 filesystemParams, err := st.FilesystemParams([]names.FilesystemTag{names.NewFilesystemTag("100")}) 426 c.Check(err, jc.ErrorIsNil) 427 c.Check(callCount, gc.Equals, 1) 428 c.Assert(filesystemParams, jc.DeepEquals, []params.FilesystemParamsResult{{ 429 Result: params.FilesystemParams{ 430 FilesystemTag: "filesystem-100", Size: 1024, Provider: "loop", 431 }, 432 }}) 433 } 434 435 func (s *provisionerSuite) TestVolumeAttachmentParams(c *gc.C) { 436 paramsResults := []params.VolumeAttachmentParamsResult{{ 437 Result: params.VolumeAttachmentParams{ 438 MachineTag: "machine-100", 439 VolumeTag: "volume-100", 440 InstanceId: "inst-ance", 441 Provider: "loop", 442 }, 443 }} 444 445 var callCount int 446 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 447 c.Check(objType, gc.Equals, "StorageProvisioner") 448 c.Check(version, gc.Equals, 0) 449 c.Check(id, gc.Equals, "") 450 c.Check(request, gc.Equals, "VolumeAttachmentParams") 451 c.Check(arg, gc.DeepEquals, params.MachineStorageIds{ 452 Ids: []params.MachineStorageId{{ 453 MachineTag: "machine-100", AttachmentTag: "volume-100", 454 }}, 455 }) 456 c.Assert(result, gc.FitsTypeOf, ¶ms.VolumeAttachmentParamsResults{}) 457 *(result.(*params.VolumeAttachmentParamsResults)) = params.VolumeAttachmentParamsResults{ 458 Results: paramsResults, 459 } 460 callCount++ 461 return nil 462 }) 463 464 st, err := storageprovisioner.NewState(apiCaller, names.NewMachineTag("123")) 465 c.Assert(err, jc.ErrorIsNil) 466 volumeParams, err := st.VolumeAttachmentParams([]params.MachineStorageId{{ 467 MachineTag: "machine-100", AttachmentTag: "volume-100", 468 }}) 469 c.Check(err, jc.ErrorIsNil) 470 c.Check(callCount, gc.Equals, 1) 471 c.Assert(volumeParams, jc.DeepEquals, paramsResults) 472 } 473 474 func (s *provisionerSuite) TestFilesystemAttachmentParams(c *gc.C) { 475 paramsResults := []params.FilesystemAttachmentParamsResult{{ 476 Result: params.FilesystemAttachmentParams{ 477 MachineTag: "machine-100", 478 FilesystemTag: "filesystem-100", 479 InstanceId: "inst-ance", 480 Provider: "loop", 481 MountPoint: "/srv", 482 }, 483 }} 484 485 var callCount int 486 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 487 c.Check(objType, gc.Equals, "StorageProvisioner") 488 c.Check(version, gc.Equals, 0) 489 c.Check(id, gc.Equals, "") 490 c.Check(request, gc.Equals, "FilesystemAttachmentParams") 491 c.Check(arg, gc.DeepEquals, params.MachineStorageIds{ 492 Ids: []params.MachineStorageId{{ 493 MachineTag: "machine-100", AttachmentTag: "filesystem-100", 494 }}, 495 }) 496 c.Assert(result, gc.FitsTypeOf, ¶ms.FilesystemAttachmentParamsResults{}) 497 *(result.(*params.FilesystemAttachmentParamsResults)) = params.FilesystemAttachmentParamsResults{ 498 Results: paramsResults, 499 } 500 callCount++ 501 return nil 502 }) 503 504 st, err := storageprovisioner.NewState(apiCaller, names.NewMachineTag("123")) 505 c.Assert(err, jc.ErrorIsNil) 506 filesystemParams, err := st.FilesystemAttachmentParams([]params.MachineStorageId{{ 507 MachineTag: "machine-100", AttachmentTag: "filesystem-100", 508 }}) 509 c.Check(err, jc.ErrorIsNil) 510 c.Check(callCount, gc.Equals, 1) 511 c.Assert(filesystemParams, jc.DeepEquals, paramsResults) 512 } 513 514 func (s *provisionerSuite) TestSetVolumeInfo(c *gc.C) { 515 var callCount int 516 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 517 c.Check(objType, gc.Equals, "StorageProvisioner") 518 c.Check(version, gc.Equals, 0) 519 c.Check(id, gc.Equals, "") 520 c.Check(request, gc.Equals, "SetVolumeInfo") 521 c.Check(arg, gc.DeepEquals, params.Volumes{ 522 Volumes: []params.Volume{{ 523 VolumeTag: "volume-100", 524 Info: params.VolumeInfo{ 525 VolumeId: "123", 526 HardwareId: "abc", 527 Size: 1024, 528 Persistent: true, 529 }, 530 }}, 531 }) 532 c.Assert(result, gc.FitsTypeOf, ¶ms.ErrorResults{}) 533 *(result.(*params.ErrorResults)) = params.ErrorResults{ 534 Results: []params.ErrorResult{{Error: nil}}, 535 } 536 callCount++ 537 return nil 538 }) 539 540 st, err := storageprovisioner.NewState(apiCaller, names.NewMachineTag("123")) 541 c.Assert(err, jc.ErrorIsNil) 542 volumes := []params.Volume{{ 543 VolumeTag: "volume-100", 544 Info: params.VolumeInfo{ 545 VolumeId: "123", HardwareId: "abc", Size: 1024, Persistent: true, 546 }, 547 }} 548 errorResults, err := st.SetVolumeInfo(volumes) 549 c.Check(err, jc.ErrorIsNil) 550 c.Check(callCount, gc.Equals, 1) 551 c.Assert(errorResults, gc.HasLen, 1) 552 c.Assert(errorResults[0].Error, gc.IsNil) 553 } 554 555 func (s *provisionerSuite) TestSetFilesystemInfo(c *gc.C) { 556 var callCount int 557 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 558 c.Check(objType, gc.Equals, "StorageProvisioner") 559 c.Check(version, gc.Equals, 0) 560 c.Check(id, gc.Equals, "") 561 c.Check(request, gc.Equals, "SetFilesystemInfo") 562 c.Check(arg, gc.DeepEquals, params.Filesystems{ 563 Filesystems: []params.Filesystem{{ 564 FilesystemTag: "filesystem-100", 565 Info: params.FilesystemInfo{ 566 FilesystemId: "123", 567 Size: 1024, 568 }, 569 }}, 570 }) 571 c.Assert(result, gc.FitsTypeOf, ¶ms.ErrorResults{}) 572 *(result.(*params.ErrorResults)) = params.ErrorResults{ 573 Results: []params.ErrorResult{{Error: nil}}, 574 } 575 callCount++ 576 return nil 577 }) 578 579 st, err := storageprovisioner.NewState(apiCaller, names.NewMachineTag("123")) 580 c.Assert(err, jc.ErrorIsNil) 581 filesystems := []params.Filesystem{{ 582 FilesystemTag: "filesystem-100", 583 Info: params.FilesystemInfo{ 584 FilesystemId: "123", 585 Size: 1024, 586 }, 587 }} 588 errorResults, err := st.SetFilesystemInfo(filesystems) 589 c.Check(err, jc.ErrorIsNil) 590 c.Check(callCount, gc.Equals, 1) 591 c.Assert(errorResults, gc.HasLen, 1) 592 c.Assert(errorResults[0].Error, gc.IsNil) 593 } 594 595 func (s *provisionerSuite) TestSetVolumeAttachmentInfo(c *gc.C) { 596 volumeAttachments := []params.VolumeAttachment{{ 597 VolumeTag: "volume-100", 598 MachineTag: "machine-200", 599 Info: params.VolumeAttachmentInfo{ 600 DeviceName: "xvdf1", 601 }, 602 }} 603 604 var callCount int 605 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 606 c.Check(objType, gc.Equals, "StorageProvisioner") 607 c.Check(version, gc.Equals, 0) 608 c.Check(id, gc.Equals, "") 609 c.Check(request, gc.Equals, "SetVolumeAttachmentInfo") 610 c.Check(arg, jc.DeepEquals, params.VolumeAttachments{volumeAttachments}) 611 c.Assert(result, gc.FitsTypeOf, ¶ms.ErrorResults{}) 612 *(result.(*params.ErrorResults)) = params.ErrorResults{ 613 Results: []params.ErrorResult{{Error: nil}}, 614 } 615 callCount++ 616 return nil 617 }) 618 619 st, err := storageprovisioner.NewState(apiCaller, names.NewMachineTag("123")) 620 c.Assert(err, jc.ErrorIsNil) 621 errorResults, err := st.SetVolumeAttachmentInfo(volumeAttachments) 622 c.Check(err, jc.ErrorIsNil) 623 c.Check(callCount, gc.Equals, 1) 624 c.Assert(errorResults, gc.HasLen, 1) 625 c.Assert(errorResults[0].Error, gc.IsNil) 626 } 627 628 func (s *provisionerSuite) TestSetFilesystemAttachmentInfo(c *gc.C) { 629 filesystemAttachments := []params.FilesystemAttachment{{ 630 FilesystemTag: "filesystem-100", 631 MachineTag: "machine-200", 632 Info: params.FilesystemAttachmentInfo{ 633 MountPoint: "/srv", 634 }, 635 }} 636 637 var callCount int 638 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 639 c.Check(objType, gc.Equals, "StorageProvisioner") 640 c.Check(version, gc.Equals, 0) 641 c.Check(id, gc.Equals, "") 642 c.Check(request, gc.Equals, "SetFilesystemAttachmentInfo") 643 c.Check(arg, jc.DeepEquals, params.FilesystemAttachments{filesystemAttachments}) 644 c.Assert(result, gc.FitsTypeOf, ¶ms.ErrorResults{}) 645 *(result.(*params.ErrorResults)) = params.ErrorResults{ 646 Results: []params.ErrorResult{{Error: nil}}, 647 } 648 callCount++ 649 return nil 650 }) 651 652 st, err := storageprovisioner.NewState(apiCaller, names.NewMachineTag("123")) 653 c.Assert(err, jc.ErrorIsNil) 654 errorResults, err := st.SetFilesystemAttachmentInfo(filesystemAttachments) 655 c.Check(err, jc.ErrorIsNil) 656 c.Check(callCount, gc.Equals, 1) 657 c.Assert(errorResults, gc.HasLen, 1) 658 c.Assert(errorResults[0].Error, gc.IsNil) 659 } 660 661 func (s *provisionerSuite) testOpWithTags( 662 c *gc.C, opName string, apiCall func(*storageprovisioner.State, []names.Tag) ([]params.ErrorResult, error), 663 ) { 664 var callCount int 665 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 666 c.Check(objType, gc.Equals, "StorageProvisioner") 667 c.Check(version, gc.Equals, 0) 668 c.Check(id, gc.Equals, "") 669 c.Check(request, gc.Equals, opName) 670 c.Check(arg, gc.DeepEquals, params.Entities{Entities: []params.Entity{{Tag: "volume-100"}}}) 671 c.Assert(result, gc.FitsTypeOf, ¶ms.ErrorResults{}) 672 *(result.(*params.ErrorResults)) = params.ErrorResults{ 673 Results: []params.ErrorResult{{Error: nil}}, 674 } 675 callCount++ 676 return nil 677 }) 678 679 st, err := storageprovisioner.NewState(apiCaller, names.NewMachineTag("123")) 680 c.Assert(err, jc.ErrorIsNil) 681 volumes := []names.Tag{names.NewVolumeTag("100")} 682 errorResults, err := apiCall(st, volumes) 683 c.Check(err, jc.ErrorIsNil) 684 c.Check(callCount, gc.Equals, 1) 685 c.Assert(errorResults, jc.DeepEquals, []params.ErrorResult{{}}) 686 } 687 688 func (s *provisionerSuite) TestRemove(c *gc.C) { 689 s.testOpWithTags(c, "Remove", func(st *storageprovisioner.State, tags []names.Tag) ([]params.ErrorResult, error) { 690 return st.Remove(tags) 691 }) 692 } 693 694 func (s *provisionerSuite) TestEnsureDead(c *gc.C) { 695 s.testOpWithTags(c, "EnsureDead", func(st *storageprovisioner.State, tags []names.Tag) ([]params.ErrorResult, error) { 696 return st.EnsureDead(tags) 697 }) 698 } 699 700 func (s *provisionerSuite) TestLife(c *gc.C) { 701 var callCount int 702 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 703 c.Check(objType, gc.Equals, "StorageProvisioner") 704 c.Check(version, gc.Equals, 0) 705 c.Check(id, gc.Equals, "") 706 c.Check(request, gc.Equals, "Life") 707 c.Check(arg, gc.DeepEquals, params.Entities{Entities: []params.Entity{{Tag: "volume-100"}}}) 708 c.Assert(result, gc.FitsTypeOf, ¶ms.LifeResults{}) 709 *(result.(*params.LifeResults)) = params.LifeResults{ 710 Results: []params.LifeResult{{Life: params.Alive}}, 711 } 712 callCount++ 713 return nil 714 }) 715 716 st, err := storageprovisioner.NewState(apiCaller, names.NewMachineTag("123")) 717 c.Assert(err, jc.ErrorIsNil) 718 volumes := []names.Tag{names.NewVolumeTag("100")} 719 lifeResults, err := st.Life(volumes) 720 c.Check(err, jc.ErrorIsNil) 721 c.Check(callCount, gc.Equals, 1) 722 c.Assert(lifeResults, jc.DeepEquals, []params.LifeResult{{Life: params.Alive}}) 723 } 724 725 func (s *provisionerSuite) testClientError(c *gc.C, apiCall func(*storageprovisioner.State) error) { 726 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 727 return errors.New("blargh") 728 }) 729 st, err := storageprovisioner.NewState(apiCaller, names.NewMachineTag("123")) 730 c.Assert(err, jc.ErrorIsNil) 731 err = apiCall(st) 732 c.Check(err, gc.ErrorMatches, "blargh") 733 } 734 735 func (s *provisionerSuite) TestWatchVolumesClientError(c *gc.C) { 736 s.testClientError(c, func(st *storageprovisioner.State) error { 737 _, err := st.WatchVolumes() 738 return err 739 }) 740 } 741 742 func (s *provisionerSuite) TestVolumesClientError(c *gc.C) { 743 s.testClientError(c, func(st *storageprovisioner.State) error { 744 _, err := st.Volumes(nil) 745 return err 746 }) 747 } 748 749 func (s *provisionerSuite) TestVolumeParamsClientError(c *gc.C) { 750 s.testClientError(c, func(st *storageprovisioner.State) error { 751 _, err := st.VolumeParams(nil) 752 return err 753 }) 754 } 755 756 func (s *provisionerSuite) TestRemoveClientError(c *gc.C) { 757 s.testClientError(c, func(st *storageprovisioner.State) error { 758 _, err := st.Remove(nil) 759 return err 760 }) 761 } 762 763 func (s *provisionerSuite) TestRemoveAttachmentsClientError(c *gc.C) { 764 s.testClientError(c, func(st *storageprovisioner.State) error { 765 _, err := st.RemoveAttachments(nil) 766 return err 767 }) 768 } 769 770 func (s *provisionerSuite) TestSetVolumeInfoClientError(c *gc.C) { 771 s.testClientError(c, func(st *storageprovisioner.State) error { 772 _, err := st.SetVolumeInfo(nil) 773 return err 774 }) 775 } 776 777 func (s *provisionerSuite) TestEnsureDeadClientError(c *gc.C) { 778 s.testClientError(c, func(st *storageprovisioner.State) error { 779 _, err := st.EnsureDead(nil) 780 return err 781 }) 782 } 783 784 func (s *provisionerSuite) TestLifeClientError(c *gc.C) { 785 s.testClientError(c, func(st *storageprovisioner.State) error { 786 _, err := st.Life(nil) 787 return err 788 }) 789 } 790 791 func (s *provisionerSuite) TestAttachmentLifeClientError(c *gc.C) { 792 s.testClientError(c, func(st *storageprovisioner.State) error { 793 _, err := st.AttachmentLife(nil) 794 return err 795 }) 796 } 797 798 func (s *provisionerSuite) TestWatchVolumesServerError(c *gc.C) { 799 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 800 *(result.(*params.StringsWatchResults)) = params.StringsWatchResults{ 801 Results: []params.StringsWatchResult{{ 802 Error: ¶ms.Error{Message: "MSG", Code: "621"}, 803 }}, 804 } 805 return nil 806 }) 807 st, err := storageprovisioner.NewState(apiCaller, names.NewMachineTag("123")) 808 c.Assert(err, jc.ErrorIsNil) 809 _, err = st.WatchVolumes() 810 c.Check(err, gc.ErrorMatches, "MSG") 811 } 812 813 func (s *provisionerSuite) TestVolumesServerError(c *gc.C) { 814 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 815 *(result.(*params.VolumeResults)) = params.VolumeResults{ 816 Results: []params.VolumeResult{{ 817 Error: ¶ms.Error{Message: "MSG", Code: "621"}, 818 }}, 819 } 820 return nil 821 }) 822 st, err := storageprovisioner.NewState(apiCaller, names.NewMachineTag("123")) 823 c.Assert(err, jc.ErrorIsNil) 824 results, err := st.Volumes([]names.VolumeTag{names.NewVolumeTag("100")}) 825 c.Assert(err, jc.ErrorIsNil) 826 c.Assert(results, gc.HasLen, 1) 827 c.Check(results[0].Error, gc.ErrorMatches, "MSG") 828 } 829 830 func (s *provisionerSuite) TestVolumeParamsServerError(c *gc.C) { 831 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 832 *(result.(*params.VolumeParamsResults)) = params.VolumeParamsResults{ 833 Results: []params.VolumeParamsResult{{ 834 Error: ¶ms.Error{Message: "MSG", Code: "621"}, 835 }}, 836 } 837 return nil 838 }) 839 st, err := storageprovisioner.NewState(apiCaller, names.NewMachineTag("123")) 840 c.Assert(err, jc.ErrorIsNil) 841 results, err := st.VolumeParams([]names.VolumeTag{names.NewVolumeTag("100")}) 842 c.Assert(err, jc.ErrorIsNil) 843 c.Assert(results, gc.HasLen, 1) 844 c.Check(results[0].Error, gc.ErrorMatches, "MSG") 845 } 846 847 func (s *provisionerSuite) TestSetVolumeInfoServerError(c *gc.C) { 848 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 849 *(result.(*params.ErrorResults)) = params.ErrorResults{ 850 Results: []params.ErrorResult{{ 851 Error: ¶ms.Error{Message: "MSG", Code: "621"}, 852 }}, 853 } 854 return nil 855 }) 856 st, err := storageprovisioner.NewState(apiCaller, names.NewMachineTag("123")) 857 c.Assert(err, jc.ErrorIsNil) 858 results, err := st.SetVolumeInfo([]params.Volume{{ 859 VolumeTag: names.NewVolumeTag("100").String(), 860 }}) 861 c.Assert(err, jc.ErrorIsNil) 862 c.Assert(results, gc.HasLen, 1) 863 c.Check(results[0].Error, gc.ErrorMatches, "MSG") 864 } 865 866 func (s *provisionerSuite) testServerError(c *gc.C, apiCall func(*storageprovisioner.State, []names.Tag) ([]params.ErrorResult, error)) { 867 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 868 *(result.(*params.ErrorResults)) = params.ErrorResults{ 869 Results: []params.ErrorResult{{ 870 Error: ¶ms.Error{Message: "MSG", Code: "621"}, 871 }}, 872 } 873 return nil 874 }) 875 st, err := storageprovisioner.NewState(apiCaller, names.NewMachineTag("123")) 876 c.Assert(err, jc.ErrorIsNil) 877 tags := []names.Tag{ 878 names.NewVolumeTag("100"), 879 } 880 results, err := apiCall(st, tags) 881 c.Assert(err, jc.ErrorIsNil) 882 c.Assert(results, gc.HasLen, 1) 883 c.Check(results[0].Error, gc.ErrorMatches, "MSG") 884 } 885 886 func (s *provisionerSuite) TestRemoveServerError(c *gc.C) { 887 s.testServerError(c, func(st *storageprovisioner.State, tags []names.Tag) ([]params.ErrorResult, error) { 888 return st.Remove(tags) 889 }) 890 } 891 892 func (s *provisionerSuite) TestEnsureDeadServerError(c *gc.C) { 893 s.testServerError(c, func(st *storageprovisioner.State, tags []names.Tag) ([]params.ErrorResult, error) { 894 return st.EnsureDead(tags) 895 }) 896 } 897 898 func (s *provisionerSuite) TestLifeServerError(c *gc.C) { 899 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 900 *(result.(*params.LifeResults)) = params.LifeResults{ 901 Results: []params.LifeResult{{ 902 Error: ¶ms.Error{Message: "MSG", Code: "621"}, 903 }}, 904 } 905 return nil 906 }) 907 st, err := storageprovisioner.NewState(apiCaller, names.NewMachineTag("123")) 908 c.Assert(err, jc.ErrorIsNil) 909 tags := []names.Tag{ 910 names.NewVolumeTag("100"), 911 } 912 results, err := st.Life(tags) 913 c.Assert(err, jc.ErrorIsNil) 914 c.Assert(results, gc.HasLen, 1) 915 c.Check(results[0].Error, gc.ErrorMatches, "MSG") 916 }