Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code | Sign in
(248)

Delta Between Two Patch Sets: state/service_test.go

Issue 7425044: uniter, state: handle upgrades better (Closed)
Left Patch Set: uniter, state: handle upgrades better Created 12 years ago
Right Patch Set: uniter, state: handle upgrades better Created 12 years ago
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments. Please Sign in to add in-line comments.
Jump to:
Left: Side by side diff | Download
Right: Side by side diff | Download
« no previous file with change/comment | « [revision details] ('k') | state/unit.go » ('j') | no next file with change/comment »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
LEFTRIGHT
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
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
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 }
LEFTRIGHT

Powered by Google App Engine
RSS Feeds Recent Issues | This issue
This is Rietveld f62528b