github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/api/imagemetadatamanager/client_test.go (about) 1 // Copyright 2017 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package imagemetadatamanager_test 5 6 import ( 7 "regexp" 8 9 "github.com/juju/errors" 10 "github.com/juju/os/series" 11 jc "github.com/juju/testing/checkers" 12 gc "gopkg.in/check.v1" 13 14 "github.com/juju/juju/api/base/testing" 15 "github.com/juju/juju/api/imagemetadatamanager" 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, "ImageMetadataManager") 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 { 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 := imagemetadatamanager.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 { 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, "ImageMetadataManager") 115 c.Check(id, gc.Equals, "") 116 c.Check(request, gc.Equals, "List") 117 118 return errors.New(msg) 119 }) 120 client := imagemetadatamanager.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, "ImageMetadataManager") 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 := imagemetadatamanager.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, "ImageMetadataManager") 173 c.Check(id, gc.Equals, "") 174 c.Check(request, gc.Equals, "Save") 175 return errors.New(msg) 176 }) 177 client := imagemetadatamanager.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, "ImageMetadataManager") 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 := imagemetadatamanager.NewClient(apiCaller) 202 err := client.Save(m) 203 c.Assert(errors.Cause(err), gc.ErrorMatches, msg) 204 } 205 206 var versionFromSeries = func(s string) string { 207 // For testing purposes only, there will not be an error :D 208 v, _ := series.SeriesVersion(s) 209 return v 210 } 211 212 func (s *imagemetadataSuite) TestDelete(c *gc.C) { 213 imageId := "tst12345" 214 called := false 215 216 apiCaller := testing.APICallerFunc( 217 func(objType string, 218 version int, 219 id, request string, 220 a, result interface{}, 221 ) error { 222 called = true 223 c.Check(objType, gc.Equals, "ImageMetadataManager") 224 c.Check(id, gc.Equals, "") 225 c.Check(request, gc.Equals, "Delete") 226 227 c.Assert(a, gc.FitsTypeOf, params.MetadataImageIds{}) 228 c.Assert(a.(params.MetadataImageIds).Ids, gc.DeepEquals, []string{imageId}) 229 230 results := result.(*params.ErrorResults) 231 results.Results = []params.ErrorResult{{}} 232 return nil 233 }) 234 235 client := imagemetadatamanager.NewClient(apiCaller) 236 err := client.Delete(imageId) 237 c.Check(err, jc.ErrorIsNil) 238 c.Assert(called, jc.IsTrue) 239 } 240 241 func (s *imagemetadataSuite) TestDeleteMultipleResult(c *gc.C) { 242 imageId := "tst12345" 243 called := false 244 245 apiCaller := testing.APICallerFunc( 246 func(objType string, 247 version int, 248 id, request string, 249 a, result interface{}, 250 ) error { 251 called = true 252 c.Check(objType, gc.Equals, "ImageMetadataManager") 253 c.Check(id, gc.Equals, "") 254 c.Check(request, gc.Equals, "Delete") 255 256 results := result.(*params.ErrorResults) 257 results.Results = []params.ErrorResult{{}, {}} 258 return nil 259 }) 260 261 client := imagemetadatamanager.NewClient(apiCaller) 262 err := client.Delete(imageId) 263 c.Assert(err, gc.ErrorMatches, regexp.QuoteMeta(`expected to find one result for image id "tst12345" but found 2`)) 264 c.Assert(called, jc.IsTrue) 265 } 266 267 func (s *imagemetadataSuite) TestDeleteFailure(c *gc.C) { 268 called := false 269 msg := "save failure" 270 271 apiCaller := testing.APICallerFunc( 272 func(objType string, 273 version int, 274 id, request string, 275 a, result interface{}, 276 ) error { 277 called = true 278 c.Check(objType, gc.Equals, "ImageMetadataManager") 279 c.Check(id, gc.Equals, "") 280 c.Check(request, gc.Equals, "Delete") 281 282 results := result.(*params.ErrorResults) 283 results.Results = []params.ErrorResult{ 284 {¶ms.Error{Message: msg}}, 285 } 286 return nil 287 }) 288 289 client := imagemetadatamanager.NewClient(apiCaller) 290 err := client.Delete("tst12345") 291 c.Assert(err, gc.ErrorMatches, msg) 292 c.Assert(called, jc.IsTrue) 293 } 294 295 func (s *imagemetadataSuite) TestDeleteFacadeCallError(c *gc.C) { 296 called := false 297 msg := "facade failure" 298 apiCaller := testing.APICallerFunc( 299 func(objType string, 300 version int, 301 id, request string, 302 a, result interface{}, 303 ) error { 304 called = true 305 c.Check(objType, gc.Equals, "ImageMetadataManager") 306 c.Check(id, gc.Equals, "") 307 c.Check(request, gc.Equals, "Delete") 308 return errors.New(msg) 309 }) 310 client := imagemetadatamanager.NewClient(apiCaller) 311 err := client.Delete("tst12345") 312 c.Assert(err, gc.ErrorMatches, msg) 313 c.Assert(called, jc.IsTrue) 314 }