github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/apiserver/reboot/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 reboot_test 6 7 import ( 8 jc "github.com/juju/testing/checkers" 9 gc "gopkg.in/check.v1" 10 11 "github.com/juju/juju/apiserver/common" 12 "github.com/juju/juju/apiserver/params" 13 "github.com/juju/juju/apiserver/reboot" 14 apiservertesting "github.com/juju/juju/apiserver/testing" 15 "github.com/juju/juju/instance" 16 jujutesting "github.com/juju/juju/juju/testing" 17 "github.com/juju/juju/state" 18 statetesting "github.com/juju/juju/state/testing" 19 ) 20 21 type machines struct { 22 machine *state.Machine 23 authorizer apiservertesting.FakeAuthorizer 24 resources *common.Resources 25 rebootAPI *reboot.RebootAPI 26 args params.Entities 27 28 w state.NotifyWatcher 29 wc statetesting.NotifyWatcherC 30 } 31 32 type rebootSuite struct { 33 jujutesting.JujuConnSuite 34 35 machine *machines 36 container *machines 37 nestedContainer *machines 38 } 39 40 var _ = gc.Suite(&rebootSuite{}) 41 42 func (s *rebootSuite) setUpMachine(c *gc.C, machine *state.Machine) *machines { 43 // Create a FakeAuthorizer so we can check permissions, 44 // set up assuming we logged in as a machine agent. 45 authorizer := apiservertesting.FakeAuthorizer{ 46 Tag: machine.Tag(), 47 } 48 49 resources := common.NewResources() 50 51 rebootAPI, err := reboot.NewRebootAPI(s.State, resources, authorizer) 52 c.Assert(err, jc.ErrorIsNil) 53 54 args := params.Entities{Entities: []params.Entity{ 55 {Tag: machine.Tag().String()}, 56 }} 57 58 resultMachine, err := rebootAPI.WatchForRebootEvent() 59 c.Assert(err, jc.ErrorIsNil) 60 c.Check(resultMachine.NotifyWatcherId, gc.Not(gc.Equals), "") 61 c.Check(resultMachine.Error, gc.IsNil) 62 63 resourceMachine := resources.Get(resultMachine.NotifyWatcherId) 64 c.Check(resourceMachine, gc.NotNil) 65 66 w := resourceMachine.(state.NotifyWatcher) 67 wc := statetesting.NewNotifyWatcherC(c, s.State, w) 68 wc.AssertNoChange() 69 70 return &machines{ 71 machine: machine, 72 authorizer: authorizer, 73 resources: resources, 74 rebootAPI: rebootAPI, 75 args: args, 76 w: w, 77 wc: wc, 78 } 79 } 80 81 func (s *rebootSuite) SetUpTest(c *gc.C) { 82 s.JujuConnSuite.SetUpTest(c) 83 var err error 84 85 template := state.MachineTemplate{ 86 Series: "quantal", 87 Jobs: []state.MachineJob{state.JobHostUnits}, 88 } 89 90 machine, err := s.State.AddMachine("quantal", state.JobHostUnits) 91 c.Assert(err, jc.ErrorIsNil) 92 93 container, err := s.State.AddMachineInsideMachine(template, machine.Id(), instance.LXD) 94 c.Assert(err, jc.ErrorIsNil) 95 96 nestedContainer, err := s.State.AddMachineInsideMachine(template, container.Id(), instance.KVM) 97 c.Assert(err, jc.ErrorIsNil) 98 99 s.machine = s.setUpMachine(c, machine) 100 s.container = s.setUpMachine(c, container) 101 s.nestedContainer = s.setUpMachine(c, nestedContainer) 102 } 103 104 func (s *rebootSuite) TearDownTest(c *gc.C) { 105 if s.machine.resources != nil { 106 s.machine.resources.StopAll() 107 } 108 if s.machine.w != nil { 109 statetesting.AssertStop(c, s.machine.w) 110 s.machine.wc.AssertClosed() 111 } 112 113 if s.container.resources != nil { 114 s.container.resources.StopAll() 115 } 116 if s.container.w != nil { 117 statetesting.AssertStop(c, s.container.w) 118 s.container.wc.AssertClosed() 119 } 120 121 if s.nestedContainer.resources != nil { 122 s.nestedContainer.resources.StopAll() 123 } 124 if s.nestedContainer.w != nil { 125 statetesting.AssertStop(c, s.nestedContainer.w) 126 s.nestedContainer.wc.AssertClosed() 127 } 128 s.JujuConnSuite.TearDownTest(c) 129 } 130 131 func (s *rebootSuite) TestWatchForRebootEvent(c *gc.C) { 132 err := s.machine.machine.SetRebootFlag(true) 133 c.Assert(err, jc.ErrorIsNil) 134 135 s.machine.wc.AssertOneChange() 136 } 137 138 func (s *rebootSuite) TestRequestReboot(c *gc.C) { 139 errResult, err := s.machine.rebootAPI.RequestReboot(s.machine.args) 140 c.Assert(err, jc.ErrorIsNil) 141 c.Assert(errResult, gc.DeepEquals, params.ErrorResults{ 142 Results: []params.ErrorResult{ 143 {Error: nil}, 144 }}) 145 146 s.machine.wc.AssertOneChange() 147 148 res, err := s.machine.rebootAPI.GetRebootAction(s.machine.args) 149 c.Assert(err, jc.ErrorIsNil) 150 c.Assert(res, gc.DeepEquals, params.RebootActionResults{ 151 Results: []params.RebootActionResult{ 152 {Result: params.ShouldReboot}, 153 }}) 154 } 155 156 func (s *rebootSuite) TestClearReboot(c *gc.C) { 157 errResult, err := s.machine.rebootAPI.RequestReboot(s.machine.args) 158 c.Assert(err, jc.ErrorIsNil) 159 c.Assert(errResult, gc.DeepEquals, params.ErrorResults{ 160 Results: []params.ErrorResult{ 161 {Error: nil}, 162 }, 163 }) 164 165 s.machine.wc.AssertOneChange() 166 167 res, err := s.machine.rebootAPI.GetRebootAction(s.machine.args) 168 c.Assert(err, jc.ErrorIsNil) 169 c.Assert(res, gc.DeepEquals, params.RebootActionResults{ 170 Results: []params.RebootActionResult{ 171 {Result: params.ShouldReboot}, 172 }}) 173 174 errResult, err = s.machine.rebootAPI.ClearReboot(s.machine.args) 175 c.Assert(err, jc.ErrorIsNil) 176 c.Assert(errResult, gc.DeepEquals, params.ErrorResults{ 177 Results: []params.ErrorResult{ 178 {Error: nil}, 179 }, 180 }) 181 182 res, err = s.machine.rebootAPI.GetRebootAction(s.machine.args) 183 c.Assert(err, jc.ErrorIsNil) 184 c.Assert(res, gc.DeepEquals, params.RebootActionResults{ 185 Results: []params.RebootActionResult{ 186 {Result: params.ShouldDoNothing}, 187 }}) 188 } 189 190 func (s *rebootSuite) TestRebootRequestFromMachine(c *gc.C) { 191 // Request reboot on the root machine: all machines should see it 192 // machine should reboot 193 // container should shutdown 194 // nested container should shutdown 195 errResult, err := s.machine.rebootAPI.RequestReboot(s.machine.args) 196 c.Assert(err, jc.ErrorIsNil) 197 c.Assert(errResult, gc.DeepEquals, params.ErrorResults{ 198 Results: []params.ErrorResult{ 199 {Error: nil}, 200 }}) 201 202 s.machine.wc.AssertOneChange() 203 s.container.wc.AssertOneChange() 204 s.nestedContainer.wc.AssertOneChange() 205 206 res, err := s.machine.rebootAPI.GetRebootAction(s.machine.args) 207 c.Assert(err, jc.ErrorIsNil) 208 c.Assert(res, gc.DeepEquals, params.RebootActionResults{ 209 Results: []params.RebootActionResult{ 210 {Result: params.ShouldReboot}, 211 }}) 212 213 res, err = s.container.rebootAPI.GetRebootAction(s.container.args) 214 c.Assert(err, jc.ErrorIsNil) 215 c.Assert(res, gc.DeepEquals, params.RebootActionResults{ 216 Results: []params.RebootActionResult{ 217 {Result: params.ShouldShutdown}, 218 }}) 219 220 res, err = s.nestedContainer.rebootAPI.GetRebootAction(s.nestedContainer.args) 221 c.Assert(err, jc.ErrorIsNil) 222 c.Assert(res, gc.DeepEquals, params.RebootActionResults{ 223 Results: []params.RebootActionResult{ 224 {Result: params.ShouldShutdown}, 225 }}) 226 227 errResult, err = s.machine.rebootAPI.ClearReboot(s.machine.args) 228 c.Assert(err, jc.ErrorIsNil) 229 c.Assert(errResult, gc.DeepEquals, params.ErrorResults{ 230 Results: []params.ErrorResult{ 231 {Error: nil}, 232 }, 233 }) 234 235 s.machine.wc.AssertOneChange() 236 s.container.wc.AssertOneChange() 237 s.nestedContainer.wc.AssertOneChange() 238 } 239 240 func (s *rebootSuite) TestRebootRequestFromContainer(c *gc.C) { 241 // Request reboot on the container: container and nested container should see it 242 // machine should do nothing 243 // container should reboot 244 // nested container should shutdown 245 errResult, err := s.container.rebootAPI.RequestReboot(s.container.args) 246 c.Assert(err, jc.ErrorIsNil) 247 c.Assert(errResult, gc.DeepEquals, params.ErrorResults{ 248 Results: []params.ErrorResult{ 249 {Error: nil}, 250 }}) 251 252 s.machine.wc.AssertNoChange() 253 s.container.wc.AssertOneChange() 254 s.nestedContainer.wc.AssertOneChange() 255 256 res, err := s.machine.rebootAPI.GetRebootAction(s.machine.args) 257 c.Assert(err, jc.ErrorIsNil) 258 c.Assert(res, gc.DeepEquals, params.RebootActionResults{ 259 Results: []params.RebootActionResult{ 260 {Result: params.ShouldDoNothing}, 261 }}) 262 263 res, err = s.container.rebootAPI.GetRebootAction(s.container.args) 264 c.Assert(err, jc.ErrorIsNil) 265 c.Assert(res, gc.DeepEquals, params.RebootActionResults{ 266 Results: []params.RebootActionResult{ 267 {Result: params.ShouldReboot}, 268 }}) 269 270 res, err = s.nestedContainer.rebootAPI.GetRebootAction(s.nestedContainer.args) 271 c.Assert(err, jc.ErrorIsNil) 272 c.Assert(res, gc.DeepEquals, params.RebootActionResults{ 273 Results: []params.RebootActionResult{ 274 {Result: params.ShouldShutdown}, 275 }}) 276 277 errResult, err = s.container.rebootAPI.ClearReboot(s.container.args) 278 c.Assert(err, jc.ErrorIsNil) 279 c.Assert(errResult, gc.DeepEquals, params.ErrorResults{ 280 Results: []params.ErrorResult{ 281 {Error: nil}, 282 }, 283 }) 284 285 s.machine.wc.AssertNoChange() 286 s.container.wc.AssertOneChange() 287 s.nestedContainer.wc.AssertOneChange() 288 } 289 290 func (s *rebootSuite) TestRebootRequestFromNestedContainer(c *gc.C) { 291 // Request reboot on the container: container and nested container should see it 292 // machine should do nothing 293 // container should do nothing 294 // nested container should reboot 295 errResult, err := s.nestedContainer.rebootAPI.RequestReboot(s.nestedContainer.args) 296 c.Assert(err, jc.ErrorIsNil) 297 c.Assert(errResult, gc.DeepEquals, params.ErrorResults{ 298 Results: []params.ErrorResult{ 299 {Error: nil}, 300 }}) 301 302 s.machine.wc.AssertNoChange() 303 s.container.wc.AssertNoChange() 304 s.nestedContainer.wc.AssertOneChange() 305 306 res, err := s.machine.rebootAPI.GetRebootAction(s.machine.args) 307 c.Assert(err, jc.ErrorIsNil) 308 c.Assert(res, gc.DeepEquals, params.RebootActionResults{ 309 Results: []params.RebootActionResult{ 310 {Result: params.ShouldDoNothing}, 311 }}) 312 313 res, err = s.container.rebootAPI.GetRebootAction(s.container.args) 314 c.Assert(err, jc.ErrorIsNil) 315 c.Assert(res, gc.DeepEquals, params.RebootActionResults{ 316 Results: []params.RebootActionResult{ 317 {Result: params.ShouldDoNothing}, 318 }}) 319 320 res, err = s.nestedContainer.rebootAPI.GetRebootAction(s.nestedContainer.args) 321 c.Assert(err, jc.ErrorIsNil) 322 c.Assert(res, gc.DeepEquals, params.RebootActionResults{ 323 Results: []params.RebootActionResult{ 324 {Result: params.ShouldReboot}, 325 }}) 326 327 errResult, err = s.nestedContainer.rebootAPI.ClearReboot(s.nestedContainer.args) 328 c.Assert(err, jc.ErrorIsNil) 329 c.Assert(errResult, gc.DeepEquals, params.ErrorResults{ 330 Results: []params.ErrorResult{ 331 {Error: nil}, 332 }, 333 }) 334 335 s.machine.wc.AssertNoChange() 336 s.container.wc.AssertNoChange() 337 s.nestedContainer.wc.AssertOneChange() 338 }