github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/api/storageprovisioner/provisioner_test.go (about)

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