github.com/juju/juju@v0.0.0-20240327075706-a90865de2538/worker/reboot/reboot_test.go (about) 1 // Copyright 2014 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package reboot_test 5 6 import ( 7 "sync" 8 "time" 9 10 "github.com/juju/clock" 11 jc "github.com/juju/testing/checkers" 12 "github.com/juju/utils/v3" 13 gc "gopkg.in/check.v1" 14 15 "github.com/juju/juju/api" 16 apireboot "github.com/juju/juju/api/agent/reboot" 17 "github.com/juju/juju/core/instance" 18 "github.com/juju/juju/core/machinelock" 19 jujutesting "github.com/juju/juju/juju/testing" 20 "github.com/juju/juju/state" 21 "github.com/juju/juju/worker" 22 "github.com/juju/juju/worker/reboot" 23 ) 24 25 type rebootSuite struct { 26 jujutesting.JujuConnSuite 27 28 machine *state.Machine 29 stateAPI api.Connection 30 rebootState apireboot.State 31 32 ct *state.Machine 33 ctRebootState apireboot.State 34 35 clock clock.Clock 36 } 37 38 var _ = gc.Suite(&rebootSuite{}) 39 40 func (s *rebootSuite) SetUpTest(c *gc.C) { 41 var err error 42 template := state.MachineTemplate{ 43 Base: state.DefaultLTSBase(), 44 Jobs: []state.MachineJob{state.JobHostUnits}, 45 } 46 s.JujuConnSuite.SetUpTest(c) 47 48 s.stateAPI, s.machine = s.OpenAPIAsNewMachine(c) 49 s.rebootState, err = apireboot.NewFromConnection(s.stateAPI) 50 c.Assert(err, jc.ErrorIsNil) 51 c.Assert(s.rebootState, gc.NotNil) 52 53 //Add container 54 s.ct, err = s.State.AddMachineInsideMachine(template, s.machine.Id(), instance.KVM) 55 c.Assert(err, jc.ErrorIsNil) 56 password, err := utils.RandomPassword() 57 c.Assert(err, jc.ErrorIsNil) 58 err = s.ct.SetPassword(password) 59 c.Assert(err, jc.ErrorIsNil) 60 err = s.ct.SetProvisioned("foo", "", "fake_nonce", nil) 61 c.Assert(err, jc.ErrorIsNil) 62 63 // Open api as container 64 ctState := s.OpenAPIAsMachine(c, s.ct.Tag(), password, "fake_nonce") 65 s.ctRebootState, err = apireboot.NewFromConnection(ctState) 66 c.Assert(err, jc.ErrorIsNil) 67 c.Assert(s.ctRebootState, gc.NotNil) 68 69 s.clock = &fakeClock{delay: time.Millisecond} 70 } 71 72 func (s *rebootSuite) TearDownTest(c *gc.C) { 73 s.JujuConnSuite.TearDownTest(c) 74 } 75 76 func (s *rebootSuite) TestStartStop(c *gc.C) { 77 worker, err := reboot.NewReboot(s.rebootState, s.AgentConfigForTag(c, s.machine.Tag()), &fakemachinelock{}, s.clock) 78 c.Assert(err, jc.ErrorIsNil) 79 worker.Kill() 80 c.Assert(worker.Wait(), gc.IsNil) 81 } 82 83 func (s *rebootSuite) TestWorkerCatchesRebootEvent(c *gc.C) { 84 wrk, err := reboot.NewReboot(s.rebootState, s.AgentConfigForTag(c, s.machine.Tag()), &fakemachinelock{}, s.clock) 85 c.Assert(err, jc.ErrorIsNil) 86 err = s.rebootState.RequestReboot() 87 c.Assert(err, jc.ErrorIsNil) 88 c.Assert(wrk.Wait(), gc.Equals, worker.ErrRebootMachine) 89 // The flag is cleared. 90 rFlag, err := s.machine.GetRebootFlag() 91 c.Assert(err, jc.ErrorIsNil) 92 c.Assert(rFlag, jc.IsFalse) 93 94 } 95 96 func (s *rebootSuite) TestContainerCatchesParentFlag(c *gc.C) { 97 wrk, err := reboot.NewReboot(s.ctRebootState, s.AgentConfigForTag(c, s.ct.Tag()), &fakemachinelock{}, s.clock) 98 c.Assert(err, jc.ErrorIsNil) 99 err = s.rebootState.RequestReboot() 100 c.Assert(err, jc.ErrorIsNil) 101 c.Assert(wrk.Wait(), gc.Equals, worker.ErrShutdownMachine) 102 } 103 104 type fakeClock struct { 105 clock.Clock 106 delay time.Duration 107 } 108 109 func (f *fakeClock) After(time.Duration) <-chan time.Time { 110 return time.After(f.delay) 111 } 112 113 type fakemachinelock struct { 114 mu sync.Mutex 115 } 116 117 func (f *fakemachinelock) Acquire(spec machinelock.Spec) (func(), error) { 118 f.mu.Lock() 119 return func() { 120 f.mu.Unlock() 121 }, nil 122 } 123 func (f *fakemachinelock) Report(opts ...machinelock.ReportOption) (string, error) { 124 return "", nil 125 }