LEFT | RIGHT |
1 package state_test | 1 package state_test |
2 | 2 |
3 import ( | 3 import ( |
4 "fmt" | 4 "fmt" |
5 . "launchpad.net/gocheck" | 5 . "launchpad.net/gocheck" |
6 "launchpad.net/juju-core/charm" | 6 "launchpad.net/juju-core/charm" |
7 "launchpad.net/juju-core/state" | 7 "launchpad.net/juju-core/state" |
8 "sort" | 8 "sort" |
9 "time" | 9 "time" |
10 ) | 10 ) |
(...skipping 387 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
398 _, err := s.mysql.Unit("mysql/0") | 398 _, err := s.mysql.Unit("mysql/0") |
399 return err | 399 return err |
400 }) | 400 }) |
401 | 401 |
402 // ...and even, in a very limited way, when the service itself is remove
d. | 402 // ...and even, in a very limited way, when the service itself is remove
d. |
403 removeAllUnits(c, s.mysql) | 403 removeAllUnits(c, s.mysql) |
404 _, err = s.mysql.AllUnits() | 404 _, err = s.mysql.AllUnits() |
405 c.Assert(err, IsNil) | 405 c.Assert(err, IsNil) |
406 } | 406 } |
407 | 407 |
408 func (s *ServiceSuite) TestLifeWithUnits(c *C) { | 408 func (s *ServiceSuite) TestDestroySimple(c *C) { |
| 409 » err := s.mysql.Destroy() |
| 410 » c.Assert(err, IsNil) |
| 411 » c.Assert(s.mysql.Life(), Equals, state.Dying) |
| 412 » err = s.mysql.Refresh() |
| 413 » c.Assert(state.IsNotFound(err), Equals, true) |
| 414 } |
| 415 |
| 416 func (s *ServiceSuite) TestDestroyStillHasUnits(c *C) { |
409 unit, err := s.mysql.AddUnit() | 417 unit, err := s.mysql.AddUnit() |
410 c.Assert(err, IsNil) | 418 c.Assert(err, IsNil) |
411 err = s.mysql.Destroy() | 419 err = s.mysql.Destroy() |
412 c.Assert(err, IsNil) | 420 c.Assert(err, IsNil) |
| 421 c.Assert(s.mysql.Life(), Equals, state.Dying) |
| 422 |
413 err = unit.EnsureDead() | 423 err = unit.EnsureDead() |
414 c.Assert(err, IsNil) | 424 c.Assert(err, IsNil) |
415 err = s.mysql.Refresh() | 425 err = s.mysql.Refresh() |
416 c.Assert(err, IsNil) | 426 c.Assert(err, IsNil) |
| 427 c.Assert(s.mysql.Life(), Equals, state.Dying) |
| 428 |
417 err = unit.Remove() | 429 err = unit.Remove() |
418 c.Assert(err, IsNil) | 430 c.Assert(err, IsNil) |
419 err = s.mysql.Refresh() | 431 err = s.mysql.Refresh() |
420 c.Assert(state.IsNotFound(err), Equals, true) | 432 c.Assert(state.IsNotFound(err), Equals, true) |
421 } | 433 } |
422 | 434 |
423 func (s *ServiceSuite) TestLifeWithRemovableRelations(c *C) { | 435 func (s *ServiceSuite) TestDestroyOnceHadUnits(c *C) { |
| 436 » unit, err := s.mysql.AddUnit() |
| 437 » c.Assert(err, IsNil) |
| 438 » err = unit.EnsureDead() |
| 439 » c.Assert(err, IsNil) |
| 440 » err = unit.Remove() |
| 441 » c.Assert(err, IsNil) |
| 442 |
| 443 » err = s.mysql.Destroy() |
| 444 » c.Assert(err, IsNil) |
| 445 » c.Assert(s.mysql.Life(), Equals, state.Dying) |
| 446 » err = s.mysql.Refresh() |
| 447 » c.Assert(state.IsNotFound(err), Equals, true) |
| 448 } |
| 449 |
| 450 func (s *ServiceSuite) TestDestroyStaleNonZeroUnitCount(c *C) { |
| 451 » unit, err := s.mysql.AddUnit() |
| 452 » c.Assert(err, IsNil) |
| 453 » err = s.mysql.Refresh() |
| 454 » c.Assert(err, IsNil) |
| 455 » err = unit.EnsureDead() |
| 456 » c.Assert(err, IsNil) |
| 457 » err = unit.Remove() |
| 458 » c.Assert(err, IsNil) |
| 459 |
| 460 » err = s.mysql.Destroy() |
| 461 » c.Assert(err, IsNil) |
| 462 » c.Assert(s.mysql.Life(), Equals, state.Dying) |
| 463 » err = s.mysql.Refresh() |
| 464 » c.Assert(state.IsNotFound(err), Equals, true) |
| 465 } |
| 466 |
| 467 func (s *ServiceSuite) TestDestroyStaleZeroUnitCount(c *C) { |
| 468 » unit, err := s.mysql.AddUnit() |
| 469 » c.Assert(err, IsNil) |
| 470 |
| 471 » err = s.mysql.Destroy() |
| 472 » c.Assert(err, IsNil) |
| 473 » c.Assert(s.mysql.Life(), Equals, state.Dying) |
| 474 |
| 475 » err = s.mysql.Refresh() |
| 476 » c.Assert(err, IsNil) |
| 477 » c.Assert(s.mysql.Life(), Equals, state.Dying) |
| 478 |
| 479 » err = unit.EnsureDead() |
| 480 » c.Assert(err, IsNil) |
| 481 » err = s.mysql.Refresh() |
| 482 » c.Assert(err, IsNil) |
| 483 » c.Assert(s.mysql.Life(), Equals, state.Dying) |
| 484 |
| 485 » err = unit.Remove() |
| 486 » c.Assert(err, IsNil) |
| 487 » err = s.mysql.Refresh() |
| 488 » c.Assert(state.IsNotFound(err), Equals, true) |
| 489 } |
| 490 |
| 491 func (s *ServiceSuite) TestDestroyWithRemovableRelation(c *C) { |
424 wordpress, err := s.State.AddService("wordpress", s.AddTestingCharm(c, "
wordpress")) | 492 wordpress, err := s.State.AddService("wordpress", s.AddTestingCharm(c, "
wordpress")) |
425 c.Assert(err, IsNil) | 493 c.Assert(err, IsNil) |
426 eps, err := s.State.InferEndpoints([]string{"wordpress", "mysql"}) | 494 eps, err := s.State.InferEndpoints([]string{"wordpress", "mysql"}) |
427 c.Assert(err, IsNil) | 495 c.Assert(err, IsNil) |
428 rel, err := s.State.AddRelation(eps...) | 496 rel, err := s.State.AddRelation(eps...) |
429 c.Assert(err, IsNil) | 497 c.Assert(err, IsNil) |
430 | 498 |
431 // Destroy a service with no units in relation scope; check service and | 499 // Destroy a service with no units in relation scope; check service and |
432 // unit removed. | 500 // unit removed. |
433 err = wordpress.Destroy() | 501 err = wordpress.Destroy() |
434 c.Assert(err, IsNil) | 502 c.Assert(err, IsNil) |
435 err = wordpress.Refresh() | 503 err = wordpress.Refresh() |
436 c.Assert(state.IsNotFound(err), Equals, true) | 504 c.Assert(state.IsNotFound(err), Equals, true) |
437 err = rel.Refresh() | 505 err = rel.Refresh() |
438 c.Assert(state.IsNotFound(err), Equals, true) | 506 c.Assert(state.IsNotFound(err), Equals, true) |
439 } | 507 } |
440 | 508 |
441 func (s *ServiceSuite) TestDestroyNeverHadUnits(c *C) { | 509 func (s *ServiceSuite) TestDestroyWithReferencedRelation(c *C) { |
442 » err := s.mysql.Destroy() | 510 » s.assertDestroyWithReferencedRelation(c, true) |
443 » c.Assert(err, IsNil) | 511 } |
444 » c.Assert(s.mysql.Life(), Equals, state.Dying) | 512 |
445 » err = s.mysql.Refresh() | 513 func (s *ServiceSuite) TestDestroyWithreferencedRelationStaleCount(c *C) { |
446 » c.Assert(state.IsNotFound(err), Equals, true) | 514 » s.assertDestroyWithReferencedRelation(c, false) |
447 } | 515 } |
448 | 516 |
449 func (s *ServiceSuite) TestDestroyOnceHadUnits(c *C) { | 517 func (s *ServiceSuite) assertDestroyWithReferencedRelation(c *C, refresh bool) { |
450 » unit, err := s.mysql.AddUnit() | 518 » wordpress, err := s.State.AddService("wordpress", s.AddTestingCharm(c, "
wordpress")) |
451 » c.Assert(err, IsNil) | 519 » c.Assert(err, IsNil) |
452 » err = unit.EnsureDead() | 520 » eps, err := s.State.InferEndpoints([]string{"wordpress", "mysql"}) |
453 » c.Assert(err, IsNil) | 521 » c.Assert(err, IsNil) |
454 » err = unit.Remove() | 522 » rel0, err := s.State.AddRelation(eps...) |
455 » c.Assert(err, IsNil) | 523 » c.Assert(err, IsNil) |
456 » err = unit.Refresh() | 524 |
457 » c.Assert(state.IsNotFound(err), Equals, true) | 525 » _, err = s.State.AddService("logging", s.AddTestingCharm(c, "logging")) |
458 | 526 » c.Assert(err, IsNil) |
| 527 » eps, err = s.State.InferEndpoints([]string{"logging", "mysql"}) |
| 528 » c.Assert(err, IsNil) |
| 529 » rel1, err := s.State.AddRelation(eps...) |
| 530 » c.Assert(err, IsNil) |
| 531 |
| 532 » // Add a separate reference to the first relation. |
| 533 » unit, err := wordpress.AddUnit() |
| 534 » c.Assert(err, IsNil) |
| 535 » ru, err := rel0.Unit(unit) |
| 536 » c.Assert(err, IsNil) |
| 537 » err = ru.EnterScope(nil) |
| 538 » c.Assert(err, IsNil) |
| 539 |
| 540 » // Optionally update the service document to get correct relation counts
. |
| 541 » if refresh { |
| 542 » » err = s.mysql.Destroy() |
| 543 » » c.Assert(err, IsNil) |
| 544 » } |
| 545 |
| 546 » // Destroy, and check that the first relation becomes Dying... |
459 err = s.mysql.Destroy() | 547 err = s.mysql.Destroy() |
460 c.Assert(err, IsNil) | 548 c.Assert(err, IsNil) |
461 » c.Assert(s.mysql.Life(), Equals, state.Dying) | 549 » err = rel0.Refresh() |
462 » err = s.mysql.Refresh() | 550 » c.Assert(err, IsNil) |
463 » c.Assert(state.IsNotFound(err), Equals, true) | 551 » c.Assert(rel0.Life(), Equals, state.Dying) |
464 } | 552 |
465 | 553 » // ...while the second is removed directly. |
466 func (s *ServiceSuite) TestLifeWithReferencedRelations(c *C) { | 554 » err = rel1.Refresh() |
467 » wordpress, err := s.State.AddService("wordpress", s.AddTestingCharm(c, "
wordpress")) | 555 » c.Assert(state.IsNotFound(err), Equals, true) |
468 » c.Assert(err, IsNil) | 556 |
469 » eps, err := s.State.InferEndpoints([]string{"wordpress", "mysql"}) | 557 » // Drop the last reference to the first relation; check the relation and |
470 » c.Assert(err, IsNil) | 558 » // the service are are both removed. |
471 » rel, err := s.State.AddRelation(eps...) | |
472 » c.Assert(err, IsNil) | |
473 | |
474 » // Join a unit to the wordpress side to keep the relation alive. | |
475 » unit, err := wordpress.AddUnit() | |
476 » c.Assert(err, IsNil) | |
477 » ru, err := rel.Unit(unit) | |
478 » c.Assert(err, IsNil) | |
479 » err = ru.EnterScope(nil) | |
480 » c.Assert(err, IsNil) | |
481 | |
482 » // Set Dying, and check that the relation also becomes Dying. | |
483 » err = s.mysql.Destroy() | |
484 » c.Assert(err, IsNil) | |
485 » err = rel.Refresh() | |
486 » c.Assert(err, IsNil) | |
487 » c.Assert(rel.Life(), Equals, state.Dying) | |
488 | |
489 » // Check that no new relations can be added. | |
490 » _, err = s.State.AddService("logging", s.AddTestingCharm(c, "logging")) | |
491 » c.Assert(err, IsNil) | |
492 » eps, err = s.State.InferEndpoints([]string{"logging", "mysql"}) | |
493 » c.Assert(err, IsNil) | |
494 » _, err = s.State.AddRelation(eps...) | |
495 » c.Assert(err, ErrorMatches, `cannot add relation "logging:info mysql:juj
u-info": service "mysql" is not alive`) | |
496 | |
497 » // Leave scope on the counterpart side; check the service and relation | |
498 » // are both removed. | |
499 err = ru.LeaveScope() | 559 err = ru.LeaveScope() |
500 c.Assert(err, IsNil) | 560 c.Assert(err, IsNil) |
501 err = s.mysql.Refresh() | 561 err = s.mysql.Refresh() |
502 c.Assert(state.IsNotFound(err), Equals, true) | 562 c.Assert(state.IsNotFound(err), Equals, true) |
503 » err = rel.Refresh() | 563 » err = rel0.Refresh() |
504 c.Assert(state.IsNotFound(err), Equals, true) | 564 c.Assert(state.IsNotFound(err), Equals, true) |
505 } | 565 } |
506 | 566 |
507 func (s *ServiceSuite) TestReadUnitWithChangingState(c *C) { | 567 func (s *ServiceSuite) TestReadUnitWithChangingState(c *C) { |
508 // Check that reading a unit after removing the service | 568 // Check that reading a unit after removing the service |
509 // fails nicely. | 569 // fails nicely. |
510 err := s.mysql.Destroy() | 570 err := s.mysql.Destroy() |
511 c.Assert(err, IsNil) | 571 c.Assert(err, IsNil) |
512 err = s.mysql.Refresh() | 572 err = s.mysql.Refresh() |
513 c.Assert(state.IsNotFound(err), Equals, true) | 573 c.Assert(state.IsNotFound(err), Equals, true) |
(...skipping 579 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1093 c.Fatalf("got unexpected change: %#v", got) | 1153 c.Fatalf("got unexpected change: %#v", got) |
1094 case <-time.After(100 * time.Millisecond): | 1154 case <-time.After(100 * time.Millisecond): |
1095 } | 1155 } |
1096 } | 1156 } |
1097 | 1157 |
1098 func (s *ServiceSuite) TestAnnotatorForService(c *C) { | 1158 func (s *ServiceSuite) TestAnnotatorForService(c *C) { |
1099 testAnnotator(c, func() (annotator, error) { | 1159 testAnnotator(c, func() (annotator, error) { |
1100 return s.State.Service("mysql") | 1160 return s.State.Service("mysql") |
1101 }) | 1161 }) |
1102 } | 1162 } |
LEFT | RIGHT |