1
// Copyright 2014 Cloudbase Solutions SRL.
2
// Copyright 2014 Canonical Ltd.
3
// Licensed under the AGPLv3, see LICENCE file for details.
8
jc "github.com/juju/testing/checkers"
11
"github.com/juju/juju/instance"
12
"github.com/juju/juju/state"
13
statetesting "github.com/juju/juju/state/testing"
16
type RebootSuite struct {
19
machine *state.Machine
25
wC1 state.NotifyWatcher
26
wC2 state.NotifyWatcher
27
wC3 state.NotifyWatcher
29
wc statetesting.NotifyWatcherC
30
wcC1 statetesting.NotifyWatcherC
31
wcC2 statetesting.NotifyWatcherC
32
wcC3 statetesting.NotifyWatcherC
35
var _ = gc.Suite(&RebootSuite{})
37
func (s *RebootSuite) SetUpTest(c *gc.C) {
38
s.ConnSuite.SetUpTest(c)
42
s.machine, err = s.State.AddMachine("quantal", state.JobManageModel)
43
c.Assert(err, jc.ErrorIsNil)
44
// Add first container
45
s.c1, err = s.State.AddMachineInsideMachine(state.MachineTemplate{
47
Jobs: []state.MachineJob{state.JobHostUnits},
48
}, s.machine.Id(), instance.LXD)
49
c.Assert(err, jc.ErrorIsNil)
50
// Add second container
51
s.c2, err = s.State.AddMachineInsideMachine(state.MachineTemplate{
53
Jobs: []state.MachineJob{state.JobHostUnits},
54
}, s.c1.Id(), instance.LXD)
55
c.Assert(err, jc.ErrorIsNil)
57
// Add container on the same level as the first container.
58
s.c3, err = s.State.AddMachineInsideMachine(state.MachineTemplate{
60
Jobs: []state.MachineJob{state.JobHostUnits},
61
}, s.machine.Id(), instance.LXD)
62
c.Assert(err, jc.ErrorIsNil)
64
s.w = s.machine.WatchForRebootEvent()
66
s.wc = statetesting.NewNotifyWatcherC(c, s.State, s.w)
67
s.wc.AssertOneChange()
69
s.wC1 = s.c1.WatchForRebootEvent()
71
// Initial event on container 1.
72
s.wcC1 = statetesting.NewNotifyWatcherC(c, s.State, s.wC1)
73
s.wcC1.AssertOneChange()
75
// Get reboot watcher on container 2
76
s.wC2 = s.c2.WatchForRebootEvent()
78
// Initial event on container 2.
79
s.wcC2 = statetesting.NewNotifyWatcherC(c, s.State, s.wC2)
80
s.wcC2.AssertOneChange()
82
// Get reboot watcher on container 3
83
s.wC3 = s.c3.WatchForRebootEvent()
85
// Initial event on container 3.
86
s.wcC3 = statetesting.NewNotifyWatcherC(c, s.State, s.wC3)
87
s.wcC3.AssertOneChange()
90
func (s *RebootSuite) TearDownSuit(c *gc.C) {
92
statetesting.AssertStop(c, s.w)
95
statetesting.AssertStop(c, s.wC1)
98
statetesting.AssertStop(c, s.wC2)
101
statetesting.AssertStop(c, s.wC3)
105
func (s *RebootSuite) TestWatchForRebootEvent(c *gc.C) {
106
err := s.machine.SetRebootFlag(true)
107
c.Assert(err, jc.ErrorIsNil)
109
s.wc.AssertOneChange()
111
inState, err := s.machine.GetRebootFlag()
112
c.Assert(err, jc.ErrorIsNil)
113
c.Assert(inState, jc.IsTrue)
115
err = s.machine.SetRebootFlag(false)
116
c.Assert(err, jc.ErrorIsNil)
118
s.wc.AssertOneChange()
120
inState, err = s.machine.GetRebootFlag()
121
c.Assert(err, jc.ErrorIsNil)
122
c.Assert(inState, jc.IsFalse)
124
err = s.machine.SetRebootFlag(true)
125
c.Assert(err, jc.ErrorIsNil)
126
err = s.machine.SetRebootFlag(false)
127
c.Assert(err, jc.ErrorIsNil)
128
err = s.machine.SetRebootFlag(true)
129
c.Assert(err, jc.ErrorIsNil)
131
s.wc.AssertOneChange()
133
// Stop all watchers and check they are closed
134
statetesting.AssertStop(c, s.w)
136
statetesting.AssertStop(c, s.wC1)
137
s.wcC1.AssertClosed()
138
statetesting.AssertStop(c, s.wC2)
139
s.wcC2.AssertClosed()
140
statetesting.AssertStop(c, s.wC3)
141
s.wcC3.AssertClosed()
144
func (s *RebootSuite) TestWatchRebootHappensOnMachine(c *gc.C) {
145
// Reboot request happens on machine: everyone see it (including container3)
146
err := s.machine.SetRebootFlag(true)
147
c.Assert(err, jc.ErrorIsNil)
149
s.wc.AssertOneChange()
150
s.wcC1.AssertOneChange()
151
s.wcC2.AssertOneChange()
152
s.wcC3.AssertOneChange()
154
statetesting.AssertStop(c, s.w)
156
statetesting.AssertStop(c, s.wC1)
157
s.wcC1.AssertClosed()
158
statetesting.AssertStop(c, s.wC2)
159
s.wcC2.AssertClosed()
160
statetesting.AssertStop(c, s.wC3)
161
s.wcC3.AssertClosed()
164
func (s *RebootSuite) TestWatchRebootHappensOnContainer1(c *gc.C) {
165
// Reboot request happens on container1: only container1 andcontainer2
167
err := s.c1.SetRebootFlag(true)
168
c.Assert(err, jc.ErrorIsNil)
170
s.wc.AssertNoChange()
171
s.wcC1.AssertOneChange()
172
s.wcC2.AssertOneChange()
173
s.wcC3.AssertNoChange()
175
// Stop all watchers and check they are closed
176
statetesting.AssertStop(c, s.w)
178
statetesting.AssertStop(c, s.wC1)
179
s.wcC1.AssertClosed()
180
statetesting.AssertStop(c, s.wC2)
181
s.wcC2.AssertClosed()
182
statetesting.AssertStop(c, s.wC3)
183
s.wcC3.AssertClosed()
186
func (s *RebootSuite) TestWatchRebootHappensOnContainer2(c *gc.C) {
187
// Reboot request happens on container2: only container2 sees it
188
err := s.c2.SetRebootFlag(true)
189
c.Assert(err, jc.ErrorIsNil)
191
s.wc.AssertNoChange()
192
s.wcC1.AssertNoChange()
193
s.wcC2.AssertOneChange()
194
s.wcC3.AssertNoChange()
196
// Stop all watchers and check they are closed
197
statetesting.AssertStop(c, s.w)
199
statetesting.AssertStop(c, s.wC1)
200
s.wcC1.AssertClosed()
201
statetesting.AssertStop(c, s.wC2)
202
s.wcC2.AssertClosed()
203
statetesting.AssertStop(c, s.wC3)
204
s.wcC3.AssertClosed()
207
func (s *RebootSuite) TestWatchRebootHappensOnContainer3(c *gc.C) {
208
// Reboot request happens on container2: only container2 sees it
209
err := s.c3.SetRebootFlag(true)
210
c.Assert(err, jc.ErrorIsNil)
212
s.wc.AssertNoChange()
213
s.wcC1.AssertNoChange()
214
s.wcC2.AssertNoChange()
215
s.wcC3.AssertOneChange()
217
// Stop all watchers and check they are closed
218
statetesting.AssertStop(c, s.w)
220
statetesting.AssertStop(c, s.wC1)
221
s.wcC1.AssertClosed()
222
statetesting.AssertStop(c, s.wC2)
223
s.wcC2.AssertClosed()
224
statetesting.AssertStop(c, s.wC3)
225
s.wcC3.AssertClosed()