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, ¶ms.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: ¶ms.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 {¶ms.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 }