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  }