github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/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.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 }