github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/state/reboot_test.go (about) 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.LXC) 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.LXC) 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.LXC) 62 c.Assert(err, jc.ErrorIsNil) 63 64 s.w, err = s.machine.WatchForRebootEvent() 65 c.Assert(err, jc.ErrorIsNil) 66 67 s.wc = statetesting.NewNotifyWatcherC(c, s.State, s.w) 68 s.wc.AssertOneChange() 69 70 s.wC1, err = s.c1.WatchForRebootEvent() 71 c.Assert(err, jc.ErrorIsNil) 72 73 // Initial event on container 1. 74 s.wcC1 = statetesting.NewNotifyWatcherC(c, s.State, s.wC1) 75 s.wcC1.AssertOneChange() 76 77 // Get reboot watcher on container 2 78 s.wC2, err = s.c2.WatchForRebootEvent() 79 c.Assert(err, jc.ErrorIsNil) 80 81 // Initial event on container 2. 82 s.wcC2 = statetesting.NewNotifyWatcherC(c, s.State, s.wC2) 83 s.wcC2.AssertOneChange() 84 85 // Get reboot watcher on container 3 86 s.wC3, err = s.c3.WatchForRebootEvent() 87 c.Assert(err, jc.ErrorIsNil) 88 89 // Initial event on container 3. 90 s.wcC3 = statetesting.NewNotifyWatcherC(c, s.State, s.wC3) 91 s.wcC3.AssertOneChange() 92 } 93 94 func (s *RebootSuite) TearDownSuit(c *gc.C) { 95 if s.w != nil { 96 statetesting.AssertStop(c, s.w) 97 } 98 if s.wC1 != nil { 99 statetesting.AssertStop(c, s.wC1) 100 } 101 if s.wC2 != nil { 102 statetesting.AssertStop(c, s.wC2) 103 } 104 if s.wC3 != nil { 105 statetesting.AssertStop(c, s.wC3) 106 } 107 } 108 109 func (s *RebootSuite) TestWatchForRebootEvent(c *gc.C) { 110 err := s.machine.SetRebootFlag(true) 111 c.Assert(err, jc.ErrorIsNil) 112 113 s.wc.AssertOneChange() 114 115 inState, err := s.machine.GetRebootFlag() 116 c.Assert(err, jc.ErrorIsNil) 117 c.Assert(inState, jc.IsTrue) 118 119 err = s.machine.SetRebootFlag(false) 120 c.Assert(err, jc.ErrorIsNil) 121 122 s.wc.AssertOneChange() 123 124 inState, err = s.machine.GetRebootFlag() 125 c.Assert(err, jc.ErrorIsNil) 126 c.Assert(inState, jc.IsFalse) 127 128 err = s.machine.SetRebootFlag(true) 129 c.Assert(err, jc.ErrorIsNil) 130 err = s.machine.SetRebootFlag(false) 131 c.Assert(err, jc.ErrorIsNil) 132 err = s.machine.SetRebootFlag(true) 133 c.Assert(err, jc.ErrorIsNil) 134 135 s.wc.AssertOneChange() 136 137 // Stop all watchers and check they are closed 138 statetesting.AssertStop(c, s.w) 139 s.wc.AssertClosed() 140 statetesting.AssertStop(c, s.wC1) 141 s.wcC1.AssertClosed() 142 statetesting.AssertStop(c, s.wC2) 143 s.wcC2.AssertClosed() 144 statetesting.AssertStop(c, s.wC3) 145 s.wcC3.AssertClosed() 146 } 147 148 func (s *RebootSuite) TestWatchRebootHappensOnMachine(c *gc.C) { 149 // Reboot request happens on machine: everyone see it (including container3) 150 err := s.machine.SetRebootFlag(true) 151 c.Assert(err, jc.ErrorIsNil) 152 153 s.wc.AssertOneChange() 154 s.wcC1.AssertOneChange() 155 s.wcC2.AssertOneChange() 156 s.wcC3.AssertOneChange() 157 158 statetesting.AssertStop(c, s.w) 159 s.wc.AssertClosed() 160 statetesting.AssertStop(c, s.wC1) 161 s.wcC1.AssertClosed() 162 statetesting.AssertStop(c, s.wC2) 163 s.wcC2.AssertClosed() 164 statetesting.AssertStop(c, s.wC3) 165 s.wcC3.AssertClosed() 166 } 167 168 func (s *RebootSuite) TestWatchRebootHappensOnContainer1(c *gc.C) { 169 // Reboot request happens on container1: only container1 andcontainer2 170 // react 171 err := s.c1.SetRebootFlag(true) 172 c.Assert(err, jc.ErrorIsNil) 173 174 s.wc.AssertNoChange() 175 s.wcC1.AssertOneChange() 176 s.wcC2.AssertOneChange() 177 s.wcC3.AssertNoChange() 178 179 // Stop all watchers and check they are closed 180 statetesting.AssertStop(c, s.w) 181 s.wc.AssertClosed() 182 statetesting.AssertStop(c, s.wC1) 183 s.wcC1.AssertClosed() 184 statetesting.AssertStop(c, s.wC2) 185 s.wcC2.AssertClosed() 186 statetesting.AssertStop(c, s.wC3) 187 s.wcC3.AssertClosed() 188 } 189 190 func (s *RebootSuite) TestWatchRebootHappensOnContainer2(c *gc.C) { 191 // Reboot request happens on container2: only container2 sees it 192 err := s.c2.SetRebootFlag(true) 193 c.Assert(err, jc.ErrorIsNil) 194 195 s.wc.AssertNoChange() 196 s.wcC1.AssertNoChange() 197 s.wcC2.AssertOneChange() 198 s.wcC3.AssertNoChange() 199 200 // Stop all watchers and check they are closed 201 statetesting.AssertStop(c, s.w) 202 s.wc.AssertClosed() 203 statetesting.AssertStop(c, s.wC1) 204 s.wcC1.AssertClosed() 205 statetesting.AssertStop(c, s.wC2) 206 s.wcC2.AssertClosed() 207 statetesting.AssertStop(c, s.wC3) 208 s.wcC3.AssertClosed() 209 } 210 211 func (s *RebootSuite) TestWatchRebootHappensOnContainer3(c *gc.C) { 212 // Reboot request happens on container2: only container2 sees it 213 err := s.c3.SetRebootFlag(true) 214 c.Assert(err, jc.ErrorIsNil) 215 216 s.wc.AssertNoChange() 217 s.wcC1.AssertNoChange() 218 s.wcC2.AssertNoChange() 219 s.wcC3.AssertOneChange() 220 221 // Stop all watchers and check they are closed 222 statetesting.AssertStop(c, s.w) 223 s.wc.AssertClosed() 224 statetesting.AssertStop(c, s.wC1) 225 s.wcC1.AssertClosed() 226 statetesting.AssertStop(c, s.wC2) 227 s.wcC2.AssertClosed() 228 statetesting.AssertStop(c, s.wC3) 229 s.wcC3.AssertClosed() 230 }