github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/cmd/plugins/juju-metadata/listimages_test.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package main 5 6 import ( 7 "fmt" 8 "strings" 9 10 "github.com/juju/cmd" 11 "github.com/juju/cmd/cmdtesting" 12 "github.com/juju/errors" 13 jc "github.com/juju/testing/checkers" 14 gc "gopkg.in/check.v1" 15 16 "github.com/juju/juju/apiserver/params" 17 "github.com/juju/juju/cmd/modelcmd" 18 "github.com/juju/juju/core/model" 19 "github.com/juju/juju/jujuclient" 20 "github.com/juju/juju/jujuclient/jujuclienttesting" 21 "github.com/juju/juju/testing" 22 ) 23 24 type BaseCloudImageMetadataSuite struct { 25 testing.FakeJujuXDGDataHomeSuite 26 store *jujuclient.MemStore 27 } 28 29 func (s *BaseCloudImageMetadataSuite) SetUpTest(c *gc.C) { 30 s.setupBaseSuite(c) 31 } 32 33 func (s *BaseCloudImageMetadataSuite) setupBaseSuite(c *gc.C) { 34 s.FakeJujuXDGDataHomeSuite.SetUpTest(c) 35 36 s.store = jujuclient.NewMemStore() 37 s.store.CurrentControllerName = "testing" 38 s.store.Controllers["testing"] = jujuclient.ControllerDetails{} 39 s.store.Models["testing"] = &jujuclient.ControllerModels{ 40 Models: map[string]jujuclient.ModelDetails{ 41 "admin/controller": { 42 ModelType: model.IAAS, 43 }, 44 }, 45 CurrentModel: "admin/controller", 46 } 47 s.store.Accounts["testing"] = jujuclient.AccountDetails{ 48 User: "admin", 49 } 50 } 51 52 type ListSuite struct { 53 BaseCloudImageMetadataSuite 54 mockAPI *mockListAPI 55 } 56 57 var _ = gc.Suite(&ListSuite{}) 58 59 func (s *ListSuite) SetUpTest(c *gc.C) { 60 s.BaseCloudImageMetadataSuite.SetUpTest(c) 61 62 s.mockAPI = &mockListAPI{} 63 s.mockAPI.list = func(stream, region string, ser, arch []string, virtType, rootStorageType string) ([]params.CloudImageMetadata, error) { 64 return testData, nil 65 } 66 s.PatchValue(&getImageMetadataListAPI, func(c *listImagesCommand) (MetadataListAPI, error) { 67 return s.mockAPI, nil 68 }) 69 } 70 71 func runList(c *gc.C, args []string) (*cmd.Context, error) { 72 cmd := &listImagesCommand{} 73 cmd.SetClientStore(jujuclienttesting.MinimalStore()) 74 return cmdtesting.RunCommand(c, modelcmd.Wrap(cmd), args...) 75 } 76 77 func (s *ListSuite) TestListDefault(c *gc.C) { 78 // Default format is tabular 79 s.assertValidList(c, ` 80 Source Series Arch Region Image id Stream Virt Type Storage Type 81 custom vivid amd64 asia im-21 released kvm ebs 82 custom vivid amd64 europe im-21 released kvm ebs 83 custom vivid amd64 us im-21 released kvm ebs 84 custom trusty amd64 europe im-21 released kvm ebs 85 custom trusty i386 asia im-21 released kvm ebs 86 custom trusty i386 europe im-21 released kvm ebs 87 public vivid amd64 europe im-21 released kvm ebs 88 public trusty i386 europe im-21 released kvm ebs 89 public trusty i386 europe im-42 devel kvm ebs 90 public trusty i386 europe im-42 devel ebs 91 public trusty i386 europe im-42 devel kvm 92 public trusty i386 europe im-42 devel 93 94 `[1:], "") 95 } 96 97 func (s *ListSuite) TestListYAML(c *gc.C) { 98 s.assertValidList(c, ` 99 custom: 100 trusty: 101 amd64: 102 europe: 103 - image-id: im-21 104 stream: released 105 virt-type: kvm 106 storage-type: ebs 107 i386: 108 asia: 109 - image-id: im-21 110 stream: released 111 virt-type: kvm 112 storage-type: ebs 113 europe: 114 - image-id: im-21 115 stream: released 116 virt-type: kvm 117 storage-type: ebs 118 vivid: 119 amd64: 120 asia: 121 - image-id: im-21 122 stream: released 123 virt-type: kvm 124 storage-type: ebs 125 europe: 126 - image-id: im-21 127 stream: released 128 virt-type: kvm 129 storage-type: ebs 130 us: 131 - image-id: im-21 132 stream: released 133 virt-type: kvm 134 storage-type: ebs 135 public: 136 trusty: 137 i386: 138 europe: 139 - image-id: im-21 140 stream: released 141 virt-type: kvm 142 storage-type: ebs 143 - image-id: im-42 144 stream: devel 145 virt-type: kvm 146 storage-type: ebs 147 - image-id: im-42 148 stream: devel 149 storage-type: ebs 150 - image-id: im-42 151 stream: devel 152 virt-type: kvm 153 - image-id: im-42 154 stream: devel 155 vivid: 156 amd64: 157 europe: 158 - image-id: im-21 159 stream: released 160 virt-type: kvm 161 storage-type: ebs 162 `[1:], "", "--format", "yaml") 163 } 164 165 func (s *ListSuite) TestListMetadataFailed(c *gc.C) { 166 msg := "failed" 167 s.mockAPI.list = func(stream, region string, ser, arch []string, virtType, rootStorageType string) ([]params.CloudImageMetadata, error) { 168 return nil, errors.New(msg) 169 } 170 171 _, err := runList(c, nil) 172 c.Assert(err, gc.ErrorMatches, fmt.Sprintf(".*%v.*", msg)) 173 } 174 175 func (s *ListSuite) TestListMetadataFilterStream(c *gc.C) { 176 msg := "stream" 177 s.mockAPI.list = func(stream, region string, ser, arch []string, virtType, rootStorageType string) ([]params.CloudImageMetadata, error) { 178 c.Assert(stream, gc.DeepEquals, msg) 179 return nil, nil 180 } 181 s.assertValidList(c, "", "", "--stream", msg) 182 } 183 184 func (s *ListSuite) TestListMetadataFilterRegion(c *gc.C) { 185 msg := "region" 186 s.mockAPI.list = func(stream, region string, ser, arch []string, virtType, rootStorageType string) ([]params.CloudImageMetadata, error) { 187 c.Assert(region, gc.DeepEquals, msg) 188 return nil, nil 189 } 190 s.assertValidList(c, "", "", "--region", msg) 191 } 192 193 func (s *ListSuite) TestListMetadataFilterSeries(c *gc.C) { 194 all := []string{"series1", "series2"} 195 msg := strings.Join(all, ",") 196 s.mockAPI.list = func(stream, region string, ser, arch []string, virtType, rootStorageType string) ([]params.CloudImageMetadata, error) { 197 c.Assert(ser, gc.DeepEquals, all) 198 return nil, nil 199 } 200 s.assertValidList(c, "", "", "--series", msg) 201 } 202 203 func (s *ListSuite) TestListMetadataFilterArches(c *gc.C) { 204 all := []string{"arch1", "barch2"} 205 msg := strings.Join(all, ",") 206 s.mockAPI.list = func(stream, region string, ser, arch []string, virtType, rootStorageType string) ([]params.CloudImageMetadata, error) { 207 c.Assert(arch, gc.DeepEquals, all) 208 return nil, nil 209 } 210 s.assertValidList(c, "", "", "--arch", msg) 211 } 212 213 func (s *ListSuite) TestListMetadataFilterVirtType(c *gc.C) { 214 msg := "virtType" 215 s.mockAPI.list = func(stream, region string, ser, arch []string, virtType, rootStorageType string) ([]params.CloudImageMetadata, error) { 216 c.Assert(virtType, gc.DeepEquals, msg) 217 return nil, nil 218 } 219 s.assertValidList(c, "", "", "--virt-type", msg) 220 } 221 222 func (s *ListSuite) TestListMetadataFilterStorageType(c *gc.C) { 223 msg := "storagetype" 224 s.mockAPI.list = func(stream, region string, ser, arch []string, virtType, rootStorageType string) ([]params.CloudImageMetadata, error) { 225 c.Assert(rootStorageType, gc.DeepEquals, msg) 226 return nil, nil 227 } 228 s.assertValidList(c, "", "", "--storage-type", msg) 229 } 230 231 func (s *ListSuite) TestListMetadataNoFilter(c *gc.C) { 232 s.mockAPI.list = func(stream, region string, ser, arch []string, virtType, rootStorageType string) ([]params.CloudImageMetadata, error) { 233 c.Assert(rootStorageType, gc.DeepEquals, "") 234 c.Assert(virtType, gc.DeepEquals, "") 235 c.Assert(region, gc.DeepEquals, "") 236 c.Assert(stream, gc.DeepEquals, "") 237 c.Assert(ser, gc.IsNil) 238 c.Assert(arch, gc.IsNil) 239 return nil, nil 240 } 241 s.assertValidList(c, "", "") 242 } 243 244 func (s *ListSuite) TestListMetadataFewFilters(c *gc.C) { 245 streamValue := "streamValue" 246 regionValue := "regionValue" 247 typeValue := "typeValue" 248 s.mockAPI.list = func(stream, region string, ser, arch []string, virtType, rootStorageType string) ([]params.CloudImageMetadata, error) { 249 c.Assert(stream, gc.DeepEquals, streamValue) 250 c.Assert(region, gc.DeepEquals, regionValue) 251 c.Assert(virtType, gc.DeepEquals, typeValue) 252 return nil, nil 253 } 254 s.assertValidList(c, "", "", "--stream", streamValue, "--region", regionValue, "--virt-type", typeValue) 255 } 256 257 func (s *ListSuite) assertValidList(c *gc.C, expectedValid, expectedErr string, args ...string) { 258 context, err := runList(c, args) 259 c.Assert(err, jc.ErrorIsNil) 260 261 obtainedErr := cmdtesting.Stderr(context) 262 c.Assert(obtainedErr, gc.Matches, expectedErr) 263 264 obtainedValid := cmdtesting.Stdout(context) 265 c.Assert(obtainedValid, gc.Matches, expectedValid) 266 } 267 268 type mockListAPI struct { 269 list func(stream, region string, ser, arch []string, virtType, rootStorageType string) ([]params.CloudImageMetadata, error) 270 } 271 272 func (s mockListAPI) Close() error { 273 return nil 274 } 275 276 func (s mockListAPI) List(stream, region string, ser, arch []string, virtType, rootStorageType string) ([]params.CloudImageMetadata, error) { 277 return s.list(stream, region, ser, arch, virtType, rootStorageType) 278 } 279 280 var testData = []params.CloudImageMetadata{ 281 { 282 Source: "custom", 283 Series: "vivid", 284 Arch: "amd64", 285 Region: "asia", 286 ImageId: "im-21", 287 Stream: "released", 288 VirtType: "kvm", 289 RootStorageType: "ebs", 290 }, 291 { 292 Source: "custom", 293 Series: "vivid", 294 Arch: "amd64", 295 Region: "us", 296 ImageId: "im-21", 297 Stream: "released", 298 VirtType: "kvm", 299 RootStorageType: "ebs", 300 }, 301 { 302 Source: "custom", 303 Series: "vivid", 304 Arch: "amd64", 305 Region: "europe", 306 ImageId: "im-21", 307 Stream: "released", 308 VirtType: "kvm", 309 RootStorageType: "ebs", 310 }, 311 { 312 Source: "public", 313 Series: "vivid", 314 Arch: "amd64", 315 Region: "europe", 316 ImageId: "im-21", 317 Stream: "released", 318 VirtType: "kvm", 319 RootStorageType: "ebs", 320 }, 321 { 322 Source: "custom", 323 Series: "trusty", 324 Arch: "amd64", 325 Region: "europe", 326 ImageId: "im-21", 327 Stream: "released", 328 VirtType: "kvm", 329 RootStorageType: "ebs", 330 }, 331 { 332 Source: "custom", 333 Series: "trusty", 334 Arch: "i386", 335 Region: "europe", 336 ImageId: "im-21", 337 Stream: "released", 338 VirtType: "kvm", 339 RootStorageType: "ebs", 340 }, 341 { 342 Source: "custom", 343 Series: "trusty", 344 Arch: "i386", 345 Region: "asia", 346 ImageId: "im-21", 347 Stream: "released", 348 VirtType: "kvm", 349 RootStorageType: "ebs", 350 }, 351 { 352 Source: "public", 353 Series: "trusty", 354 Arch: "i386", 355 Region: "europe", 356 ImageId: "im-21", 357 Stream: "released", 358 VirtType: "kvm", 359 RootStorageType: "ebs", 360 }, 361 { 362 Source: "public", 363 Series: "trusty", 364 Arch: "i386", 365 Region: "europe", 366 ImageId: "im-42", 367 Stream: "devel", 368 VirtType: "kvm", 369 RootStorageType: "ebs", 370 }, 371 { 372 Source: "public", 373 Series: "trusty", 374 Arch: "i386", 375 Region: "europe", 376 ImageId: "im-42", 377 Stream: "devel", 378 RootStorageType: "ebs", 379 }, 380 { 381 Source: "public", 382 Series: "trusty", 383 Arch: "i386", 384 Region: "europe", 385 ImageId: "im-42", 386 Stream: "devel", 387 VirtType: "kvm", 388 }, 389 { 390 Source: "public", 391 Series: "trusty", 392 Arch: "i386", 393 Region: "europe", 394 ImageId: "im-42", 395 Stream: "devel", 396 }, 397 }