github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/api/imagemetadata/client_test.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package imagemetadata_test
     5  
     6  import (
     7  	"regexp"
     8  
     9  	"github.com/juju/errors"
    10  	jc "github.com/juju/testing/checkers"
    11  	"github.com/juju/utils/series"
    12  	gc "gopkg.in/check.v1"
    13  
    14  	"github.com/juju/juju/api/base/testing"
    15  	"github.com/juju/juju/api/imagemetadata"
    16  	"github.com/juju/juju/apiserver/params"
    17  	coretesting "github.com/juju/juju/testing"
    18  )
    19  
    20  type imagemetadataSuite struct {
    21  	coretesting.BaseSuite
    22  }
    23  
    24  var _ = gc.Suite(&imagemetadataSuite{})
    25  
    26  func (s *imagemetadataSuite) TestList(c *gc.C) {
    27  	// setup data for test
    28  	imageId := "imageid"
    29  	stream := "stream"
    30  	region := "region"
    31  
    32  	// This is used by filters to search function
    33  	testSeries := "trusty"
    34  	version, err := series.SeriesVersion(testSeries)
    35  	c.Assert(err, jc.ErrorIsNil)
    36  
    37  	arch := "arch"
    38  	virtType := "virt-type"
    39  	rootStorageType := "root-storage-type"
    40  	rootStorageSize := uint64(1024)
    41  	source := "source"
    42  
    43  	called := false
    44  	apiCaller := testing.APICallerFunc(
    45  		func(objType string,
    46  			version int,
    47  			id, request string,
    48  			a, result interface{},
    49  		) error {
    50  			called = true
    51  			c.Check(objType, gc.Equals, "ImageMetadata")
    52  			c.Check(id, gc.Equals, "")
    53  			c.Check(request, gc.Equals, "List")
    54  
    55  			args, ok := a.(params.ImageMetadataFilter)
    56  			c.Assert(ok, jc.IsTrue)
    57  
    58  			if results, k := result.(*params.ListCloudImageMetadataResult); k {
    59  				instances := []params.CloudImageMetadata{
    60  					params.CloudImageMetadata{
    61  						ImageId:         imageId,
    62  						Stream:          args.Stream,
    63  						Region:          args.Region,
    64  						Version:         versionFromSeries(args.Series[0]),
    65  						Series:          args.Series[0],
    66  						Arch:            args.Arches[0],
    67  						VirtType:        args.VirtType,
    68  						RootStorageType: args.RootStorageType,
    69  						RootStorageSize: &rootStorageSize,
    70  						Source:          source,
    71  					},
    72  				}
    73  				results.Result = instances
    74  			}
    75  
    76  			return nil
    77  		})
    78  	client := imagemetadata.NewClient(apiCaller)
    79  	found, err := client.List(
    80  		stream, region,
    81  		[]string{testSeries}, []string{arch},
    82  		virtType, rootStorageType,
    83  	)
    84  	c.Check(err, jc.ErrorIsNil)
    85  
    86  	c.Assert(called, jc.IsTrue)
    87  	expected := []params.CloudImageMetadata{
    88  		params.CloudImageMetadata{
    89  			ImageId:         imageId,
    90  			Stream:          stream,
    91  			Region:          region,
    92  			Version:         version,
    93  			Series:          testSeries,
    94  			Arch:            arch,
    95  			VirtType:        virtType,
    96  			RootStorageType: rootStorageType,
    97  			RootStorageSize: &rootStorageSize,
    98  			Source:          source,
    99  		},
   100  	}
   101  	c.Assert(found, jc.DeepEquals, expected)
   102  }
   103  
   104  func (s *imagemetadataSuite) TestListFacadeCallError(c *gc.C) {
   105  	msg := "facade failure"
   106  	called := false
   107  	apiCaller := testing.APICallerFunc(
   108  		func(objType string,
   109  			version int,
   110  			id, request string,
   111  			a, result interface{},
   112  		) error {
   113  			called = true
   114  			c.Check(objType, gc.Equals, "ImageMetadata")
   115  			c.Check(id, gc.Equals, "")
   116  			c.Check(request, gc.Equals, "List")
   117  
   118  			return errors.New(msg)
   119  		})
   120  	client := imagemetadata.NewClient(apiCaller)
   121  	found, err := client.List("", "", nil, nil, "", "")
   122  	c.Assert(errors.Cause(err), gc.ErrorMatches, msg)
   123  	c.Assert(found, gc.HasLen, 0)
   124  	c.Assert(called, jc.IsTrue)
   125  }
   126  
   127  func (s *imagemetadataSuite) TestSave(c *gc.C) {
   128  	m := params.CloudImageMetadata{}
   129  	called := false
   130  
   131  	apiCaller := testing.APICallerFunc(
   132  		func(objType string,
   133  			version int,
   134  			id, request string,
   135  			a, result interface{},
   136  		) error {
   137  			called = true
   138  			c.Check(objType, gc.Equals, "ImageMetadata")
   139  			c.Check(id, gc.Equals, "")
   140  			c.Check(request, gc.Equals, "Save")
   141  
   142  			c.Assert(a, gc.FitsTypeOf, params.MetadataSaveParams{})
   143  			args := a.(params.MetadataSaveParams)
   144  			c.Assert(args.Metadata, gc.HasLen, 1)
   145  			c.Assert(args.Metadata, jc.DeepEquals, []params.CloudImageMetadataList{
   146  				{[]params.CloudImageMetadata{m, m}},
   147  			})
   148  
   149  			c.Assert(result, gc.FitsTypeOf, &params.ErrorResults{})
   150  			*(result.(*params.ErrorResults)) = params.ErrorResults{
   151  				Results: []params.ErrorResult{{}},
   152  			}
   153  
   154  			return nil
   155  		})
   156  
   157  	client := imagemetadata.NewClient(apiCaller)
   158  	err := client.Save([]params.CloudImageMetadata{m, m})
   159  	c.Check(err, jc.ErrorIsNil)
   160  	c.Assert(called, jc.IsTrue)
   161  }
   162  
   163  func (s *imagemetadataSuite) TestSaveFacadeCallError(c *gc.C) {
   164  	m := []params.CloudImageMetadata{{}}
   165  	msg := "facade failure"
   166  	apiCaller := testing.APICallerFunc(
   167  		func(objType string,
   168  			version int,
   169  			id, request string,
   170  			a, result interface{},
   171  		) error {
   172  			c.Check(objType, gc.Equals, "ImageMetadata")
   173  			c.Check(id, gc.Equals, "")
   174  			c.Check(request, gc.Equals, "Save")
   175  			return errors.New(msg)
   176  		})
   177  	client := imagemetadata.NewClient(apiCaller)
   178  	err := client.Save(m)
   179  	c.Assert(errors.Cause(err), gc.ErrorMatches, msg)
   180  }
   181  
   182  func (s *imagemetadataSuite) TestSaveFacadeCallErrorResult(c *gc.C) {
   183  	m := []params.CloudImageMetadata{{}}
   184  	msg := "facade failure"
   185  	apiCaller := testing.APICallerFunc(
   186  		func(objType string,
   187  			version int,
   188  			id, request string,
   189  			a, result interface{},
   190  		) error {
   191  			c.Check(objType, gc.Equals, "ImageMetadata")
   192  			c.Check(id, gc.Equals, "")
   193  			c.Check(request, gc.Equals, "Save")
   194  			*(result.(*params.ErrorResults)) = params.ErrorResults{
   195  				Results: []params.ErrorResult{
   196  					{Error: &params.Error{Message: msg}},
   197  				},
   198  			}
   199  			return nil
   200  		})
   201  	client := imagemetadata.NewClient(apiCaller)
   202  	err := client.Save(m)
   203  	c.Assert(errors.Cause(err), gc.ErrorMatches, msg)
   204  }
   205  
   206  func (s *imagemetadataSuite) TestUpdateFromPublishedImages(c *gc.C) {
   207  	called := false
   208  
   209  	apiCaller := testing.APICallerFunc(
   210  		func(objType string,
   211  			version int,
   212  			id, request string,
   213  			a, result interface{},
   214  		) error {
   215  			called = true
   216  			c.Check(objType, gc.Equals, "ImageMetadata")
   217  			c.Check(id, gc.Equals, "")
   218  			c.Check(request, gc.Equals, "UpdateFromPublishedImages")
   219  			return nil
   220  		})
   221  
   222  	client := imagemetadata.NewClient(apiCaller)
   223  	err := client.UpdateFromPublishedImages()
   224  	c.Check(err, jc.ErrorIsNil)
   225  	c.Assert(called, jc.IsTrue)
   226  }
   227  
   228  func (s *imagemetadataSuite) TestUpdateFromPublishedImagesFacadeCallError(c *gc.C) {
   229  	called := false
   230  	msg := "facade failure"
   231  	apiCaller := testing.APICallerFunc(
   232  		func(objType string,
   233  			version int,
   234  			id, request string,
   235  			a, result interface{},
   236  		) error {
   237  			called = true
   238  			c.Check(objType, gc.Equals, "ImageMetadata")
   239  			c.Check(id, gc.Equals, "")
   240  			c.Check(request, gc.Equals, "UpdateFromPublishedImages")
   241  			return errors.New(msg)
   242  		})
   243  	client := imagemetadata.NewClient(apiCaller)
   244  	err := client.UpdateFromPublishedImages()
   245  	c.Assert(errors.Cause(err), gc.ErrorMatches, msg)
   246  	c.Assert(called, jc.IsTrue)
   247  }
   248  
   249  var versionFromSeries = func(s string) string {
   250  	// For testing purposes only, there will not be an error :D
   251  	v, _ := series.SeriesVersion(s)
   252  	return v
   253  }
   254  
   255  func (s *imagemetadataSuite) TestDelete(c *gc.C) {
   256  	imageId := "tst12345"
   257  	called := false
   258  
   259  	apiCaller := testing.APICallerFunc(
   260  		func(objType string,
   261  			version int,
   262  			id, request string,
   263  			a, result interface{},
   264  		) error {
   265  			called = true
   266  			c.Check(objType, gc.Equals, "ImageMetadata")
   267  			c.Check(id, gc.Equals, "")
   268  			c.Check(request, gc.Equals, "Delete")
   269  
   270  			c.Assert(a, gc.FitsTypeOf, params.MetadataImageIds{})
   271  			c.Assert(a.(params.MetadataImageIds).Ids, gc.DeepEquals, []string{imageId})
   272  
   273  			results := result.(*params.ErrorResults)
   274  			results.Results = []params.ErrorResult{{}}
   275  			return nil
   276  		})
   277  
   278  	client := imagemetadata.NewClient(apiCaller)
   279  	err := client.Delete(imageId)
   280  	c.Check(err, jc.ErrorIsNil)
   281  	c.Assert(called, jc.IsTrue)
   282  }
   283  
   284  func (s *imagemetadataSuite) TestDeleteMultipleResult(c *gc.C) {
   285  	imageId := "tst12345"
   286  	called := false
   287  
   288  	apiCaller := testing.APICallerFunc(
   289  		func(objType string,
   290  			version int,
   291  			id, request string,
   292  			a, result interface{},
   293  		) error {
   294  			called = true
   295  			c.Check(objType, gc.Equals, "ImageMetadata")
   296  			c.Check(id, gc.Equals, "")
   297  			c.Check(request, gc.Equals, "Delete")
   298  
   299  			results := result.(*params.ErrorResults)
   300  			results.Results = []params.ErrorResult{{}, {}}
   301  			return nil
   302  		})
   303  
   304  	client := imagemetadata.NewClient(apiCaller)
   305  	err := client.Delete(imageId)
   306  	c.Assert(err, gc.ErrorMatches, regexp.QuoteMeta(`expected to find one result for image id "tst12345" but found 2`))
   307  	c.Assert(called, jc.IsTrue)
   308  }
   309  
   310  func (s *imagemetadataSuite) TestDeleteFailure(c *gc.C) {
   311  	called := false
   312  	msg := "save failure"
   313  
   314  	apiCaller := testing.APICallerFunc(
   315  		func(objType string,
   316  			version int,
   317  			id, request string,
   318  			a, result interface{},
   319  		) error {
   320  			called = true
   321  			c.Check(objType, gc.Equals, "ImageMetadata")
   322  			c.Check(id, gc.Equals, "")
   323  			c.Check(request, gc.Equals, "Delete")
   324  
   325  			results := result.(*params.ErrorResults)
   326  			results.Results = []params.ErrorResult{
   327  				{&params.Error{Message: msg}},
   328  			}
   329  			return nil
   330  		})
   331  
   332  	client := imagemetadata.NewClient(apiCaller)
   333  	err := client.Delete("tst12345")
   334  	c.Assert(err, gc.ErrorMatches, msg)
   335  	c.Assert(called, jc.IsTrue)
   336  }
   337  
   338  func (s *imagemetadataSuite) TestDeleteFacadeCallError(c *gc.C) {
   339  	called := false
   340  	msg := "facade failure"
   341  	apiCaller := testing.APICallerFunc(
   342  		func(objType string,
   343  			version int,
   344  			id, request string,
   345  			a, result interface{},
   346  		) error {
   347  			called = true
   348  			c.Check(objType, gc.Equals, "ImageMetadata")
   349  			c.Check(id, gc.Equals, "")
   350  			c.Check(request, gc.Equals, "Delete")
   351  			return errors.New(msg)
   352  		})
   353  	client := imagemetadata.NewClient(apiCaller)
   354  	err := client.Delete("tst12345")
   355  	c.Assert(err, gc.ErrorMatches, msg)
   356  	c.Assert(called, jc.IsTrue)
   357  }