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  }