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