github.com/juju/juju@v0.0.0-20240327075706-a90865de2538/api/agent/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 "github.com/juju/names/v5" 10 jc "github.com/juju/testing/checkers" 11 gc "gopkg.in/check.v1" 12 13 "github.com/juju/juju/api/agent/storageprovisioner" 14 "github.com/juju/juju/api/base/testing" 15 "github.com/juju/juju/core/life" 16 "github.com/juju/juju/rpc/params" 17 "github.com/juju/juju/storage" 18 coretesting "github.com/juju/juju/testing" 19 ) 20 21 var _ = gc.Suite(&provisionerSuite{}) 22 23 type provisionerSuite struct { 24 coretesting.BaseSuite 25 } 26 27 func (s *provisionerSuite) TestWatchApplications(c *gc.C) { 28 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 29 c.Check(objType, gc.Equals, "StorageProvisioner") 30 c.Check(version, gc.Equals, 0) 31 c.Check(id, gc.Equals, "") 32 c.Check(request, gc.Equals, "WatchApplications") 33 c.Assert(result, gc.FitsTypeOf, ¶ms.StringsWatchResult{}) 34 *(result.(*params.StringsWatchResult)) = params.StringsWatchResult{ 35 Error: ¶ms.Error{Message: "FAIL"}, 36 } 37 return nil 38 }) 39 40 st, err := storageprovisioner.NewState(apiCaller) 41 c.Assert(err, jc.ErrorIsNil) 42 watcher, err := st.WatchApplications() 43 c.Assert(watcher, gc.IsNil) 44 c.Assert(err, gc.ErrorMatches, "FAIL") 45 } 46 47 func (s *provisionerSuite) TestWatchVolumes(c *gc.C) { 48 var callCount int 49 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 50 c.Check(objType, gc.Equals, "StorageProvisioner") 51 c.Check(version, gc.Equals, 0) 52 c.Check(id, gc.Equals, "") 53 c.Check(request, gc.Equals, "WatchVolumes") 54 c.Check(arg, jc.DeepEquals, params.Entities{ 55 Entities: []params.Entity{{Tag: "machine-123"}}, 56 }) 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) 68 c.Assert(err, jc.ErrorIsNil) 69 _, err = st.WatchVolumes(names.NewMachineTag("123")) 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.Check(arg, jc.DeepEquals, params.Entities{ 82 Entities: []params.Entity{{Tag: "machine-123"}}, 83 }) 84 c.Assert(result, gc.FitsTypeOf, ¶ms.StringsWatchResults{}) 85 *(result.(*params.StringsWatchResults)) = params.StringsWatchResults{ 86 Results: []params.StringsWatchResult{{ 87 Error: ¶ms.Error{Message: "FAIL"}, 88 }}, 89 } 90 callCount++ 91 return nil 92 }) 93 94 st, err := storageprovisioner.NewState(apiCaller) 95 c.Assert(err, jc.ErrorIsNil) 96 _, err = st.WatchFilesystems(names.NewMachineTag("123")) 97 c.Check(err, gc.ErrorMatches, "FAIL") 98 c.Check(callCount, gc.Equals, 1) 99 } 100 101 func (s *provisionerSuite) TestWatchVolumeAttachments(c *gc.C) { 102 var callCount int 103 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 104 c.Check(objType, gc.Equals, "StorageProvisioner") 105 c.Check(version, gc.Equals, 0) 106 c.Check(id, gc.Equals, "") 107 c.Check(request, gc.Equals, "WatchVolumeAttachments") 108 c.Check(arg, jc.DeepEquals, params.Entities{ 109 Entities: []params.Entity{{Tag: "machine-123"}}, 110 }) 111 c.Assert(result, gc.FitsTypeOf, ¶ms.MachineStorageIdsWatchResults{}) 112 *(result.(*params.MachineStorageIdsWatchResults)) = params.MachineStorageIdsWatchResults{ 113 Results: []params.MachineStorageIdsWatchResult{{ 114 Error: ¶ms.Error{Message: "FAIL"}, 115 }}, 116 } 117 callCount++ 118 return nil 119 }) 120 121 st, err := storageprovisioner.NewState(apiCaller) 122 c.Assert(err, jc.ErrorIsNil) 123 _, err = st.WatchVolumeAttachments(names.NewMachineTag("123")) 124 c.Check(err, gc.ErrorMatches, "FAIL") 125 c.Check(callCount, gc.Equals, 1) 126 } 127 128 func (s *provisionerSuite) TestWatchVolumeAttachmentPlans(c *gc.C) { 129 var callCount int 130 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 131 c.Check(objType, gc.Equals, "StorageProvisioner") 132 c.Check(version, gc.Equals, 0) 133 c.Check(id, gc.Equals, "") 134 c.Check(request, gc.Equals, "WatchVolumeAttachmentPlans") 135 c.Check(arg, jc.DeepEquals, params.Entities{ 136 Entities: []params.Entity{{Tag: "machine-123"}}, 137 }) 138 c.Assert(result, gc.FitsTypeOf, ¶ms.MachineStorageIdsWatchResults{}) 139 *(result.(*params.MachineStorageIdsWatchResults)) = params.MachineStorageIdsWatchResults{ 140 Results: []params.MachineStorageIdsWatchResult{{ 141 Error: ¶ms.Error{Message: "FAIL"}, 142 }}, 143 } 144 callCount++ 145 return nil 146 }) 147 148 st, err := storageprovisioner.NewState(apiCaller) 149 c.Assert(err, jc.ErrorIsNil) 150 _, err = st.WatchVolumeAttachmentPlans(names.NewMachineTag("123")) 151 c.Check(err, gc.ErrorMatches, "FAIL") 152 c.Check(callCount, gc.Equals, 1) 153 } 154 155 func (s *provisionerSuite) TestWatchFilesystemAttachments(c *gc.C) { 156 var callCount int 157 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 158 c.Check(objType, gc.Equals, "StorageProvisioner") 159 c.Check(version, gc.Equals, 0) 160 c.Check(id, gc.Equals, "") 161 c.Check(request, gc.Equals, "WatchFilesystemAttachments") 162 c.Check(arg, jc.DeepEquals, params.Entities{ 163 Entities: []params.Entity{{Tag: "machine-123"}}, 164 }) 165 c.Assert(result, gc.FitsTypeOf, ¶ms.MachineStorageIdsWatchResults{}) 166 *(result.(*params.MachineStorageIdsWatchResults)) = params.MachineStorageIdsWatchResults{ 167 Results: []params.MachineStorageIdsWatchResult{{ 168 Error: ¶ms.Error{Message: "FAIL"}, 169 }}, 170 } 171 callCount++ 172 return nil 173 }) 174 175 st, err := storageprovisioner.NewState(apiCaller) 176 c.Assert(err, jc.ErrorIsNil) 177 _, err = st.WatchFilesystemAttachments(names.NewMachineTag("123")) 178 c.Check(err, gc.ErrorMatches, "FAIL") 179 c.Check(callCount, gc.Equals, 1) 180 } 181 182 func (s *provisionerSuite) TestWatchBlockDevices(c *gc.C) { 183 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 184 c.Check(objType, gc.Equals, "StorageProvisioner") 185 c.Check(version, gc.Equals, 0) 186 c.Check(id, gc.Equals, "") 187 c.Check(request, gc.Equals, "WatchBlockDevices") 188 c.Assert(arg, gc.DeepEquals, params.Entities{ 189 Entities: []params.Entity{{"machine-123"}}, 190 }) 191 c.Assert(result, gc.FitsTypeOf, ¶ms.NotifyWatchResults{}) 192 *(result.(*params.NotifyWatchResults)) = params.NotifyWatchResults{ 193 Results: []params.NotifyWatchResult{{ 194 Error: ¶ms.Error{Message: "FAIL"}, 195 }}, 196 } 197 return nil 198 }) 199 200 st, err := storageprovisioner.NewState(apiCaller) 201 c.Assert(err, jc.ErrorIsNil) 202 _, err = st.WatchBlockDevices(names.NewMachineTag("123")) 203 c.Check(err, gc.ErrorMatches, "FAIL") 204 } 205 206 func (s *provisionerSuite) TestVolumes(c *gc.C) { 207 var callCount int 208 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 209 c.Check(objType, gc.Equals, "StorageProvisioner") 210 c.Check(version, gc.Equals, 0) 211 c.Check(id, gc.Equals, "") 212 c.Check(request, gc.Equals, "Volumes") 213 c.Check(arg, gc.DeepEquals, params.Entities{Entities: []params.Entity{{"volume-100"}}}) 214 c.Assert(result, gc.FitsTypeOf, ¶ms.VolumeResults{}) 215 *(result.(*params.VolumeResults)) = params.VolumeResults{ 216 Results: []params.VolumeResult{{ 217 Result: params.Volume{ 218 VolumeTag: "volume-100", 219 Info: params.VolumeInfo{ 220 VolumeId: "volume-id", 221 HardwareId: "abc", 222 Size: 1024, 223 }, 224 }, 225 }}, 226 } 227 callCount++ 228 return nil 229 }) 230 231 st, err := storageprovisioner.NewState(apiCaller) 232 c.Assert(err, jc.ErrorIsNil) 233 volumes, err := st.Volumes([]names.VolumeTag{names.NewVolumeTag("100")}) 234 c.Check(err, jc.ErrorIsNil) 235 c.Check(callCount, gc.Equals, 1) 236 c.Assert(volumes, jc.DeepEquals, []params.VolumeResult{{ 237 Result: params.Volume{ 238 VolumeTag: "volume-100", 239 Info: params.VolumeInfo{ 240 VolumeId: "volume-id", 241 HardwareId: "abc", 242 Size: 1024, 243 }, 244 }, 245 }}) 246 } 247 248 func (s *provisionerSuite) TestFilesystems(c *gc.C) { 249 var callCount int 250 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 251 c.Check(objType, gc.Equals, "StorageProvisioner") 252 c.Check(version, gc.Equals, 0) 253 c.Check(id, gc.Equals, "") 254 c.Check(request, gc.Equals, "Filesystems") 255 c.Check(arg, gc.DeepEquals, params.Entities{Entities: []params.Entity{{"filesystem-100"}}}) 256 c.Assert(result, gc.FitsTypeOf, ¶ms.FilesystemResults{}) 257 *(result.(*params.FilesystemResults)) = params.FilesystemResults{ 258 Results: []params.FilesystemResult{{ 259 Result: params.Filesystem{ 260 FilesystemTag: "filesystem-100", 261 Info: params.FilesystemInfo{ 262 FilesystemId: "filesystem-id", 263 Size: 1024, 264 }, 265 }, 266 }}, 267 } 268 callCount++ 269 return nil 270 }) 271 272 st, err := storageprovisioner.NewState(apiCaller) 273 c.Assert(err, jc.ErrorIsNil) 274 filesystems, err := st.Filesystems([]names.FilesystemTag{names.NewFilesystemTag("100")}) 275 c.Check(err, jc.ErrorIsNil) 276 c.Check(callCount, gc.Equals, 1) 277 c.Assert(filesystems, jc.DeepEquals, []params.FilesystemResult{{ 278 Result: params.Filesystem{ 279 FilesystemTag: "filesystem-100", 280 Info: params.FilesystemInfo{ 281 FilesystemId: "filesystem-id", 282 Size: 1024, 283 }, 284 }, 285 }}) 286 } 287 288 func (s *provisionerSuite) TestVolumeAttachments(c *gc.C) { 289 volumeAttachmentResults := []params.VolumeAttachmentResult{{ 290 Result: params.VolumeAttachment{ 291 MachineTag: "machine-100", 292 VolumeTag: "volume-100", 293 Info: params.VolumeAttachmentInfo{ 294 DeviceName: "xvdf1", 295 }, 296 }, 297 }} 298 299 var callCount int 300 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 301 c.Check(objType, gc.Equals, "StorageProvisioner") 302 c.Check(version, gc.Equals, 0) 303 c.Check(id, gc.Equals, "") 304 c.Check(request, gc.Equals, "VolumeAttachments") 305 c.Check(arg, gc.DeepEquals, params.MachineStorageIds{ 306 Ids: []params.MachineStorageId{{ 307 MachineTag: "machine-100", AttachmentTag: "volume-100", 308 }}, 309 }) 310 c.Assert(result, gc.FitsTypeOf, ¶ms.VolumeAttachmentResults{}) 311 *(result.(*params.VolumeAttachmentResults)) = params.VolumeAttachmentResults{ 312 Results: volumeAttachmentResults, 313 } 314 callCount++ 315 return nil 316 }) 317 318 st, err := storageprovisioner.NewState(apiCaller) 319 c.Assert(err, jc.ErrorIsNil) 320 volumes, err := st.VolumeAttachments([]params.MachineStorageId{{ 321 MachineTag: "machine-100", AttachmentTag: "volume-100", 322 }}) 323 c.Check(err, jc.ErrorIsNil) 324 c.Check(callCount, gc.Equals, 1) 325 c.Assert(volumes, jc.DeepEquals, volumeAttachmentResults) 326 } 327 328 func (s *provisionerSuite) TestVolumeAttachmentPlans(c *gc.C) { 329 volumeAttachmentPlanResults := []params.VolumeAttachmentPlanResult{{ 330 Result: params.VolumeAttachmentPlan{ 331 MachineTag: "machine-100", 332 VolumeTag: "volume-100", 333 PlanInfo: params.VolumeAttachmentPlanInfo{ 334 DeviceType: storage.DeviceTypeISCSI, 335 DeviceAttributes: map[string]string{ 336 "iqn": "bogusIQN", 337 "address": "192.168.1.1", 338 "port": "9999", 339 "chap-user": "example", 340 "chap-secret": "supersecretpassword", 341 }, 342 }, 343 BlockDevice: storage.BlockDevice{ 344 DeviceName: "sda", 345 }, 346 }, 347 }} 348 349 var callCount int 350 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 351 c.Check(objType, gc.Equals, "StorageProvisioner") 352 c.Check(version, gc.Equals, 0) 353 c.Check(id, gc.Equals, "") 354 c.Check(request, gc.Equals, "VolumeAttachmentPlans") 355 c.Check(arg, gc.DeepEquals, params.MachineStorageIds{ 356 Ids: []params.MachineStorageId{{ 357 MachineTag: "machine-100", AttachmentTag: "volume-100", 358 }}, 359 }) 360 c.Assert(result, gc.FitsTypeOf, ¶ms.VolumeAttachmentPlanResults{}) 361 *(result.(*params.VolumeAttachmentPlanResults)) = params.VolumeAttachmentPlanResults{ 362 Results: volumeAttachmentPlanResults, 363 } 364 callCount++ 365 return nil 366 }) 367 368 st, err := storageprovisioner.NewState(apiCaller) 369 c.Assert(err, jc.ErrorIsNil) 370 volumes, err := st.VolumeAttachmentPlans([]params.MachineStorageId{{ 371 MachineTag: "machine-100", AttachmentTag: "volume-100", 372 }}) 373 c.Check(err, jc.ErrorIsNil) 374 c.Check(callCount, gc.Equals, 1) 375 c.Assert(volumes, jc.DeepEquals, volumeAttachmentPlanResults) 376 } 377 378 func (s *provisionerSuite) TestVolumeBlockDevices(c *gc.C) { 379 blockDeviceResults := []params.BlockDeviceResult{{ 380 Result: storage.BlockDevice{ 381 DeviceName: "xvdf1", 382 HardwareId: "kjlaksjdlasjdklasd123123", 383 Size: 1024, 384 }, 385 }} 386 387 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 388 c.Check(objType, gc.Equals, "StorageProvisioner") 389 c.Check(version, gc.Equals, 0) 390 c.Check(id, gc.Equals, "") 391 c.Check(request, gc.Equals, "VolumeBlockDevices") 392 c.Check(arg, gc.DeepEquals, params.MachineStorageIds{ 393 Ids: []params.MachineStorageId{{ 394 MachineTag: "machine-100", AttachmentTag: "volume-100", 395 }}, 396 }) 397 c.Assert(result, gc.FitsTypeOf, ¶ms.BlockDeviceResults{}) 398 *(result.(*params.BlockDeviceResults)) = params.BlockDeviceResults{ 399 Results: blockDeviceResults, 400 } 401 return nil 402 }) 403 404 st, err := storageprovisioner.NewState(apiCaller) 405 c.Assert(err, jc.ErrorIsNil) 406 volumes, err := st.VolumeBlockDevices([]params.MachineStorageId{{ 407 MachineTag: "machine-100", AttachmentTag: "volume-100", 408 }}) 409 c.Check(err, jc.ErrorIsNil) 410 c.Assert(volumes, jc.DeepEquals, blockDeviceResults) 411 } 412 413 func (s *provisionerSuite) TestFilesystemAttachments(c *gc.C) { 414 filesystemAttachmentResults := []params.FilesystemAttachmentResult{{ 415 Result: params.FilesystemAttachment{ 416 MachineTag: "machine-100", 417 FilesystemTag: "filesystem-100", 418 Info: params.FilesystemAttachmentInfo{ 419 MountPoint: "/srv", 420 }, 421 }, 422 }} 423 424 var callCount int 425 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 426 c.Check(objType, gc.Equals, "StorageProvisioner") 427 c.Check(version, gc.Equals, 0) 428 c.Check(id, gc.Equals, "") 429 c.Check(request, gc.Equals, "FilesystemAttachments") 430 c.Check(arg, gc.DeepEquals, params.MachineStorageIds{ 431 Ids: []params.MachineStorageId{{ 432 MachineTag: "machine-100", AttachmentTag: "filesystem-100", 433 }}, 434 }) 435 c.Assert(result, gc.FitsTypeOf, ¶ms.FilesystemAttachmentResults{}) 436 *(result.(*params.FilesystemAttachmentResults)) = params.FilesystemAttachmentResults{ 437 Results: filesystemAttachmentResults, 438 } 439 callCount++ 440 return nil 441 }) 442 443 st, err := storageprovisioner.NewState(apiCaller) 444 c.Assert(err, jc.ErrorIsNil) 445 filesystems, err := st.FilesystemAttachments([]params.MachineStorageId{{ 446 MachineTag: "machine-100", AttachmentTag: "filesystem-100", 447 }}) 448 c.Check(err, jc.ErrorIsNil) 449 c.Check(callCount, gc.Equals, 1) 450 c.Assert(filesystems, jc.DeepEquals, filesystemAttachmentResults) 451 } 452 453 func (s *provisionerSuite) TestVolumeParams(c *gc.C) { 454 var callCount int 455 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 456 c.Check(objType, gc.Equals, "StorageProvisioner") 457 c.Check(version, gc.Equals, 0) 458 c.Check(id, gc.Equals, "") 459 c.Check(request, gc.Equals, "VolumeParams") 460 c.Check(arg, gc.DeepEquals, params.Entities{Entities: []params.Entity{{"volume-100"}}}) 461 c.Assert(result, gc.FitsTypeOf, ¶ms.VolumeParamsResults{}) 462 *(result.(*params.VolumeParamsResults)) = params.VolumeParamsResults{ 463 Results: []params.VolumeParamsResult{{ 464 Result: params.VolumeParams{ 465 VolumeTag: "volume-100", 466 Size: 1024, 467 Provider: "loop", 468 }, 469 }}, 470 } 471 callCount++ 472 return nil 473 }) 474 475 st, err := storageprovisioner.NewState(apiCaller) 476 c.Assert(err, jc.ErrorIsNil) 477 volumeParams, err := st.VolumeParams([]names.VolumeTag{names.NewVolumeTag("100")}) 478 c.Check(err, jc.ErrorIsNil) 479 c.Check(callCount, gc.Equals, 1) 480 c.Assert(volumeParams, jc.DeepEquals, []params.VolumeParamsResult{{ 481 Result: params.VolumeParams{ 482 VolumeTag: "volume-100", Size: 1024, Provider: "loop", 483 }, 484 }}) 485 } 486 487 func (s *provisionerSuite) TestRemoveVolumeParams(c *gc.C) { 488 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 489 c.Check(objType, gc.Equals, "StorageProvisioner") 490 c.Check(version, gc.Equals, 0) 491 c.Check(id, gc.Equals, "") 492 c.Check(request, gc.Equals, "RemoveVolumeParams") 493 c.Check(arg, gc.DeepEquals, params.Entities{Entities: []params.Entity{{"volume-100"}}}) 494 c.Assert(result, gc.FitsTypeOf, ¶ms.RemoveVolumeParamsResults{}) 495 *(result.(*params.RemoveVolumeParamsResults)) = params.RemoveVolumeParamsResults{ 496 Results: []params.RemoveVolumeParamsResult{{ 497 Result: params.RemoveVolumeParams{ 498 Provider: "foo", 499 VolumeId: "bar", 500 Destroy: true, 501 }, 502 }}, 503 } 504 return nil 505 }) 506 507 st, err := storageprovisioner.NewState(apiCaller) 508 c.Assert(err, jc.ErrorIsNil) 509 volumeParams, err := st.RemoveVolumeParams([]names.VolumeTag{names.NewVolumeTag("100")}) 510 c.Check(err, jc.ErrorIsNil) 511 c.Assert(volumeParams, jc.DeepEquals, []params.RemoveVolumeParamsResult{{ 512 Result: params.RemoveVolumeParams{ 513 Provider: "foo", 514 VolumeId: "bar", 515 Destroy: true, 516 }, 517 }}) 518 } 519 520 func (s *provisionerSuite) TestFilesystemParams(c *gc.C) { 521 var callCount int 522 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 523 c.Check(objType, gc.Equals, "StorageProvisioner") 524 c.Check(version, gc.Equals, 0) 525 c.Check(id, gc.Equals, "") 526 c.Check(request, gc.Equals, "FilesystemParams") 527 c.Check(arg, gc.DeepEquals, params.Entities{Entities: []params.Entity{{"filesystem-100"}}}) 528 c.Assert(result, gc.FitsTypeOf, ¶ms.FilesystemParamsResults{}) 529 *(result.(*params.FilesystemParamsResults)) = params.FilesystemParamsResults{ 530 Results: []params.FilesystemParamsResult{{ 531 Result: params.FilesystemParams{ 532 FilesystemTag: "filesystem-100", 533 Size: 1024, 534 Provider: "loop", 535 }, 536 }}, 537 } 538 callCount++ 539 return nil 540 }) 541 542 st, err := storageprovisioner.NewState(apiCaller) 543 c.Assert(err, jc.ErrorIsNil) 544 filesystemParams, err := st.FilesystemParams([]names.FilesystemTag{names.NewFilesystemTag("100")}) 545 c.Check(err, jc.ErrorIsNil) 546 c.Check(callCount, gc.Equals, 1) 547 c.Assert(filesystemParams, jc.DeepEquals, []params.FilesystemParamsResult{{ 548 Result: params.FilesystemParams{ 549 FilesystemTag: "filesystem-100", Size: 1024, Provider: "loop", 550 }, 551 }}) 552 } 553 554 func (s *provisionerSuite) TestRemoveFilesystemParams(c *gc.C) { 555 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 556 c.Check(objType, gc.Equals, "StorageProvisioner") 557 c.Check(version, gc.Equals, 0) 558 c.Check(id, gc.Equals, "") 559 c.Check(request, gc.Equals, "RemoveFilesystemParams") 560 c.Check(arg, gc.DeepEquals, params.Entities{Entities: []params.Entity{{"filesystem-100"}}}) 561 c.Assert(result, gc.FitsTypeOf, ¶ms.RemoveFilesystemParamsResults{}) 562 *(result.(*params.RemoveFilesystemParamsResults)) = params.RemoveFilesystemParamsResults{ 563 Results: []params.RemoveFilesystemParamsResult{{ 564 Result: params.RemoveFilesystemParams{ 565 Provider: "foo", 566 FilesystemId: "bar", 567 Destroy: true, 568 }, 569 }}, 570 } 571 return nil 572 }) 573 574 st, err := storageprovisioner.NewState(apiCaller) 575 c.Assert(err, jc.ErrorIsNil) 576 filesystemParams, err := st.RemoveFilesystemParams([]names.FilesystemTag{names.NewFilesystemTag("100")}) 577 c.Check(err, jc.ErrorIsNil) 578 c.Assert(filesystemParams, jc.DeepEquals, []params.RemoveFilesystemParamsResult{{ 579 Result: params.RemoveFilesystemParams{ 580 Provider: "foo", 581 FilesystemId: "bar", 582 Destroy: true, 583 }, 584 }}) 585 } 586 587 func (s *provisionerSuite) TestVolumeAttachmentParams(c *gc.C) { 588 paramsResults := []params.VolumeAttachmentParamsResult{{ 589 Result: params.VolumeAttachmentParams{ 590 MachineTag: "machine-100", 591 VolumeTag: "volume-100", 592 InstanceId: "inst-ance", 593 Provider: "loop", 594 }, 595 }} 596 597 var callCount int 598 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 599 c.Check(objType, gc.Equals, "StorageProvisioner") 600 c.Check(version, gc.Equals, 0) 601 c.Check(id, gc.Equals, "") 602 c.Check(request, gc.Equals, "VolumeAttachmentParams") 603 c.Check(arg, gc.DeepEquals, params.MachineStorageIds{ 604 Ids: []params.MachineStorageId{{ 605 MachineTag: "machine-100", AttachmentTag: "volume-100", 606 }}, 607 }) 608 c.Assert(result, gc.FitsTypeOf, ¶ms.VolumeAttachmentParamsResults{}) 609 *(result.(*params.VolumeAttachmentParamsResults)) = params.VolumeAttachmentParamsResults{ 610 Results: paramsResults, 611 } 612 callCount++ 613 return nil 614 }) 615 616 st, err := storageprovisioner.NewState(apiCaller) 617 c.Assert(err, jc.ErrorIsNil) 618 volumeParams, err := st.VolumeAttachmentParams([]params.MachineStorageId{{ 619 MachineTag: "machine-100", AttachmentTag: "volume-100", 620 }}) 621 c.Check(err, jc.ErrorIsNil) 622 c.Check(callCount, gc.Equals, 1) 623 c.Assert(volumeParams, jc.DeepEquals, paramsResults) 624 } 625 626 func (s *provisionerSuite) TestFilesystemAttachmentParams(c *gc.C) { 627 paramsResults := []params.FilesystemAttachmentParamsResult{{ 628 Result: params.FilesystemAttachmentParams{ 629 MachineTag: "machine-100", 630 FilesystemTag: "filesystem-100", 631 InstanceId: "inst-ance", 632 Provider: "loop", 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, "FilesystemAttachmentParams") 643 c.Check(arg, gc.DeepEquals, params.MachineStorageIds{ 644 Ids: []params.MachineStorageId{{ 645 MachineTag: "machine-100", AttachmentTag: "filesystem-100", 646 }}, 647 }) 648 c.Assert(result, gc.FitsTypeOf, ¶ms.FilesystemAttachmentParamsResults{}) 649 *(result.(*params.FilesystemAttachmentParamsResults)) = params.FilesystemAttachmentParamsResults{ 650 Results: paramsResults, 651 } 652 callCount++ 653 return nil 654 }) 655 656 st, err := storageprovisioner.NewState(apiCaller) 657 c.Assert(err, jc.ErrorIsNil) 658 filesystemParams, err := st.FilesystemAttachmentParams([]params.MachineStorageId{{ 659 MachineTag: "machine-100", AttachmentTag: "filesystem-100", 660 }}) 661 c.Check(err, jc.ErrorIsNil) 662 c.Check(callCount, gc.Equals, 1) 663 c.Assert(filesystemParams, jc.DeepEquals, paramsResults) 664 } 665 666 func (s *provisionerSuite) TestSetVolumeInfo(c *gc.C) { 667 var callCount int 668 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 669 c.Check(objType, gc.Equals, "StorageProvisioner") 670 c.Check(version, gc.Equals, 0) 671 c.Check(id, gc.Equals, "") 672 c.Check(request, gc.Equals, "SetVolumeInfo") 673 c.Check(arg, gc.DeepEquals, params.Volumes{ 674 Volumes: []params.Volume{{ 675 VolumeTag: "volume-100", 676 Info: params.VolumeInfo{ 677 VolumeId: "123", 678 HardwareId: "abc", 679 Size: 1024, 680 Persistent: true, 681 }, 682 }}, 683 }) 684 c.Assert(result, gc.FitsTypeOf, ¶ms.ErrorResults{}) 685 *(result.(*params.ErrorResults)) = params.ErrorResults{ 686 Results: []params.ErrorResult{{Error: nil}}, 687 } 688 callCount++ 689 return nil 690 }) 691 692 st, err := storageprovisioner.NewState(apiCaller) 693 c.Assert(err, jc.ErrorIsNil) 694 volumes := []params.Volume{{ 695 VolumeTag: "volume-100", 696 Info: params.VolumeInfo{ 697 VolumeId: "123", HardwareId: "abc", Size: 1024, Persistent: true, 698 }, 699 }} 700 errorResults, err := st.SetVolumeInfo(volumes) 701 c.Check(err, jc.ErrorIsNil) 702 c.Check(callCount, gc.Equals, 1) 703 c.Assert(errorResults, gc.HasLen, 1) 704 c.Assert(errorResults[0].Error, gc.IsNil) 705 } 706 707 func (s *provisionerSuite) TestCreateVolumeAttachmentPlan(c *gc.C) { 708 var callCount int 709 710 attachmentPlan := []params.VolumeAttachmentPlan{ 711 { 712 MachineTag: "machine-100", 713 VolumeTag: "volume-100", 714 PlanInfo: params.VolumeAttachmentPlanInfo{ 715 DeviceType: storage.DeviceTypeISCSI, 716 DeviceAttributes: map[string]string{ 717 "iqn": "bogusIQN", 718 "address": "192.168.1.1", 719 "port": "9999", 720 "chap-user": "example", 721 "chap-secret": "supersecretpassword", 722 }, 723 }, 724 BlockDevice: storage.BlockDevice{ 725 DeviceName: "sda", 726 }, 727 }, 728 } 729 730 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 731 c.Check(objType, gc.Equals, "StorageProvisioner") 732 c.Check(version, gc.Equals, 0) 733 c.Check(id, gc.Equals, "") 734 c.Check(request, gc.Equals, "CreateVolumeAttachmentPlans") 735 c.Check(arg, gc.DeepEquals, params.VolumeAttachmentPlans{ 736 VolumeAttachmentPlans: []params.VolumeAttachmentPlan{ 737 { 738 MachineTag: "machine-100", 739 VolumeTag: "volume-100", 740 PlanInfo: params.VolumeAttachmentPlanInfo{ 741 DeviceType: storage.DeviceTypeISCSI, 742 DeviceAttributes: map[string]string{ 743 "iqn": "bogusIQN", 744 "address": "192.168.1.1", 745 "port": "9999", 746 "chap-user": "example", 747 "chap-secret": "supersecretpassword", 748 }, 749 }, 750 BlockDevice: storage.BlockDevice{ 751 DeviceName: "sda", 752 }, 753 }, 754 }, 755 }) 756 c.Assert(result, gc.FitsTypeOf, ¶ms.ErrorResults{}) 757 *(result.(*params.ErrorResults)) = params.ErrorResults{ 758 Results: []params.ErrorResult{{Error: nil}}, 759 } 760 callCount++ 761 return nil 762 }) 763 764 st, err := storageprovisioner.NewState(apiCaller) 765 c.Assert(err, jc.ErrorIsNil) 766 errorResults, err := st.CreateVolumeAttachmentPlans(attachmentPlan) 767 c.Check(err, jc.ErrorIsNil) 768 c.Check(callCount, gc.Equals, 1) 769 c.Assert(errorResults, gc.HasLen, 1) 770 c.Assert(errorResults[0].Error, gc.IsNil) 771 } 772 773 func (s *provisionerSuite) TestSetVolumeAttachmentPlanBlockInfo(c *gc.C) { 774 var callCount int 775 776 attachmentPlan := []params.VolumeAttachmentPlan{ 777 { 778 MachineTag: "machine-100", 779 VolumeTag: "volume-100", 780 PlanInfo: params.VolumeAttachmentPlanInfo{ 781 DeviceType: storage.DeviceTypeISCSI, 782 DeviceAttributes: map[string]string{ 783 "iqn": "bogusIQN", 784 "address": "192.168.1.1", 785 "port": "9999", 786 "chap-user": "example", 787 "chap-secret": "supersecretpassword", 788 }, 789 }, 790 BlockDevice: storage.BlockDevice{ 791 DeviceName: "sda", 792 }, 793 }, 794 } 795 796 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 797 c.Check(objType, gc.Equals, "StorageProvisioner") 798 c.Check(version, gc.Equals, 0) 799 c.Check(id, gc.Equals, "") 800 c.Check(request, gc.Equals, "SetVolumeAttachmentPlanBlockInfo") 801 c.Check(arg, gc.DeepEquals, params.VolumeAttachmentPlans{ 802 VolumeAttachmentPlans: []params.VolumeAttachmentPlan{ 803 { 804 MachineTag: "machine-100", 805 VolumeTag: "volume-100", 806 PlanInfo: params.VolumeAttachmentPlanInfo{ 807 DeviceType: storage.DeviceTypeISCSI, 808 DeviceAttributes: map[string]string{ 809 "iqn": "bogusIQN", 810 "address": "192.168.1.1", 811 "port": "9999", 812 "chap-user": "example", 813 "chap-secret": "supersecretpassword", 814 }, 815 }, 816 BlockDevice: storage.BlockDevice{ 817 DeviceName: "sda", 818 }, 819 }, 820 }, 821 }) 822 c.Assert(result, gc.FitsTypeOf, ¶ms.ErrorResults{}) 823 *(result.(*params.ErrorResults)) = params.ErrorResults{ 824 Results: []params.ErrorResult{{Error: nil}}, 825 } 826 callCount++ 827 return nil 828 }) 829 830 st, err := storageprovisioner.NewState(apiCaller) 831 c.Assert(err, jc.ErrorIsNil) 832 errorResults, err := st.SetVolumeAttachmentPlanBlockInfo(attachmentPlan) 833 c.Check(err, jc.ErrorIsNil) 834 c.Check(callCount, gc.Equals, 1) 835 c.Assert(errorResults, gc.HasLen, 1) 836 c.Assert(errorResults[0].Error, gc.IsNil) 837 } 838 839 func (s *provisionerSuite) TestRemoveVolumeAttachmentPlan(c *gc.C) { 840 var callCount int 841 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 842 c.Check(objType, gc.Equals, "StorageProvisioner") 843 c.Check(version, gc.Equals, 0) 844 c.Check(id, gc.Equals, "") 845 c.Check(request, gc.Equals, "RemoveVolumeAttachmentPlan") 846 c.Check(arg, gc.DeepEquals, params.MachineStorageIds{ 847 Ids: []params.MachineStorageId{{ 848 MachineTag: "machine-100", AttachmentTag: "volume-100", 849 }}, 850 }) 851 c.Assert(result, gc.FitsTypeOf, ¶ms.ErrorResults{}) 852 *(result.(*params.ErrorResults)) = params.ErrorResults{ 853 Results: []params.ErrorResult{{Error: nil}}, 854 } 855 callCount++ 856 return nil 857 }) 858 859 st, err := storageprovisioner.NewState(apiCaller) 860 c.Assert(err, jc.ErrorIsNil) 861 errorResults, err := st.RemoveVolumeAttachmentPlan([]params.MachineStorageId{{ 862 MachineTag: "machine-100", AttachmentTag: "volume-100", 863 }}) 864 c.Check(err, jc.ErrorIsNil) 865 c.Check(callCount, gc.Equals, 1) 866 c.Assert(errorResults, gc.HasLen, 1) 867 c.Assert(errorResults[0].Error, gc.IsNil) 868 } 869 870 func (s *provisionerSuite) TestSetFilesystemInfo(c *gc.C) { 871 var callCount int 872 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 873 c.Check(objType, gc.Equals, "StorageProvisioner") 874 c.Check(version, gc.Equals, 0) 875 c.Check(id, gc.Equals, "") 876 c.Check(request, gc.Equals, "SetFilesystemInfo") 877 c.Check(arg, gc.DeepEquals, params.Filesystems{ 878 Filesystems: []params.Filesystem{{ 879 FilesystemTag: "filesystem-100", 880 Info: params.FilesystemInfo{ 881 FilesystemId: "123", 882 Size: 1024, 883 }, 884 }}, 885 }) 886 c.Assert(result, gc.FitsTypeOf, ¶ms.ErrorResults{}) 887 *(result.(*params.ErrorResults)) = params.ErrorResults{ 888 Results: []params.ErrorResult{{Error: nil}}, 889 } 890 callCount++ 891 return nil 892 }) 893 894 st, err := storageprovisioner.NewState(apiCaller) 895 c.Assert(err, jc.ErrorIsNil) 896 filesystems := []params.Filesystem{{ 897 FilesystemTag: "filesystem-100", 898 Info: params.FilesystemInfo{ 899 FilesystemId: "123", 900 Size: 1024, 901 }, 902 }} 903 errorResults, err := st.SetFilesystemInfo(filesystems) 904 c.Check(err, jc.ErrorIsNil) 905 c.Check(callCount, gc.Equals, 1) 906 c.Assert(errorResults, gc.HasLen, 1) 907 c.Assert(errorResults[0].Error, gc.IsNil) 908 } 909 910 func (s *provisionerSuite) TestSetVolumeAttachmentInfo(c *gc.C) { 911 volumeAttachments := []params.VolumeAttachment{{ 912 VolumeTag: "volume-100", 913 MachineTag: "machine-200", 914 Info: params.VolumeAttachmentInfo{ 915 DeviceName: "xvdf1", 916 }, 917 }} 918 919 var callCount int 920 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 921 c.Check(objType, gc.Equals, "StorageProvisioner") 922 c.Check(version, gc.Equals, 0) 923 c.Check(id, gc.Equals, "") 924 c.Check(request, gc.Equals, "SetVolumeAttachmentInfo") 925 c.Check(arg, jc.DeepEquals, params.VolumeAttachments{volumeAttachments}) 926 c.Assert(result, gc.FitsTypeOf, ¶ms.ErrorResults{}) 927 *(result.(*params.ErrorResults)) = params.ErrorResults{ 928 Results: []params.ErrorResult{{Error: nil}}, 929 } 930 callCount++ 931 return nil 932 }) 933 934 st, err := storageprovisioner.NewState(apiCaller) 935 c.Assert(err, jc.ErrorIsNil) 936 errorResults, err := st.SetVolumeAttachmentInfo(volumeAttachments) 937 c.Check(err, jc.ErrorIsNil) 938 c.Check(callCount, gc.Equals, 1) 939 c.Assert(errorResults, gc.HasLen, 1) 940 c.Assert(errorResults[0].Error, gc.IsNil) 941 } 942 943 func (s *provisionerSuite) TestSetFilesystemAttachmentInfo(c *gc.C) { 944 filesystemAttachments := []params.FilesystemAttachment{{ 945 FilesystemTag: "filesystem-100", 946 MachineTag: "machine-200", 947 Info: params.FilesystemAttachmentInfo{ 948 MountPoint: "/srv", 949 }, 950 }} 951 952 var callCount int 953 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 954 c.Check(objType, gc.Equals, "StorageProvisioner") 955 c.Check(version, gc.Equals, 0) 956 c.Check(id, gc.Equals, "") 957 c.Check(request, gc.Equals, "SetFilesystemAttachmentInfo") 958 c.Check(arg, jc.DeepEquals, params.FilesystemAttachments{filesystemAttachments}) 959 c.Assert(result, gc.FitsTypeOf, ¶ms.ErrorResults{}) 960 *(result.(*params.ErrorResults)) = params.ErrorResults{ 961 Results: []params.ErrorResult{{Error: nil}}, 962 } 963 callCount++ 964 return nil 965 }) 966 967 st, err := storageprovisioner.NewState(apiCaller) 968 c.Assert(err, jc.ErrorIsNil) 969 errorResults, err := st.SetFilesystemAttachmentInfo(filesystemAttachments) 970 c.Check(err, jc.ErrorIsNil) 971 c.Check(callCount, gc.Equals, 1) 972 c.Assert(errorResults, gc.HasLen, 1) 973 c.Assert(errorResults[0].Error, gc.IsNil) 974 } 975 976 func (s *provisionerSuite) testOpWithTags( 977 c *gc.C, opName string, apiCall func(*storageprovisioner.State, []names.Tag) ([]params.ErrorResult, error), 978 ) { 979 var callCount int 980 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 981 c.Check(objType, gc.Equals, "StorageProvisioner") 982 c.Check(version, gc.Equals, 0) 983 c.Check(id, gc.Equals, "") 984 c.Check(request, gc.Equals, opName) 985 c.Check(arg, gc.DeepEquals, params.Entities{Entities: []params.Entity{{Tag: "volume-100"}}}) 986 c.Assert(result, gc.FitsTypeOf, ¶ms.ErrorResults{}) 987 *(result.(*params.ErrorResults)) = params.ErrorResults{ 988 Results: []params.ErrorResult{{Error: nil}}, 989 } 990 callCount++ 991 return nil 992 }) 993 994 st, err := storageprovisioner.NewState(apiCaller) 995 c.Assert(err, jc.ErrorIsNil) 996 volumes := []names.Tag{names.NewVolumeTag("100")} 997 errorResults, err := apiCall(st, volumes) 998 c.Check(err, jc.ErrorIsNil) 999 c.Check(callCount, gc.Equals, 1) 1000 c.Assert(errorResults, jc.DeepEquals, []params.ErrorResult{{}}) 1001 } 1002 1003 func (s *provisionerSuite) TestRemove(c *gc.C) { 1004 s.testOpWithTags(c, "Remove", func(st *storageprovisioner.State, tags []names.Tag) ([]params.ErrorResult, error) { 1005 return st.Remove(tags) 1006 }) 1007 } 1008 1009 func (s *provisionerSuite) TestEnsureDead(c *gc.C) { 1010 s.testOpWithTags(c, "EnsureDead", func(st *storageprovisioner.State, tags []names.Tag) ([]params.ErrorResult, error) { 1011 return st.EnsureDead(tags) 1012 }) 1013 } 1014 1015 func (s *provisionerSuite) TestLife(c *gc.C) { 1016 var callCount int 1017 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 1018 c.Check(objType, gc.Equals, "StorageProvisioner") 1019 c.Check(version, gc.Equals, 0) 1020 c.Check(id, gc.Equals, "") 1021 c.Check(request, gc.Equals, "Life") 1022 c.Check(arg, gc.DeepEquals, params.Entities{Entities: []params.Entity{{Tag: "volume-100"}}}) 1023 c.Assert(result, gc.FitsTypeOf, ¶ms.LifeResults{}) 1024 *(result.(*params.LifeResults)) = params.LifeResults{ 1025 Results: []params.LifeResult{{Life: life.Alive}}, 1026 } 1027 callCount++ 1028 return nil 1029 }) 1030 1031 st, err := storageprovisioner.NewState(apiCaller) 1032 c.Assert(err, jc.ErrorIsNil) 1033 volumes := []names.Tag{names.NewVolumeTag("100")} 1034 lifeResults, err := st.Life(volumes) 1035 c.Check(err, jc.ErrorIsNil) 1036 c.Check(callCount, gc.Equals, 1) 1037 c.Assert(lifeResults, jc.DeepEquals, []params.LifeResult{{Life: life.Alive}}) 1038 } 1039 1040 func (s *provisionerSuite) testClientError(c *gc.C, apiCall func(*storageprovisioner.State) error) { 1041 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 1042 return errors.New("blargh") 1043 }) 1044 st, err := storageprovisioner.NewState(apiCaller) 1045 c.Assert(err, jc.ErrorIsNil) 1046 err = apiCall(st) 1047 c.Check(err, gc.ErrorMatches, "blargh") 1048 } 1049 1050 func (s *provisionerSuite) TestWatchVolumesClientError(c *gc.C) { 1051 s.testClientError(c, func(st *storageprovisioner.State) error { 1052 _, err := st.WatchVolumes(names.NewMachineTag("123")) 1053 return err 1054 }) 1055 } 1056 1057 func (s *provisionerSuite) TestVolumesClientError(c *gc.C) { 1058 s.testClientError(c, func(st *storageprovisioner.State) error { 1059 _, err := st.Volumes(nil) 1060 return err 1061 }) 1062 } 1063 1064 func (s *provisionerSuite) TestVolumeParamsClientError(c *gc.C) { 1065 s.testClientError(c, func(st *storageprovisioner.State) error { 1066 _, err := st.VolumeParams(nil) 1067 return err 1068 }) 1069 } 1070 1071 func (s *provisionerSuite) TestRemoveVolumeParamsClientError(c *gc.C) { 1072 s.testClientError(c, func(st *storageprovisioner.State) error { 1073 _, err := st.RemoveVolumeParams(nil) 1074 return err 1075 }) 1076 } 1077 1078 func (s *provisionerSuite) TestFilesystemParamsClientError(c *gc.C) { 1079 s.testClientError(c, func(st *storageprovisioner.State) error { 1080 _, err := st.FilesystemParams(nil) 1081 return err 1082 }) 1083 } 1084 1085 func (s *provisionerSuite) TestRemoveFilesystemParamsClientError(c *gc.C) { 1086 s.testClientError(c, func(st *storageprovisioner.State) error { 1087 _, err := st.RemoveFilesystemParams(nil) 1088 return err 1089 }) 1090 } 1091 1092 func (s *provisionerSuite) TestRemoveClientError(c *gc.C) { 1093 s.testClientError(c, func(st *storageprovisioner.State) error { 1094 _, err := st.Remove(nil) 1095 return err 1096 }) 1097 } 1098 1099 func (s *provisionerSuite) TestRemoveAttachmentsClientError(c *gc.C) { 1100 s.testClientError(c, func(st *storageprovisioner.State) error { 1101 _, err := st.RemoveAttachments(nil) 1102 return err 1103 }) 1104 } 1105 1106 func (s *provisionerSuite) TestSetVolumeInfoClientError(c *gc.C) { 1107 s.testClientError(c, func(st *storageprovisioner.State) error { 1108 _, err := st.SetVolumeInfo(nil) 1109 return err 1110 }) 1111 } 1112 1113 func (s *provisionerSuite) TestEnsureDeadClientError(c *gc.C) { 1114 s.testClientError(c, func(st *storageprovisioner.State) error { 1115 _, err := st.EnsureDead(nil) 1116 return err 1117 }) 1118 } 1119 1120 func (s *provisionerSuite) TestLifeClientError(c *gc.C) { 1121 s.testClientError(c, func(st *storageprovisioner.State) error { 1122 _, err := st.Life(nil) 1123 return err 1124 }) 1125 } 1126 1127 func (s *provisionerSuite) TestAttachmentLifeClientError(c *gc.C) { 1128 s.testClientError(c, func(st *storageprovisioner.State) error { 1129 _, err := st.AttachmentLife(nil) 1130 return err 1131 }) 1132 } 1133 1134 func (s *provisionerSuite) TestWatchVolumesServerError(c *gc.C) { 1135 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 1136 *(result.(*params.StringsWatchResults)) = params.StringsWatchResults{ 1137 Results: []params.StringsWatchResult{{ 1138 Error: ¶ms.Error{Message: "MSG", Code: "621"}, 1139 }}, 1140 } 1141 return nil 1142 }) 1143 st, err := storageprovisioner.NewState(apiCaller) 1144 c.Assert(err, jc.ErrorIsNil) 1145 _, err = st.WatchVolumes(names.NewMachineTag("123")) 1146 c.Check(err, gc.ErrorMatches, "MSG") 1147 } 1148 1149 func (s *provisionerSuite) TestVolumesServerError(c *gc.C) { 1150 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 1151 *(result.(*params.VolumeResults)) = params.VolumeResults{ 1152 Results: []params.VolumeResult{{ 1153 Error: ¶ms.Error{Message: "MSG", Code: "621"}, 1154 }}, 1155 } 1156 return nil 1157 }) 1158 st, err := storageprovisioner.NewState(apiCaller) 1159 c.Assert(err, jc.ErrorIsNil) 1160 results, err := st.Volumes([]names.VolumeTag{names.NewVolumeTag("100")}) 1161 c.Assert(err, jc.ErrorIsNil) 1162 c.Assert(results, gc.HasLen, 1) 1163 c.Check(results[0].Error, gc.ErrorMatches, "MSG") 1164 } 1165 1166 func (s *provisionerSuite) TestVolumeParamsServerError(c *gc.C) { 1167 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 1168 *(result.(*params.VolumeParamsResults)) = params.VolumeParamsResults{ 1169 Results: []params.VolumeParamsResult{{ 1170 Error: ¶ms.Error{Message: "MSG", Code: "621"}, 1171 }}, 1172 } 1173 return nil 1174 }) 1175 st, err := storageprovisioner.NewState(apiCaller) 1176 c.Assert(err, jc.ErrorIsNil) 1177 results, err := st.VolumeParams([]names.VolumeTag{names.NewVolumeTag("100")}) 1178 c.Assert(err, jc.ErrorIsNil) 1179 c.Assert(results, gc.HasLen, 1) 1180 c.Check(results[0].Error, gc.ErrorMatches, "MSG") 1181 } 1182 1183 func (s *provisionerSuite) TestRemoveVolumeParamsServerError(c *gc.C) { 1184 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 1185 *(result.(*params.RemoveVolumeParamsResults)) = params.RemoveVolumeParamsResults{ 1186 Results: []params.RemoveVolumeParamsResult{{ 1187 Error: ¶ms.Error{Message: "MSG", Code: "621"}, 1188 }}, 1189 } 1190 return nil 1191 }) 1192 st, err := storageprovisioner.NewState(apiCaller) 1193 c.Assert(err, jc.ErrorIsNil) 1194 results, err := st.RemoveVolumeParams([]names.VolumeTag{names.NewVolumeTag("100")}) 1195 c.Assert(err, jc.ErrorIsNil) 1196 c.Assert(results, gc.HasLen, 1) 1197 c.Check(results[0].Error, gc.ErrorMatches, "MSG") 1198 } 1199 1200 func (s *provisionerSuite) TestFilesystemParamsServerError(c *gc.C) { 1201 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 1202 *(result.(*params.FilesystemParamsResults)) = params.FilesystemParamsResults{ 1203 Results: []params.FilesystemParamsResult{{ 1204 Error: ¶ms.Error{Message: "MSG", Code: "621"}, 1205 }}, 1206 } 1207 return nil 1208 }) 1209 st, err := storageprovisioner.NewState(apiCaller) 1210 c.Assert(err, jc.ErrorIsNil) 1211 results, err := st.FilesystemParams([]names.FilesystemTag{names.NewFilesystemTag("100")}) 1212 c.Assert(err, jc.ErrorIsNil) 1213 c.Assert(results, gc.HasLen, 1) 1214 c.Check(results[0].Error, gc.ErrorMatches, "MSG") 1215 } 1216 1217 func (s *provisionerSuite) TestRemoveFilesystemParamsServerError(c *gc.C) { 1218 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 1219 *(result.(*params.RemoveFilesystemParamsResults)) = params.RemoveFilesystemParamsResults{ 1220 Results: []params.RemoveFilesystemParamsResult{{ 1221 Error: ¶ms.Error{Message: "MSG", Code: "621"}, 1222 }}, 1223 } 1224 return nil 1225 }) 1226 st, err := storageprovisioner.NewState(apiCaller) 1227 c.Assert(err, jc.ErrorIsNil) 1228 results, err := st.RemoveFilesystemParams([]names.FilesystemTag{names.NewFilesystemTag("100")}) 1229 c.Assert(err, jc.ErrorIsNil) 1230 c.Assert(results, gc.HasLen, 1) 1231 c.Check(results[0].Error, gc.ErrorMatches, "MSG") 1232 } 1233 1234 func (s *provisionerSuite) TestSetVolumeInfoServerError(c *gc.C) { 1235 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 1236 *(result.(*params.ErrorResults)) = params.ErrorResults{ 1237 Results: []params.ErrorResult{{ 1238 Error: ¶ms.Error{Message: "MSG", Code: "621"}, 1239 }}, 1240 } 1241 return nil 1242 }) 1243 st, err := storageprovisioner.NewState(apiCaller) 1244 c.Assert(err, jc.ErrorIsNil) 1245 results, err := st.SetVolumeInfo([]params.Volume{{ 1246 VolumeTag: names.NewVolumeTag("100").String(), 1247 }}) 1248 c.Assert(err, jc.ErrorIsNil) 1249 c.Assert(results, gc.HasLen, 1) 1250 c.Check(results[0].Error, gc.ErrorMatches, "MSG") 1251 } 1252 1253 func (s *provisionerSuite) testServerError(c *gc.C, apiCall func(*storageprovisioner.State, []names.Tag) ([]params.ErrorResult, error)) { 1254 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 1255 *(result.(*params.ErrorResults)) = params.ErrorResults{ 1256 Results: []params.ErrorResult{{ 1257 Error: ¶ms.Error{Message: "MSG", Code: "621"}, 1258 }}, 1259 } 1260 return nil 1261 }) 1262 st, err := storageprovisioner.NewState(apiCaller) 1263 c.Assert(err, jc.ErrorIsNil) 1264 tags := []names.Tag{ 1265 names.NewVolumeTag("100"), 1266 } 1267 results, err := apiCall(st, tags) 1268 c.Assert(err, jc.ErrorIsNil) 1269 c.Assert(results, gc.HasLen, 1) 1270 c.Check(results[0].Error, gc.ErrorMatches, "MSG") 1271 } 1272 1273 func (s *provisionerSuite) TestRemoveServerError(c *gc.C) { 1274 s.testServerError(c, func(st *storageprovisioner.State, tags []names.Tag) ([]params.ErrorResult, error) { 1275 return st.Remove(tags) 1276 }) 1277 } 1278 1279 func (s *provisionerSuite) TestEnsureDeadServerError(c *gc.C) { 1280 s.testServerError(c, func(st *storageprovisioner.State, tags []names.Tag) ([]params.ErrorResult, error) { 1281 return st.EnsureDead(tags) 1282 }) 1283 } 1284 1285 func (s *provisionerSuite) TestLifeServerError(c *gc.C) { 1286 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 1287 *(result.(*params.LifeResults)) = params.LifeResults{ 1288 Results: []params.LifeResult{{ 1289 Error: ¶ms.Error{Message: "MSG", Code: "621"}, 1290 }}, 1291 } 1292 return nil 1293 }) 1294 st, err := storageprovisioner.NewState(apiCaller) 1295 c.Assert(err, jc.ErrorIsNil) 1296 tags := []names.Tag{ 1297 names.NewVolumeTag("100"), 1298 } 1299 results, err := st.Life(tags) 1300 c.Assert(err, jc.ErrorIsNil) 1301 c.Assert(results, gc.HasLen, 1) 1302 c.Check(results[0].Error, gc.ErrorMatches, "MSG") 1303 }