github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/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/state" 11 "github.com/juju/juju/status" 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 } 21 22 var _ = gc.Suite(&ModelStatusSuite{}) 23 24 func (s *ModelStatusSuite) SetUpTest(c *gc.C) { 25 s.ConnSuite.SetUpTest(c) 26 s.st = s.Factory.MakeModel(c, nil) 27 m, err := s.st.Model() 28 c.Assert(err, jc.ErrorIsNil) 29 s.model = m 30 } 31 32 func (s *ModelStatusSuite) TearDownTest(c *gc.C) { 33 if s.st != nil { 34 err := s.st.Close() 35 c.Assert(err, jc.ErrorIsNil) 36 s.st = nil 37 } 38 s.ConnSuite.TearDownTest(c) 39 } 40 41 func (s *ModelStatusSuite) TestInitialStatus(c *gc.C) { 42 s.checkInitialStatus(c) 43 } 44 45 func (s *ModelStatusSuite) checkInitialStatus(c *gc.C) { 46 statusInfo, err := s.model.Status() 47 c.Check(err, jc.ErrorIsNil) 48 c.Check(statusInfo.Status, gc.Equals, status.Available) 49 c.Check(statusInfo.Message, gc.Equals, "") 50 c.Check(statusInfo.Data, gc.HasLen, 0) 51 c.Check(statusInfo.Since, gc.NotNil) 52 } 53 54 func (s *ModelStatusSuite) TestSetUnknownStatus(c *gc.C) { 55 now := testing.ZeroTime() 56 sInfo := status.StatusInfo{ 57 Status: status.Status("vliegkat"), 58 Message: "orville", 59 Since: &now, 60 } 61 err := s.model.SetStatus(sInfo) 62 c.Assert(err, gc.ErrorMatches, `cannot set invalid status "vliegkat"`) 63 64 s.checkInitialStatus(c) 65 } 66 67 func (s *ModelStatusSuite) TestSetOverwritesData(c *gc.C) { 68 now := testing.ZeroTime() 69 sInfo := status.StatusInfo{ 70 Status: status.Available, 71 Message: "blah", 72 Data: map[string]interface{}{ 73 "pew.pew": "zap", 74 }, 75 Since: &now, 76 } 77 err := s.model.SetStatus(sInfo) 78 c.Check(err, jc.ErrorIsNil) 79 80 s.checkGetSetStatus(c) 81 } 82 83 func (s *ModelStatusSuite) TestGetSetStatusDying(c *gc.C) { 84 // Add a machine to the model to ensure it is non-empty 85 // when we destroy; this prevents the model from advancing 86 // directly to Dead. 87 factory.NewFactory(s.st).MakeMachine(c, nil) 88 89 err := s.model.Destroy() 90 c.Assert(err, jc.ErrorIsNil) 91 92 s.checkGetSetStatus(c) 93 } 94 95 func (s *ModelStatusSuite) TestGetSetStatusDead(c *gc.C) { 96 err := s.model.Destroy() 97 c.Assert(err, jc.ErrorIsNil) 98 99 // NOTE: it would be more technically correct to reject status updates 100 // while Dead, but it's easier and clearer, not to mention more efficient, 101 // to just depend on status doc existence. 102 s.checkGetSetStatus(c) 103 } 104 105 func (s *ModelStatusSuite) TestGetSetStatusGone(c *gc.C) { 106 err := s.model.Destroy() 107 c.Assert(err, jc.ErrorIsNil) 108 err = s.st.RemoveAllModelDocs() 109 c.Assert(err, jc.ErrorIsNil) 110 111 now := testing.ZeroTime() 112 sInfo := status.StatusInfo{ 113 Status: status.Available, 114 Message: "not really", 115 Since: &now, 116 } 117 err = s.model.SetStatus(sInfo) 118 c.Check(err, gc.ErrorMatches, `cannot set status: model not found`) 119 120 _, err = s.model.Status() 121 c.Check(err, gc.ErrorMatches, `cannot get status: model not found`) 122 } 123 124 func (s *ModelStatusSuite) checkGetSetStatus(c *gc.C) { 125 now := testing.ZeroTime() 126 sInfo := status.StatusInfo{ 127 Status: status.Available, 128 Message: "blah", 129 Data: map[string]interface{}{ 130 "$foo.bar.baz": map[string]interface{}{ 131 "pew.pew": "zap", 132 }}, 133 Since: &now, 134 } 135 err := s.model.SetStatus(sInfo) 136 c.Check(err, jc.ErrorIsNil) 137 138 model, err := s.State.GetModel(s.model.ModelTag()) 139 c.Assert(err, jc.ErrorIsNil) 140 141 statusInfo, err := model.Status() 142 c.Check(err, jc.ErrorIsNil) 143 c.Check(statusInfo.Status, gc.Equals, status.Available) 144 c.Check(statusInfo.Message, gc.Equals, "blah") 145 c.Check(statusInfo.Data, jc.DeepEquals, map[string]interface{}{ 146 "$foo.bar.baz": map[string]interface{}{ 147 "pew.pew": "zap", 148 }, 149 }) 150 c.Check(statusInfo.Since, gc.NotNil) 151 }