github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/api/storageprovisioner/provisioner_test.go (about)

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