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, &params.StringsWatchResult{})
    34  		*(result.(*params.StringsWatchResult)) = params.StringsWatchResult{
    35  			Error: &params.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, &params.StringsWatchResults{})
    58  		*(result.(*params.StringsWatchResults)) = params.StringsWatchResults{
    59  			Results: []params.StringsWatchResult{{
    60  				Error: &params.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, &params.StringsWatchResults{})
    85  		*(result.(*params.StringsWatchResults)) = params.StringsWatchResults{
    86  			Results: []params.StringsWatchResult{{
    87  				Error: &params.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, &params.MachineStorageIdsWatchResults{})
   112  		*(result.(*params.MachineStorageIdsWatchResults)) = params.MachineStorageIdsWatchResults{
   113  			Results: []params.MachineStorageIdsWatchResult{{
   114  				Error: &params.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, &params.MachineStorageIdsWatchResults{})
   139  		*(result.(*params.MachineStorageIdsWatchResults)) = params.MachineStorageIdsWatchResults{
   140  			Results: []params.MachineStorageIdsWatchResult{{
   141  				Error: &params.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, &params.MachineStorageIdsWatchResults{})
   166  		*(result.(*params.MachineStorageIdsWatchResults)) = params.MachineStorageIdsWatchResults{
   167  			Results: []params.MachineStorageIdsWatchResult{{
   168  				Error: &params.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, &params.NotifyWatchResults{})
   192  		*(result.(*params.NotifyWatchResults)) = params.NotifyWatchResults{
   193  			Results: []params.NotifyWatchResult{{
   194  				Error: &params.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, &params.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, &params.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, &params.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, &params.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, &params.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, &params.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, &params.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, &params.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, &params.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, &params.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, &params.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, &params.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, &params.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, &params.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, &params.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, &params.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, &params.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, &params.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, &params.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, &params.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, &params.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: &params.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: &params.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: &params.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: &params.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: &params.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: &params.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: &params.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: &params.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: &params.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  }