~nskaggs/+junk/xenial-test

« back to all changes in this revision

Viewing changes to src/github.com/juju/juju/state/reboot_test.go

  • Committer: Nicholas Skaggs
  • Date: 2016-10-24 20:56:05 UTC
  • Revision ID: nicholas.skaggs@canonical.com-20161024205605-z8lta0uvuhtxwzwl
Initi with beta15

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
// Copyright 2014 Cloudbase Solutions SRL.
 
2
// Copyright 2014 Canonical Ltd.
 
3
// Licensed under the AGPLv3, see LICENCE file for details.
 
4
 
 
5
package state_test
 
6
 
 
7
import (
 
8
        jc "github.com/juju/testing/checkers"
 
9
        gc "gopkg.in/check.v1"
 
10
 
 
11
        "github.com/juju/juju/instance"
 
12
        "github.com/juju/juju/state"
 
13
        statetesting "github.com/juju/juju/state/testing"
 
14
)
 
15
 
 
16
type RebootSuite struct {
 
17
        ConnSuite
 
18
 
 
19
        machine *state.Machine
 
20
        c1      *state.Machine
 
21
        c2      *state.Machine
 
22
        c3      *state.Machine
 
23
 
 
24
        w   state.NotifyWatcher
 
25
        wC1 state.NotifyWatcher
 
26
        wC2 state.NotifyWatcher
 
27
        wC3 state.NotifyWatcher
 
28
 
 
29
        wc   statetesting.NotifyWatcherC
 
30
        wcC1 statetesting.NotifyWatcherC
 
31
        wcC2 statetesting.NotifyWatcherC
 
32
        wcC3 statetesting.NotifyWatcherC
 
33
}
 
34
 
 
35
var _ = gc.Suite(&RebootSuite{})
 
36
 
 
37
func (s *RebootSuite) SetUpTest(c *gc.C) {
 
38
        s.ConnSuite.SetUpTest(c)
 
39
        var err error
 
40
 
 
41
        // Add machine
 
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{
 
46
                Series: "quantal",
 
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{
 
52
                Series: "quantal",
 
53
                Jobs:   []state.MachineJob{state.JobHostUnits},
 
54
        }, s.c1.Id(), instance.LXD)
 
55
        c.Assert(err, jc.ErrorIsNil)
 
56
 
 
57
        // Add container on the same level as the first container.
 
58
        s.c3, err = s.State.AddMachineInsideMachine(state.MachineTemplate{
 
59
                Series: "quantal",
 
60
                Jobs:   []state.MachineJob{state.JobHostUnits},
 
61
        }, s.machine.Id(), instance.LXD)
 
62
        c.Assert(err, jc.ErrorIsNil)
 
63
 
 
64
        s.w = s.machine.WatchForRebootEvent()
 
65
 
 
66
        s.wc = statetesting.NewNotifyWatcherC(c, s.State, s.w)
 
67
        s.wc.AssertOneChange()
 
68
 
 
69
        s.wC1 = s.c1.WatchForRebootEvent()
 
70
 
 
71
        // Initial event on container 1.
 
72
        s.wcC1 = statetesting.NewNotifyWatcherC(c, s.State, s.wC1)
 
73
        s.wcC1.AssertOneChange()
 
74
 
 
75
        // Get reboot watcher on container 2
 
76
        s.wC2 = s.c2.WatchForRebootEvent()
 
77
 
 
78
        // Initial event on container 2.
 
79
        s.wcC2 = statetesting.NewNotifyWatcherC(c, s.State, s.wC2)
 
80
        s.wcC2.AssertOneChange()
 
81
 
 
82
        // Get reboot watcher on container 3
 
83
        s.wC3 = s.c3.WatchForRebootEvent()
 
84
 
 
85
        // Initial event on container 3.
 
86
        s.wcC3 = statetesting.NewNotifyWatcherC(c, s.State, s.wC3)
 
87
        s.wcC3.AssertOneChange()
 
88
}
 
89
 
 
90
func (s *RebootSuite) TearDownSuit(c *gc.C) {
 
91
        if s.w != nil {
 
92
                statetesting.AssertStop(c, s.w)
 
93
        }
 
94
        if s.wC1 != nil {
 
95
                statetesting.AssertStop(c, s.wC1)
 
96
        }
 
97
        if s.wC2 != nil {
 
98
                statetesting.AssertStop(c, s.wC2)
 
99
        }
 
100
        if s.wC3 != nil {
 
101
                statetesting.AssertStop(c, s.wC3)
 
102
        }
 
103
}
 
104
 
 
105
func (s *RebootSuite) TestWatchForRebootEvent(c *gc.C) {
 
106
        err := s.machine.SetRebootFlag(true)
 
107
        c.Assert(err, jc.ErrorIsNil)
 
108
 
 
109
        s.wc.AssertOneChange()
 
110
 
 
111
        inState, err := s.machine.GetRebootFlag()
 
112
        c.Assert(err, jc.ErrorIsNil)
 
113
        c.Assert(inState, jc.IsTrue)
 
114
 
 
115
        err = s.machine.SetRebootFlag(false)
 
116
        c.Assert(err, jc.ErrorIsNil)
 
117
 
 
118
        s.wc.AssertOneChange()
 
119
 
 
120
        inState, err = s.machine.GetRebootFlag()
 
121
        c.Assert(err, jc.ErrorIsNil)
 
122
        c.Assert(inState, jc.IsFalse)
 
123
 
 
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)
 
130
 
 
131
        s.wc.AssertOneChange()
 
132
 
 
133
        // Stop all watchers and check they are closed
 
134
        statetesting.AssertStop(c, s.w)
 
135
        s.wc.AssertClosed()
 
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()
 
142
}
 
143
 
 
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)
 
148
 
 
149
        s.wc.AssertOneChange()
 
150
        s.wcC1.AssertOneChange()
 
151
        s.wcC2.AssertOneChange()
 
152
        s.wcC3.AssertOneChange()
 
153
 
 
154
        statetesting.AssertStop(c, s.w)
 
155
        s.wc.AssertClosed()
 
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()
 
162
}
 
163
 
 
164
func (s *RebootSuite) TestWatchRebootHappensOnContainer1(c *gc.C) {
 
165
        // Reboot request happens on container1: only container1 andcontainer2
 
166
        // react
 
167
        err := s.c1.SetRebootFlag(true)
 
168
        c.Assert(err, jc.ErrorIsNil)
 
169
 
 
170
        s.wc.AssertNoChange()
 
171
        s.wcC1.AssertOneChange()
 
172
        s.wcC2.AssertOneChange()
 
173
        s.wcC3.AssertNoChange()
 
174
 
 
175
        // Stop all watchers and check they are closed
 
176
        statetesting.AssertStop(c, s.w)
 
177
        s.wc.AssertClosed()
 
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()
 
184
}
 
185
 
 
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)
 
190
 
 
191
        s.wc.AssertNoChange()
 
192
        s.wcC1.AssertNoChange()
 
193
        s.wcC2.AssertOneChange()
 
194
        s.wcC3.AssertNoChange()
 
195
 
 
196
        // Stop all watchers and check they are closed
 
197
        statetesting.AssertStop(c, s.w)
 
198
        s.wc.AssertClosed()
 
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()
 
205
}
 
206
 
 
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)
 
211
 
 
212
        s.wc.AssertNoChange()
 
213
        s.wcC1.AssertNoChange()
 
214
        s.wcC2.AssertNoChange()
 
215
        s.wcC3.AssertOneChange()
 
216
 
 
217
        // Stop all watchers and check they are closed
 
218
        statetesting.AssertStop(c, s.w)
 
219
        s.wc.AssertClosed()
 
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()
 
226
}