github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/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/factory" 13 ) 14 15 type ModelStatusSuite struct { 16 ConnSuite 17 st *state.State 18 model *state.Model 19 } 20 21 var _ = gc.Suite(&ModelStatusSuite{}) 22 23 func (s *ModelStatusSuite) SetUpTest(c *gc.C) { 24 s.ConnSuite.SetUpTest(c) 25 s.st = s.Factory.MakeModel(c, nil) 26 m, err := s.st.Model() 27 c.Assert(err, jc.ErrorIsNil) 28 s.model = m 29 } 30 31 func (s *ModelStatusSuite) TearDownTest(c *gc.C) { 32 if s.st != nil { 33 err := s.st.Close() 34 c.Assert(err, jc.ErrorIsNil) 35 s.st = nil 36 } 37 s.ConnSuite.TearDownTest(c) 38 } 39 40 func (s *ModelStatusSuite) TestInitialStatus(c *gc.C) { 41 s.checkInitialStatus(c) 42 } 43 44 func (s *ModelStatusSuite) checkInitialStatus(c *gc.C) { 45 statusInfo, err := s.model.Status() 46 c.Check(err, jc.ErrorIsNil) 47 c.Check(statusInfo.Status, gc.Equals, status.StatusAvailable) 48 c.Check(statusInfo.Message, gc.Equals, "") 49 c.Check(statusInfo.Data, gc.HasLen, 0) 50 c.Check(statusInfo.Since, gc.NotNil) 51 } 52 53 func (s *ModelStatusSuite) TestSetUnknownStatus(c *gc.C) { 54 err := s.model.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 *ModelStatusSuite) TestSetOverwritesData(c *gc.C) { 61 err := s.model.SetStatus(status.StatusAvailable, "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 *ModelStatusSuite) TestGetSetStatusDying(c *gc.C) { 70 // Add a machine to the model to ensure it is non-empty 71 // when we destroy; this prevents the model from advancing 72 // directly to Dead. 73 factory.NewFactory(s.st).MakeMachine(c, nil) 74 75 err := s.model.Destroy() 76 c.Assert(err, jc.ErrorIsNil) 77 78 s.checkGetSetStatus(c) 79 } 80 81 func (s *ModelStatusSuite) TestGetSetStatusDead(c *gc.C) { 82 err := s.model.Destroy() 83 c.Assert(err, jc.ErrorIsNil) 84 85 // NOTE: it would be more technically correct to reject status updates 86 // while Dead, but it's easier and clearer, not to mention more efficient, 87 // to just depend on status doc existence. 88 s.checkGetSetStatus(c) 89 } 90 91 func (s *ModelStatusSuite) TestGetSetStatusGone(c *gc.C) { 92 err := s.model.Destroy() 93 c.Assert(err, jc.ErrorIsNil) 94 err = s.st.RemoveAllModelDocs() 95 c.Assert(err, jc.ErrorIsNil) 96 97 err = s.model.SetStatus(status.StatusAvailable, "not really", nil) 98 c.Check(err, gc.ErrorMatches, `cannot set status: model not found`) 99 100 _, err = s.model.Status() 101 c.Check(err, gc.ErrorMatches, `cannot get status: model not found`) 102 } 103 104 func (s *ModelStatusSuite) checkGetSetStatus(c *gc.C) { 105 err := s.model.SetStatus(status.StatusAvailable, "blah", map[string]interface{}{ 106 "$foo.bar.baz": map[string]interface{}{ 107 "pew.pew": "zap", 108 }, 109 }) 110 c.Check(err, jc.ErrorIsNil) 111 112 model, err := s.State.GetModel(s.model.ModelTag()) 113 c.Assert(err, jc.ErrorIsNil) 114 115 statusInfo, err := model.Status() 116 c.Check(err, jc.ErrorIsNil) 117 c.Check(statusInfo.Status, gc.Equals, status.StatusAvailable) 118 c.Check(statusInfo.Message, gc.Equals, "blah") 119 c.Check(statusInfo.Data, jc.DeepEquals, map[string]interface{}{ 120 "$foo.bar.baz": map[string]interface{}{ 121 "pew.pew": "zap", 122 }, 123 }) 124 c.Check(statusInfo.Since, gc.NotNil) 125 }