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