github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/state/status_machine_test.go (about)

     1  // Copyright 2012-2015 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  )
    13  
    14  type MachineStatusSuite struct {
    15  	ConnSuite
    16  	machine *state.Machine
    17  }
    18  
    19  var _ = gc.Suite(&MachineStatusSuite{})
    20  
    21  func (s *MachineStatusSuite) SetUpTest(c *gc.C) {
    22  	s.ConnSuite.SetUpTest(c)
    23  	s.machine = s.Factory.MakeMachine(c, nil)
    24  }
    25  
    26  func (s *MachineStatusSuite) TestInitialStatus(c *gc.C) {
    27  	s.checkInitialStatus(c)
    28  }
    29  
    30  func (s *MachineStatusSuite) checkInitialStatus(c *gc.C) {
    31  	statusInfo, err := s.machine.Status()
    32  	c.Check(err, jc.ErrorIsNil)
    33  	c.Check(statusInfo.Status, gc.Equals, status.StatusPending)
    34  	c.Check(statusInfo.Message, gc.Equals, "")
    35  	c.Check(statusInfo.Data, gc.HasLen, 0)
    36  	c.Check(statusInfo.Since, gc.NotNil)
    37  }
    38  
    39  func (s *MachineStatusSuite) TestSetErrorStatusWithoutInfo(c *gc.C) {
    40  	err := s.machine.SetStatus(status.StatusError, "", nil)
    41  	c.Check(err, gc.ErrorMatches, `cannot set status "error" without info`)
    42  
    43  	s.checkInitialStatus(c)
    44  }
    45  
    46  func (s *MachineStatusSuite) TestSetDownStatus(c *gc.C) {
    47  	err := s.machine.SetStatus(status.StatusDown, "", nil)
    48  	c.Check(err, gc.ErrorMatches, `cannot set status "down"`)
    49  
    50  	s.checkInitialStatus(c)
    51  }
    52  
    53  func (s *MachineStatusSuite) TestSetUnknownStatus(c *gc.C) {
    54  	err := s.machine.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 *MachineStatusSuite) TestSetOverwritesData(c *gc.C) {
    61  	err := s.machine.SetStatus(status.StatusStarted, "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 *MachineStatusSuite) TestGetSetStatusAlive(c *gc.C) {
    70  	s.checkGetSetStatus(c)
    71  }
    72  
    73  func (s *MachineStatusSuite) checkGetSetStatus(c *gc.C) {
    74  	err := s.machine.SetStatus(status.StatusStarted, "blah", map[string]interface{}{
    75  		"$foo.bar.baz": map[string]interface{}{
    76  			"pew.pew": "zap",
    77  		},
    78  	})
    79  	c.Check(err, jc.ErrorIsNil)
    80  
    81  	machine, err := s.State.Machine(s.machine.Id())
    82  	c.Assert(err, jc.ErrorIsNil)
    83  
    84  	statusInfo, err := machine.Status()
    85  	c.Check(err, jc.ErrorIsNil)
    86  	c.Check(statusInfo.Status, gc.Equals, status.StatusStarted)
    87  	c.Check(statusInfo.Message, gc.Equals, "blah")
    88  	c.Check(statusInfo.Data, jc.DeepEquals, map[string]interface{}{
    89  		"$foo.bar.baz": map[string]interface{}{
    90  			"pew.pew": "zap",
    91  		},
    92  	})
    93  	c.Check(statusInfo.Since, gc.NotNil)
    94  }
    95  
    96  func (s *MachineStatusSuite) TestGetSetStatusDying(c *gc.C) {
    97  	err := s.machine.Destroy()
    98  	c.Assert(err, jc.ErrorIsNil)
    99  
   100  	s.checkGetSetStatus(c)
   101  }
   102  
   103  func (s *MachineStatusSuite) TestGetSetStatusDead(c *gc.C) {
   104  	err := s.machine.EnsureDead()
   105  	c.Assert(err, jc.ErrorIsNil)
   106  
   107  	// NOTE: it would be more technically correct to reject status updates
   108  	// while Dead, but it's easier and clearer, not to mention more efficient,
   109  	// to just depend on status doc existence.
   110  	s.checkGetSetStatus(c)
   111  }
   112  
   113  func (s *MachineStatusSuite) TestGetSetStatusGone(c *gc.C) {
   114  	err := s.machine.EnsureDead()
   115  	c.Assert(err, jc.ErrorIsNil)
   116  	err = s.machine.Remove()
   117  	c.Assert(err, jc.ErrorIsNil)
   118  
   119  	err = s.machine.SetStatus(status.StatusStarted, "not really", nil)
   120  	c.Check(err, gc.ErrorMatches, `cannot set status: machine not found`)
   121  
   122  	statusInfo, err := s.machine.Status()
   123  	c.Check(err, gc.ErrorMatches, `cannot get status: machine not found`)
   124  	c.Check(statusInfo, gc.DeepEquals, status.StatusInfo{})
   125  }
   126  
   127  func (s *MachineStatusSuite) TestSetStatusPendingProvisioned(c *gc.C) {
   128  	err := s.machine.SetStatus(status.StatusPending, "", nil)
   129  	c.Check(err, gc.ErrorMatches, `cannot set status "pending"`)
   130  }
   131  
   132  func (s *MachineStatusSuite) TestSetStatusPendingUnprovisioned(c *gc.C) {
   133  	machine, err := s.State.AddMachine("quantal", state.JobHostUnits)
   134  	c.Assert(err, jc.ErrorIsNil)
   135  	err = machine.SetStatus(status.StatusPending, "", nil)
   136  	c.Check(err, jc.ErrorIsNil)
   137  }