1
// Copyright 2012-2015 Canonical Ltd.
2
// Licensed under the AGPLv3, see LICENCE file for details.
9
jc "github.com/juju/testing/checkers"
10
gc "gopkg.in/check.v1"
12
"github.com/juju/juju/state"
13
"github.com/juju/juju/status"
16
type MachineStatusSuite struct {
18
machine *state.Machine
21
var _ = gc.Suite(&MachineStatusSuite{})
23
func (s *MachineStatusSuite) SetUpTest(c *gc.C) {
24
s.ConnSuite.SetUpTest(c)
25
s.machine = s.Factory.MakeMachine(c, nil)
28
func (s *MachineStatusSuite) TestInitialStatus(c *gc.C) {
29
s.checkInitialStatus(c)
32
func (s *MachineStatusSuite) checkInitialStatus(c *gc.C) {
33
statusInfo, err := s.machine.Status()
34
c.Check(err, jc.ErrorIsNil)
35
c.Check(statusInfo.Status, gc.Equals, status.StatusPending)
36
c.Check(statusInfo.Message, gc.Equals, "")
37
c.Check(statusInfo.Data, gc.HasLen, 0)
38
c.Check(statusInfo.Since, gc.NotNil)
41
func (s *MachineStatusSuite) TestSetErrorStatusWithoutInfo(c *gc.C) {
43
sInfo := status.StatusInfo{
44
Status: status.StatusError,
48
err := s.machine.SetStatus(sInfo)
49
c.Check(err, gc.ErrorMatches, `cannot set status "error" without info`)
51
s.checkInitialStatus(c)
54
func (s *MachineStatusSuite) TestSetDownStatus(c *gc.C) {
56
sInfo := status.StatusInfo{
57
Status: status.StatusDown,
61
err := s.machine.SetStatus(sInfo)
62
c.Check(err, gc.ErrorMatches, `cannot set status "down"`)
64
s.checkInitialStatus(c)
67
func (s *MachineStatusSuite) TestSetUnknownStatus(c *gc.C) {
69
sInfo := status.StatusInfo{
70
Status: status.Status("vliegkat"),
74
err := s.machine.SetStatus(sInfo)
75
c.Assert(err, gc.ErrorMatches, `cannot set invalid status "vliegkat"`)
77
s.checkInitialStatus(c)
80
func (s *MachineStatusSuite) TestSetOverwritesData(c *gc.C) {
82
sInfo := status.StatusInfo{
83
Status: status.StatusStarted,
85
Data: map[string]interface{}{
90
err := s.machine.SetStatus(sInfo)
91
c.Check(err, jc.ErrorIsNil)
93
s.checkGetSetStatus(c)
96
func (s *MachineStatusSuite) TestGetSetStatusAlive(c *gc.C) {
97
s.checkGetSetStatus(c)
100
func (s *MachineStatusSuite) checkGetSetStatus(c *gc.C) {
102
sInfo := status.StatusInfo{
103
Status: status.StatusStarted,
105
Data: map[string]interface{}{
106
"$foo.bar.baz": map[string]interface{}{
112
err := s.machine.SetStatus(sInfo)
113
c.Check(err, jc.ErrorIsNil)
115
machine, err := s.State.Machine(s.machine.Id())
116
c.Assert(err, jc.ErrorIsNil)
118
statusInfo, err := machine.Status()
119
c.Check(err, jc.ErrorIsNil)
120
c.Check(statusInfo.Status, gc.Equals, status.StatusStarted)
121
c.Check(statusInfo.Message, gc.Equals, "blah")
122
c.Check(statusInfo.Data, jc.DeepEquals, map[string]interface{}{
123
"$foo.bar.baz": map[string]interface{}{
127
c.Check(statusInfo.Since, gc.NotNil)
130
func (s *MachineStatusSuite) TestGetSetStatusDying(c *gc.C) {
131
err := s.machine.Destroy()
132
c.Assert(err, jc.ErrorIsNil)
134
s.checkGetSetStatus(c)
137
func (s *MachineStatusSuite) TestGetSetStatusDead(c *gc.C) {
138
err := s.machine.EnsureDead()
139
c.Assert(err, jc.ErrorIsNil)
141
// NOTE: it would be more technically correct to reject status updates
142
// while Dead, but it's easier and clearer, not to mention more efficient,
143
// to just depend on status doc existence.
144
s.checkGetSetStatus(c)
147
func (s *MachineStatusSuite) TestGetSetStatusGone(c *gc.C) {
148
err := s.machine.EnsureDead()
149
c.Assert(err, jc.ErrorIsNil)
150
err = s.machine.Remove()
151
c.Assert(err, jc.ErrorIsNil)
154
sInfo := status.StatusInfo{
155
Status: status.StatusStarted,
156
Message: "not really",
159
err = s.machine.SetStatus(sInfo)
160
c.Check(err, gc.ErrorMatches, `cannot set status: machine not found`)
162
statusInfo, err := s.machine.Status()
163
c.Check(err, gc.ErrorMatches, `cannot get status: machine not found`)
164
c.Check(statusInfo, gc.DeepEquals, status.StatusInfo{})
167
func (s *MachineStatusSuite) TestSetStatusPendingProvisioned(c *gc.C) {
169
sInfo := status.StatusInfo{
170
Status: status.StatusPending,
174
err := s.machine.SetStatus(sInfo)
175
c.Check(err, gc.ErrorMatches, `cannot set status "pending"`)
178
func (s *MachineStatusSuite) TestSetStatusPendingUnprovisioned(c *gc.C) {
179
machine, err := s.State.AddMachine("quantal", state.JobHostUnits)
180
c.Assert(err, jc.ErrorIsNil)
182
sInfo := status.StatusInfo{
183
Status: status.StatusPending,
187
err = machine.SetStatus(sInfo)
188
c.Check(err, jc.ErrorIsNil)