github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/state/status_model_test.go (about) 1 // Copyright 2012-2016 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/core/status" 11 "github.com/juju/juju/state" 12 "github.com/juju/juju/testing" 13 "github.com/juju/juju/testing/factory" 14 ) 15 16 type ModelStatusSuite struct { 17 ConnSuite 18 st *state.State 19 model *state.Model 20 factory *factory.Factory 21 } 22 23 var _ = gc.Suite(&ModelStatusSuite{}) 24 25 func (s *ModelStatusSuite) SetUpTest(c *gc.C) { 26 s.ConnSuite.SetUpTest(c) 27 s.st = s.Factory.MakeModel(c, nil) 28 m, err := s.st.Model() 29 c.Assert(err, jc.ErrorIsNil) 30 s.model = m 31 s.factory = factory.NewFactory(s.st, s.StatePool) 32 } 33 34 func (s *ModelStatusSuite) TearDownTest(c *gc.C) { 35 if s.st != nil { 36 err := s.st.Close() 37 c.Assert(err, jc.ErrorIsNil) 38 s.st = nil 39 } 40 s.ConnSuite.TearDownTest(c) 41 } 42 43 func (s *ModelStatusSuite) TestInitialStatus(c *gc.C) { 44 s.checkInitialStatus(c) 45 } 46 47 func (s *ModelStatusSuite) checkInitialStatus(c *gc.C) { 48 statusInfo, err := s.model.Status() 49 c.Check(err, jc.ErrorIsNil) 50 c.Check(statusInfo.Status, gc.Equals, status.Available) 51 c.Check(statusInfo.Message, gc.Equals, "") 52 c.Check(statusInfo.Data, gc.HasLen, 0) 53 c.Check(statusInfo.Since, gc.NotNil) 54 } 55 56 func (s *ModelStatusSuite) TestSetUnknownStatus(c *gc.C) { 57 now := testing.ZeroTime() 58 sInfo := status.StatusInfo{ 59 Status: status.Status("vliegkat"), 60 Message: "orville", 61 Since: &now, 62 } 63 err := s.model.SetStatus(sInfo) 64 c.Assert(err, gc.ErrorMatches, `cannot set invalid status "vliegkat"`) 65 66 s.checkInitialStatus(c) 67 } 68 69 func (s *ModelStatusSuite) TestSetOverwritesData(c *gc.C) { 70 now := testing.ZeroTime() 71 sInfo := status.StatusInfo{ 72 Status: status.Available, 73 Message: "blah", 74 Data: map[string]interface{}{ 75 "pew.pew": "zap", 76 }, 77 Since: &now, 78 } 79 err := s.model.SetStatus(sInfo) 80 c.Check(err, jc.ErrorIsNil) 81 82 s.checkGetSetStatus(c) 83 } 84 85 func (s *ModelStatusSuite) TestGetSetStatusDying(c *gc.C) { 86 // Add a machine to the model to ensure it is non-empty 87 // when we destroy; this prevents the model from advancing 88 // directly to Dead. 89 s.factory.MakeMachine(c, nil) 90 91 err := s.model.Destroy(state.DestroyModelParams{}) 92 c.Assert(err, jc.ErrorIsNil) 93 94 s.checkGetSetStatus(c) 95 } 96 97 func (s *ModelStatusSuite) TestGetSetStatusDead(c *gc.C) { 98 err := s.model.Destroy(state.DestroyModelParams{}) 99 c.Assert(err, jc.ErrorIsNil) 100 101 // NOTE: it would be more technically correct to reject status updates 102 // while Dead, but it's easier and clearer, not to mention more efficient, 103 // to just depend on status doc existence. 104 s.checkGetSetStatus(c) 105 } 106 107 func (s *ModelStatusSuite) TestGetSetStatusGone(c *gc.C) { 108 err := s.model.Destroy(state.DestroyModelParams{}) 109 c.Assert(err, jc.ErrorIsNil) 110 err = s.st.RemoveDyingModel() 111 c.Assert(err, jc.ErrorIsNil) 112 113 now := testing.ZeroTime() 114 sInfo := status.StatusInfo{ 115 Status: status.Available, 116 Message: "not really", 117 Since: &now, 118 } 119 err = s.model.SetStatus(sInfo) 120 c.Check(err, gc.ErrorMatches, `cannot set status: model not found`) 121 122 _, err = s.model.Status() 123 c.Check(err, gc.ErrorMatches, `cannot get status: model not found`) 124 } 125 126 func (s *ModelStatusSuite) checkGetSetStatus(c *gc.C) { 127 now := testing.ZeroTime() 128 sInfo := status.StatusInfo{ 129 Status: status.Available, 130 Message: "blah", 131 Data: map[string]interface{}{ 132 "$foo.bar.baz": map[string]interface{}{ 133 "pew.pew": "zap", 134 }}, 135 Since: &now, 136 } 137 err := s.model.SetStatus(sInfo) 138 c.Check(err, jc.ErrorIsNil) 139 140 // Get another instance of the Model to compare against 141 model, err := s.st.Model() 142 c.Assert(err, jc.ErrorIsNil) 143 144 statusInfo, err := model.Status() 145 c.Check(err, jc.ErrorIsNil) 146 c.Check(statusInfo.Status, gc.Equals, status.Available) 147 c.Check(statusInfo.Message, gc.Equals, "blah") 148 c.Check(statusInfo.Data, jc.DeepEquals, map[string]interface{}{ 149 "$foo.bar.baz": map[string]interface{}{ 150 "pew.pew": "zap", 151 }, 152 }) 153 c.Check(statusInfo.Since, gc.NotNil) 154 } 155 156 func (s *ModelStatusSuite) TestModelStatusForModel(c *gc.C) { 157 ms, err := s.model.LoadModelStatus() 158 c.Assert(err, jc.ErrorIsNil) 159 160 info, err := ms.Model() 161 c.Assert(err, jc.ErrorIsNil) 162 163 mInfo, err := s.model.Status() 164 c.Assert(err, jc.ErrorIsNil) 165 c.Assert(info, jc.DeepEquals, mInfo) 166 } 167 168 func (s *ModelStatusSuite) TestMachineStatus(c *gc.C) { 169 machine := s.factory.MakeMachine(c, nil) 170 171 ms, err := s.model.LoadModelStatus() 172 c.Assert(err, jc.ErrorIsNil) 173 174 msAgent, err := ms.MachineAgent(machine.Id()) 175 c.Assert(err, jc.ErrorIsNil) 176 msInstance, err := ms.MachineInstance(machine.Id()) 177 c.Assert(err, jc.ErrorIsNil) 178 179 mAgent, err := machine.Status() 180 c.Assert(err, jc.ErrorIsNil) 181 mInstance, err := machine.InstanceStatus() 182 c.Assert(err, jc.ErrorIsNil) 183 184 c.Assert(msAgent, jc.DeepEquals, mAgent) 185 c.Assert(msInstance, jc.DeepEquals, mInstance) 186 } 187 188 func (s *ModelStatusSuite) TestUnitStatus(c *gc.C) { 189 unit := s.factory.MakeUnit(c, nil) 190 191 c.Assert(unit.SetWorkloadVersion("42.1"), jc.ErrorIsNil) 192 c.Assert(unit.SetStatus(status.StatusInfo{Status: status.Active}), jc.ErrorIsNil) 193 c.Assert(unit.SetAgentStatus(status.StatusInfo{Status: status.Idle}), jc.ErrorIsNil) 194 195 ms, err := s.model.LoadModelStatus() 196 c.Assert(err, jc.ErrorIsNil) 197 198 msAgent, err := ms.UnitAgent(unit.Name()) 199 c.Assert(err, jc.ErrorIsNil) 200 msWorkload, err := ms.UnitWorkload(unit.Name(), true) 201 c.Assert(err, jc.ErrorIsNil) 202 msWorkloadVersion, err := ms.UnitWorkloadVersion(unit.Name()) 203 c.Assert(err, jc.ErrorIsNil) 204 205 uAgent, err := unit.AgentStatus() 206 c.Assert(err, jc.ErrorIsNil) 207 uWorkload, err := unit.Status() 208 c.Assert(err, jc.ErrorIsNil) 209 uWorkloadVersion, err := unit.WorkloadVersion() 210 c.Assert(err, jc.ErrorIsNil) 211 212 c.Check(msAgent, jc.DeepEquals, uAgent) 213 c.Check(msWorkload, jc.DeepEquals, uWorkload) 214 c.Check(msWorkloadVersion, jc.DeepEquals, uWorkloadVersion) 215 } 216 217 func (s *ModelStatusSuite) TestUnitStatusWeirdness(c *gc.C) { 218 unit := s.factory.MakeUnit(c, nil) 219 220 // When the agent status is in error, we show the workload status 221 // as an error, and the agent as idle 222 c.Assert(unit.SetStatus(status.StatusInfo{Status: status.Active}), jc.ErrorIsNil) 223 c.Assert(unit.SetAgentStatus(status.StatusInfo{ 224 Status: status.Error, 225 Message: "OMG"}), jc.ErrorIsNil) 226 227 ms, err := s.model.LoadModelStatus() 228 c.Assert(err, jc.ErrorIsNil) 229 230 msAgent, err := ms.UnitAgent(unit.Name()) 231 c.Assert(err, jc.ErrorIsNil) 232 msWorkload, err := ms.UnitWorkload(unit.Name(), true) 233 c.Assert(err, jc.ErrorIsNil) 234 235 uAgent, err := unit.AgentStatus() 236 c.Assert(err, jc.ErrorIsNil) 237 uWorkload, err := unit.Status() 238 c.Assert(err, jc.ErrorIsNil) 239 240 c.Check(msAgent, jc.DeepEquals, uAgent) 241 c.Check(msWorkload, jc.DeepEquals, uWorkload) 242 243 c.Check(msAgent.Status, gc.Equals, status.Idle) 244 c.Check(msWorkload.Status, gc.Equals, status.Error) 245 }