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  }