github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/cmd/juju/resource/list_test.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package resource_test 5 6 import ( 7 "time" 8 9 jujucmd "github.com/juju/cmd" 10 "github.com/juju/errors" 11 "github.com/juju/testing" 12 jc "github.com/juju/testing/checkers" 13 gc "gopkg.in/check.v1" 14 charmresource "gopkg.in/juju/charm.v6/resource" 15 "gopkg.in/juju/names.v2" 16 17 resourcecmd "github.com/juju/juju/cmd/juju/resource" 18 "github.com/juju/juju/resource" 19 ) 20 21 var _ = gc.Suite(&ShowApplicationSuite{}) 22 23 type ShowApplicationSuite struct { 24 testing.IsolationSuite 25 26 stubDeps *stubShowApplicationDeps 27 } 28 29 func (s *ShowApplicationSuite) SetUpTest(c *gc.C) { 30 s.IsolationSuite.SetUpTest(c) 31 32 stub := &testing.Stub{} 33 s.stubDeps = &stubShowApplicationDeps{ 34 stub: stub, 35 client: &stubApplicationClient{stub: stub}, 36 } 37 } 38 39 func (*ShowApplicationSuite) TestInitEmpty(c *gc.C) { 40 s := resourcecmd.NewListCommandForTest(resourcecmd.ListDeps{}) 41 42 err := s.Init([]string{}) 43 c.Assert(err, jc.Satisfies, errors.IsBadRequest) 44 } 45 46 func (*ShowApplicationSuite) TestInitGood(c *gc.C) { 47 s := resourcecmd.NewListCommandForTest(resourcecmd.ListDeps{}) 48 err := s.Init([]string{"foo"}) 49 c.Assert(err, jc.ErrorIsNil) 50 c.Assert(resourcecmd.ListCommandTarget(s), gc.Equals, "foo") 51 } 52 53 func (*ShowApplicationSuite) TestInitTooManyArgs(c *gc.C) { 54 s := resourcecmd.NewListCommandForTest(resourcecmd.ListDeps{}) 55 56 err := s.Init([]string{"foo", "bar"}) 57 c.Assert(err, jc.Satisfies, errors.IsBadRequest) 58 } 59 60 func (s *ShowApplicationSuite) TestInfo(c *gc.C) { 61 var command resourcecmd.ListCommand 62 info := command.Info() 63 64 c.Check(info, jc.DeepEquals, &jujucmd.Info{ 65 Name: "resources", 66 Aliases: []string{"list-resources"}, 67 Args: "<application or unit>", 68 Purpose: "Show the resources for an application or unit.", 69 Doc: ` 70 This command shows the resources required by and those in use by an existing 71 application or unit in your model. When run for an application, it will also show any 72 updates available for resources from the charmstore. 73 `, 74 FlagKnownAs: "option", 75 ShowSuperFlags: []string{"show-log", "debug", "logging-config", "verbose", "quiet", "h", "help"}, 76 }) 77 } 78 79 func (s *ShowApplicationSuite) TestRunNoResourcesForApplication(c *gc.C) { 80 data := []resource.ApplicationResources{{}} 81 s.stubDeps.client.ReturnResources = data 82 83 cmd := resourcecmd.NewListCommandForTest(resourcecmd.ListDeps{ 84 NewClient: s.stubDeps.NewClient, 85 }) 86 87 code, stdout, stderr := runCmd(c, cmd, "svc") 88 c.Check(code, gc.Equals, 0) 89 c.Check(stderr, gc.Equals, "No resources to display.\n") 90 c.Check(stdout, gc.Equals, "") 91 s.stubDeps.stub.CheckCall(c, 1, "ListResources", []string{"svc"}) 92 } 93 94 func (s *ShowApplicationSuite) TestRun(c *gc.C) { 95 data := []resource.ApplicationResources{ 96 { 97 Resources: []resource.Resource{ 98 { 99 Resource: charmresource.Resource{ 100 Meta: charmresource.Meta{ 101 Name: "openjdk", 102 Description: "the java runtime", 103 }, 104 Origin: charmresource.OriginStore, 105 Revision: 7, 106 }, 107 }, 108 { 109 Resource: charmresource.Resource{ 110 Meta: charmresource.Meta{ 111 Name: "website", 112 Description: "your website data", 113 }, 114 Origin: charmresource.OriginUpload, 115 }, 116 }, 117 { 118 Resource: charmresource.Resource{ 119 Meta: charmresource.Meta{ 120 Name: "rsc1234", 121 Description: "a big description", 122 }, 123 Origin: charmresource.OriginStore, 124 Revision: 15, 125 }, 126 Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC), 127 }, 128 { 129 Resource: charmresource.Resource{ 130 Meta: charmresource.Meta{ 131 Name: "website2", 132 Description: "awesome data", 133 }, 134 Origin: charmresource.OriginUpload, 135 }, 136 Username: "Bill User", 137 Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC), 138 }, 139 }, 140 CharmStoreResources: []charmresource.Resource{ 141 { 142 // This resource has a higher revision than the corresponding one 143 // above. 144 Meta: charmresource.Meta{ 145 Name: "openjdk", 146 Description: "the java runtime", 147 Type: charmresource.TypeFile, 148 Path: "foobar", 149 }, 150 Revision: 10, 151 Origin: charmresource.OriginStore, 152 }, 153 { 154 // This resource is the same revision as the corresponding one 155 // above. 156 Meta: charmresource.Meta{ 157 Name: "rsc1234", 158 Description: "a big description", 159 Type: charmresource.TypeFile, 160 Path: "foobar", 161 }, 162 Revision: 15, 163 Origin: charmresource.OriginStore, 164 }, 165 { 166 Meta: charmresource.Meta{ 167 Name: "website", 168 Description: "your website data", 169 }, 170 Origin: charmresource.OriginUpload, 171 }, 172 { 173 Meta: charmresource.Meta{ 174 Name: "website2", 175 Description: "awesome data", 176 }, 177 Origin: charmresource.OriginUpload, 178 }, 179 }, 180 }, 181 } 182 s.stubDeps.client.ReturnResources = data 183 184 cmd := resourcecmd.NewListCommandForTest(resourcecmd.ListDeps{ 185 NewClient: s.stubDeps.NewClient, 186 }) 187 188 code, stdout, stderr := runCmd(c, cmd, "svc") 189 c.Check(code, gc.Equals, 0) 190 c.Check(stderr, gc.Equals, "") 191 192 c.Check(stdout, gc.Equals, ` 193 Resource Supplied by Revision 194 openjdk charmstore 7 195 rsc1234 charmstore 15 196 website upload - 197 website2 Bill User 2012-12-12T12:12 198 199 [Updates Available] 200 Resource Revision 201 openjdk 10 202 203 `[1:]) 204 205 s.stubDeps.stub.CheckCall(c, 1, "ListResources", []string{"svc"}) 206 } 207 208 func (s *ShowApplicationSuite) TestRunNoResourcesForUnit(c *gc.C) { 209 data := []resource.ApplicationResources{{}} 210 s.stubDeps.client.ReturnResources = data 211 212 cmd := resourcecmd.NewListCommandForTest(resourcecmd.ListDeps{ 213 NewClient: s.stubDeps.NewClient, 214 }) 215 216 code, stdout, stderr := runCmd(c, cmd, "svc/0") 217 c.Assert(code, gc.Equals, 0) 218 c.Check(stderr, gc.Equals, "No resources to display.\n") 219 c.Check(stdout, gc.Equals, "") 220 s.stubDeps.stub.CheckCall(c, 1, "ListResources", []string{"svc"}) 221 } 222 223 func (s *ShowApplicationSuite) TestRunResourcesForAppButNoResourcesForUnit(c *gc.C) { 224 unitName := "svc/0" 225 226 data := []resource.ApplicationResources{{ 227 Resources: []resource.Resource{ 228 { 229 Resource: charmresource.Resource{ 230 Meta: charmresource.Meta{ 231 Name: "openjdk", 232 Description: "the java runtime", 233 }, 234 Origin: charmresource.OriginStore, 235 Revision: 7, 236 }, 237 }, 238 }, 239 CharmStoreResources: []charmresource.Resource{ 240 { 241 // This resource has a higher revision than the corresponding one 242 // above. 243 Meta: charmresource.Meta{ 244 Name: "openjdk", 245 Description: "the java runtime", 246 Type: charmresource.TypeFile, 247 Path: "foobar", 248 }, 249 Revision: 10, 250 Origin: charmresource.OriginStore, 251 }, 252 }, 253 UnitResources: []resource.UnitResources{ 254 { 255 Tag: names.NewUnitTag(unitName), 256 }, 257 }, 258 }} 259 s.stubDeps.client.ReturnResources = data 260 261 cmd := resourcecmd.NewListCommandForTest(resourcecmd.ListDeps{ 262 NewClient: s.stubDeps.NewClient, 263 }) 264 265 code, stdout, stderr := runCmd(c, cmd, unitName) 266 c.Assert(code, gc.Equals, 0) 267 c.Check(stdout, gc.Equals, ` 268 Resource Revision 269 openjdk - 270 271 `[1:]) 272 c.Check(stderr, gc.Equals, "") 273 s.stubDeps.stub.CheckCall(c, 1, "ListResources", []string{"svc"}) 274 } 275 276 func (s *ShowApplicationSuite) TestRunUnit(c *gc.C) { 277 data := []resource.ApplicationResources{ 278 { 279 Resources: []resource.Resource{ 280 { 281 Resource: charmresource.Resource{ 282 Meta: charmresource.Meta{ 283 Name: "rsc1234", 284 Description: "a big description", 285 }, 286 Origin: charmresource.OriginStore, 287 Revision: 20, 288 }, 289 Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC), 290 ID: "one", 291 }, 292 { 293 Resource: charmresource.Resource{ 294 Meta: charmresource.Meta{ 295 Name: "website2", 296 Description: "awesome data", 297 }, 298 Origin: charmresource.OriginUpload, 299 Size: 15, 300 }, 301 Username: "Bill User", 302 Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC), 303 ID: "two", 304 }, 305 }, 306 UnitResources: []resource.UnitResources{{ 307 Tag: names.NewUnitTag("svc/0"), 308 Resources: []resource.Resource{ 309 { 310 Resource: charmresource.Resource{ 311 Meta: charmresource.Meta{ 312 Name: "rsc1234", 313 Description: "a big description", 314 }, 315 Origin: charmresource.OriginStore, 316 Revision: 15, // Note revision is different to the application resource 317 }, 318 Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC), 319 ID: "one", 320 }, 321 { 322 Resource: charmresource.Resource{ 323 Meta: charmresource.Meta{ 324 Name: "website2", 325 Description: "awesome data", 326 }, 327 Origin: charmresource.OriginUpload, 328 Size: 15, 329 }, 330 Username: "Bill User", 331 ID: "two", 332 Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC), 333 }, 334 }, 335 DownloadProgress: map[string]int64{ 336 "website2": 12, 337 }, 338 }}, 339 }} 340 s.stubDeps.client.ReturnResources = data 341 342 cmd := resourcecmd.NewListCommandForTest(resourcecmd.ListDeps{ 343 NewClient: s.stubDeps.NewClient, 344 }) 345 346 code, stdout, stderr := runCmd(c, cmd, "svc/0") 347 c.Assert(code, gc.Equals, 0) 348 c.Assert(stderr, gc.Equals, "") 349 350 c.Check(stdout, gc.Equals, ` 351 Resource Revision 352 rsc1234 15 353 website2 2012-12-12T12:12 354 355 `[1:]) 356 357 s.stubDeps.stub.CheckCall(c, 1, "ListResources", []string{"svc"}) 358 } 359 360 func (s *ShowApplicationSuite) TestRunDetails(c *gc.C) { 361 data := []resource.ApplicationResources{{ 362 Resources: []resource.Resource{ 363 { 364 Resource: charmresource.Resource{ 365 Meta: charmresource.Meta{ 366 Name: "alpha", 367 Description: "a big comment", 368 }, 369 Origin: charmresource.OriginStore, 370 Revision: 15, 371 Size: 113, 372 }, 373 Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC), 374 }, 375 { 376 Resource: charmresource.Resource{ 377 Meta: charmresource.Meta{ 378 Name: "charlie", 379 Description: "awesome data", 380 }, 381 Origin: charmresource.OriginUpload, 382 Size: 9835617, 383 }, 384 Username: "Bill User", 385 Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC), 386 }, 387 { 388 Resource: charmresource.Resource{ 389 Meta: charmresource.Meta{ 390 Name: "beta", 391 Description: "more data", 392 }, 393 Origin: charmresource.OriginUpload, 394 }, 395 Username: "Bill User", 396 Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC), 397 }, 398 }, 399 CharmStoreResources: []charmresource.Resource{ 400 { 401 Meta: charmresource.Meta{ 402 Name: "alpha", 403 Description: "a big comment", 404 }, 405 Origin: charmresource.OriginStore, 406 Revision: 15, 407 }, 408 { 409 Meta: charmresource.Meta{ 410 Name: "charlie", 411 Description: "awesome data", 412 }, 413 Origin: charmresource.OriginUpload, 414 }, 415 { 416 Meta: charmresource.Meta{ 417 Name: "beta", 418 Description: "more data", 419 }, 420 Origin: charmresource.OriginUpload, 421 }, 422 }, 423 UnitResources: []resource.UnitResources{ 424 { 425 Tag: names.NewUnitTag("svc/10"), 426 Resources: []resource.Resource{ 427 { 428 Resource: charmresource.Resource{ 429 Meta: charmresource.Meta{ 430 Name: "alpha", 431 Description: "a big comment", 432 }, 433 Origin: charmresource.OriginStore, 434 Revision: 10, // note the reivision is different for this unit 435 }, 436 Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC), 437 }, 438 { 439 Resource: charmresource.Resource{ 440 Meta: charmresource.Meta{ 441 Name: "charlie", 442 Description: "awesome data", 443 }, 444 Origin: charmresource.OriginUpload, 445 }, 446 Username: "Bill User", 447 // note the different time 448 Timestamp: time.Date(2011, 11, 11, 11, 11, 11, 0, time.UTC), 449 }, 450 // note we're missing the beta resource for this unit 451 }, 452 DownloadProgress: map[string]int64{ 453 "alpha": 17, 454 "charlie": 899937, 455 }, 456 }, 457 { 458 Tag: names.NewUnitTag("svc/5"), 459 Resources: []resource.Resource{ 460 { 461 Resource: charmresource.Resource{ 462 Meta: charmresource.Meta{ 463 Name: "alpha", 464 Description: "a big comment", 465 }, 466 Origin: charmresource.OriginStore, 467 Revision: 10, // note the reivision is different for this unit 468 }, 469 Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC), 470 }, 471 { 472 Resource: charmresource.Resource{ 473 Meta: charmresource.Meta{ 474 Name: "charlie", 475 Description: "awesome data", 476 }, 477 Origin: charmresource.OriginUpload, 478 }, 479 Username: "Bill User", 480 // note the different time 481 Timestamp: time.Date(2011, 11, 11, 11, 11, 11, 0, time.UTC), 482 }, 483 { 484 Resource: charmresource.Resource{ 485 Meta: charmresource.Meta{ 486 Name: "beta", 487 Description: "more data", 488 }, 489 Origin: charmresource.OriginUpload, 490 }, 491 Username: "Bill User", 492 Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC), 493 }, 494 }, 495 DownloadProgress: map[string]int64{ 496 "charlie": 177331, 497 }, 498 }, 499 }, 500 }} 501 s.stubDeps.client.ReturnResources = data 502 503 cmd := resourcecmd.NewListCommandForTest(resourcecmd.ListDeps{ 504 NewClient: s.stubDeps.NewClient, 505 }) 506 507 code, stdout, stderr := runCmd(c, cmd, "svc", "--details") 508 c.Check(code, gc.Equals, 0) 509 c.Check(stderr, gc.Equals, "") 510 511 c.Check(stdout, gc.Equals, ` 512 Unit Resource Revision Expected 513 svc/5 alpha 10 15 514 svc/5 beta 2012-12-12T12:12 2012-12-12T12:12 515 svc/5 charlie 2011-11-11T11:11 2012-12-12T12:12 (fetching: 2%) 516 svc/10 alpha 10 15 (fetching: 15%) 517 svc/10 beta - 2012-12-12T12:12 518 svc/10 charlie 2011-11-11T11:11 2012-12-12T12:12 (fetching: 9%) 519 520 `[1:]) 521 522 s.stubDeps.stub.CheckCall(c, 1, "ListResources", []string{"svc"}) 523 } 524 525 func (s *ShowApplicationSuite) TestRunUnitDetails(c *gc.C) { 526 data := []resource.ApplicationResources{{ 527 Resources: []resource.Resource{ 528 { 529 Resource: charmresource.Resource{ 530 Meta: charmresource.Meta{ 531 Name: "alpha", 532 Description: "a big comment", 533 }, 534 Origin: charmresource.OriginStore, 535 Revision: 15, 536 Size: 113, 537 }, 538 Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC), 539 }, 540 { 541 Resource: charmresource.Resource{ 542 Meta: charmresource.Meta{ 543 Name: "charlie", 544 Description: "awesome data", 545 }, 546 Origin: charmresource.OriginUpload, 547 Size: 9835617, 548 }, 549 Username: "Bill User", 550 Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC), 551 }, 552 { 553 Resource: charmresource.Resource{ 554 Meta: charmresource.Meta{ 555 Name: "beta", 556 Description: "more data", 557 }, 558 Origin: charmresource.OriginUpload, 559 }, 560 Username: "Bill User", 561 Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC), 562 }, 563 }, 564 UnitResources: []resource.UnitResources{ 565 { 566 Tag: names.NewUnitTag("svc/10"), 567 Resources: []resource.Resource{ 568 { 569 Resource: charmresource.Resource{ 570 Meta: charmresource.Meta{ 571 Name: "alpha", 572 Description: "a big comment", 573 }, 574 Origin: charmresource.OriginStore, 575 Revision: 10, // note the reivision is different for this unit 576 }, 577 Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC), 578 }, 579 { 580 Resource: charmresource.Resource{ 581 Meta: charmresource.Meta{ 582 Name: "charlie", 583 Description: "awesome data", 584 }, 585 Origin: charmresource.OriginUpload, 586 }, 587 Username: "Bill User", 588 // note the different time 589 Timestamp: time.Date(2011, 11, 11, 11, 11, 11, 0, time.UTC), 590 }, 591 // note we're missing the beta resource for this unit 592 }, 593 DownloadProgress: map[string]int64{ 594 "charlie": 17, 595 }, 596 }, 597 { 598 Tag: names.NewUnitTag("svc/5"), 599 Resources: []resource.Resource{ 600 { 601 Resource: charmresource.Resource{ 602 Meta: charmresource.Meta{ 603 Name: "alpha", 604 Description: "a big comment", 605 }, 606 Origin: charmresource.OriginStore, 607 Revision: 10, // note the reivision is different for this unit 608 }, 609 Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC), 610 }, 611 { 612 Resource: charmresource.Resource{ 613 Meta: charmresource.Meta{ 614 Name: "charlie", 615 Description: "awesome data", 616 }, 617 Origin: charmresource.OriginUpload, 618 }, 619 Username: "Bill User", 620 // note the different time 621 Timestamp: time.Date(2011, 11, 11, 11, 11, 11, 0, time.UTC), 622 }, 623 { 624 Resource: charmresource.Resource{ 625 Meta: charmresource.Meta{ 626 Name: "beta", 627 Description: "more data", 628 }, 629 Origin: charmresource.OriginUpload, 630 }, 631 Username: "Bill User", 632 Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC), 633 }, 634 }, 635 }, 636 }, 637 }} 638 s.stubDeps.client.ReturnResources = data 639 640 cmd := resourcecmd.NewListCommandForTest(resourcecmd.ListDeps{ 641 NewClient: s.stubDeps.NewClient, 642 }) 643 644 code, stdout, stderr := runCmd(c, cmd, "svc/10", "--details") 645 c.Assert(code, gc.Equals, 0) 646 c.Assert(stderr, gc.Equals, "") 647 648 c.Check(stdout, gc.Equals, ` 649 Resource Revision Expected 650 alpha 10 15 651 beta - 2012-12-12T12:12 652 charlie 2011-11-11T11:11 2012-12-12T12:12 (fetching: 0%) 653 654 `[1:]) 655 656 s.stubDeps.stub.CheckCall(c, 1, "ListResources", []string{"svc"}) 657 } 658 659 type stubShowApplicationDeps struct { 660 stub *testing.Stub 661 client *stubApplicationClient 662 } 663 664 func (s *stubShowApplicationDeps) NewClient(c *resourcecmd.ListCommand) (resourcecmd.ListClient, error) { 665 s.stub.AddCall("NewClient", c) 666 if err := s.stub.NextErr(); err != nil { 667 return nil, errors.Trace(err) 668 } 669 670 return s.client, nil 671 } 672 673 type stubApplicationClient struct { 674 stub *testing.Stub 675 ReturnResources []resource.ApplicationResources 676 } 677 678 func (s *stubApplicationClient) ListResources(applications []string) ([]resource.ApplicationResources, error) { 679 s.stub.AddCall("ListResources", applications) 680 if err := s.stub.NextErr(); err != nil { 681 return nil, errors.Trace(err) 682 } 683 return s.ReturnResources, nil 684 } 685 686 func (s *stubApplicationClient) Close() error { 687 s.stub.AddCall("Close") 688 if err := s.stub.NextErr(); err != nil { 689 return errors.Trace(err) 690 } 691 692 return nil 693 }