github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/state/status_machine_test.go (about) 1 // Copyright 2012-2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package state_test 5 6 import ( 7 jc "github.com/juju/testing/checkers" 8 gc "gopkg.in/check.v1" 9 10 "github.com/juju/juju/state" 11 "github.com/juju/juju/status" 12 ) 13 14 type MachineStatusSuite struct { 15 ConnSuite 16 machine *state.Machine 17 } 18 19 var _ = gc.Suite(&MachineStatusSuite{}) 20 21 func (s *MachineStatusSuite) SetUpTest(c *gc.C) { 22 s.ConnSuite.SetUpTest(c) 23 s.machine = s.Factory.MakeMachine(c, nil) 24 } 25 26 func (s *MachineStatusSuite) TestInitialStatus(c *gc.C) { 27 s.checkInitialStatus(c) 28 } 29 30 func (s *MachineStatusSuite) checkInitialStatus(c *gc.C) { 31 statusInfo, err := s.machine.Status() 32 c.Check(err, jc.ErrorIsNil) 33 c.Check(statusInfo.Status, gc.Equals, status.StatusPending) 34 c.Check(statusInfo.Message, gc.Equals, "") 35 c.Check(statusInfo.Data, gc.HasLen, 0) 36 c.Check(statusInfo.Since, gc.NotNil) 37 } 38 39 func (s *MachineStatusSuite) TestSetErrorStatusWithoutInfo(c *gc.C) { 40 err := s.machine.SetStatus(status.StatusError, "", nil) 41 c.Check(err, gc.ErrorMatches, `cannot set status "error" without info`) 42 43 s.checkInitialStatus(c) 44 } 45 46 func (s *MachineStatusSuite) TestSetDownStatus(c *gc.C) { 47 err := s.machine.SetStatus(status.StatusDown, "", nil) 48 c.Check(err, gc.ErrorMatches, `cannot set status "down"`) 49 50 s.checkInitialStatus(c) 51 } 52 53 func (s *MachineStatusSuite) TestSetUnknownStatus(c *gc.C) { 54 err := s.machine.SetStatus(status.Status("vliegkat"), "orville", nil) 55 c.Assert(err, gc.ErrorMatches, `cannot set invalid status "vliegkat"`) 56 57 s.checkInitialStatus(c) 58 } 59 60 func (s *MachineStatusSuite) TestSetOverwritesData(c *gc.C) { 61 err := s.machine.SetStatus(status.StatusStarted, "blah", map[string]interface{}{ 62 "pew.pew": "zap", 63 }) 64 c.Check(err, jc.ErrorIsNil) 65 66 s.checkGetSetStatus(c) 67 } 68 69 func (s *MachineStatusSuite) TestGetSetStatusAlive(c *gc.C) { 70 s.checkGetSetStatus(c) 71 } 72 73 func (s *MachineStatusSuite) checkGetSetStatus(c *gc.C) { 74 err := s.machine.SetStatus(status.StatusStarted, "blah", map[string]interface{}{ 75 "$foo.bar.baz": map[string]interface{}{ 76 "pew.pew": "zap", 77 }, 78 }) 79 c.Check(err, jc.ErrorIsNil) 80 81 machine, err := s.State.Machine(s.machine.Id()) 82 c.Assert(err, jc.ErrorIsNil) 83 84 statusInfo, err := machine.Status() 85 c.Check(err, jc.ErrorIsNil) 86 c.Check(statusInfo.Status, gc.Equals, status.StatusStarted) 87 c.Check(statusInfo.Message, gc.Equals, "blah") 88 c.Check(statusInfo.Data, jc.DeepEquals, map[string]interface{}{ 89 "$foo.bar.baz": map[string]interface{}{ 90 "pew.pew": "zap", 91 }, 92 }) 93 c.Check(statusInfo.Since, gc.NotNil) 94 } 95 96 func (s *MachineStatusSuite) TestGetSetStatusDying(c *gc.C) { 97 err := s.machine.Destroy() 98 c.Assert(err, jc.ErrorIsNil) 99 100 s.checkGetSetStatus(c) 101 } 102 103 func (s *MachineStatusSuite) TestGetSetStatusDead(c *gc.C) { 104 err := s.machine.EnsureDead() 105 c.Assert(err, jc.ErrorIsNil) 106 107 // NOTE: it would be more technically correct to reject status updates 108 // while Dead, but it's easier and clearer, not to mention more efficient, 109 // to just depend on status doc existence. 110 s.checkGetSetStatus(c) 111 } 112 113 func (s *MachineStatusSuite) TestGetSetStatusGone(c *gc.C) { 114 err := s.machine.EnsureDead() 115 c.Assert(err, jc.ErrorIsNil) 116 err = s.machine.Remove() 117 c.Assert(err, jc.ErrorIsNil) 118 119 err = s.machine.SetStatus(status.StatusStarted, "not really", nil) 120 c.Check(err, gc.ErrorMatches, `cannot set status: machine not found`) 121 122 statusInfo, err := s.machine.Status() 123 c.Check(err, gc.ErrorMatches, `cannot get status: machine not found`) 124 c.Check(statusInfo, gc.DeepEquals, status.StatusInfo{}) 125 } 126 127 func (s *MachineStatusSuite) TestSetStatusPendingProvisioned(c *gc.C) { 128 err := s.machine.SetStatus(status.StatusPending, "", nil) 129 c.Check(err, gc.ErrorMatches, `cannot set status "pending"`) 130 } 131 132 func (s *MachineStatusSuite) TestSetStatusPendingUnprovisioned(c *gc.C) { 133 machine, err := s.State.AddMachine("quantal", state.JobHostUnits) 134 c.Assert(err, jc.ErrorIsNil) 135 err = machine.SetStatus(status.StatusPending, "", nil) 136 c.Check(err, jc.ErrorIsNil) 137 }