Keep the default duration as a constant and fetch the custom environment variable at run time with a fallback to the default. Set the sleep duration into a constant and add tests covering the expected behaviors when the default duration is in use as well as the override value. Also match the environment variable up with the constant just for consistency.
61 lines
2.1 KiB
Ruby
61 lines
2.1 KiB
Ruby
require "log4r"
|
|
|
|
module VagrantPlugins
|
|
module GuestWindows
|
|
module Cap
|
|
class Reboot
|
|
DEFAULT_MAX_REBOOT_RETRY_DURATION = 120
|
|
WAIT_SLEEP_TIME = 5
|
|
|
|
def self.reboot(machine)
|
|
@logger = Log4r::Logger.new("vagrant::windows::reboot")
|
|
reboot_script = "shutdown /r /t 5 /f /d p:4:1 /c \"Vagrant Reboot Computer\""
|
|
|
|
comm = machine.communicate
|
|
|
|
script = File.expand_path("../../scripts/reboot_detect.ps1", __FILE__)
|
|
script = File.read(script)
|
|
if comm.test(script, error_check: false, shell: :powershell)
|
|
@logger.debug("Issuing reboot command for guest")
|
|
comm.execute(reboot_script, shell: :powershell)
|
|
else
|
|
@logger.debug("A reboot is already in progress")
|
|
end
|
|
|
|
machine.ui.info(I18n.t("vagrant.guests.capabilities.rebooting"))
|
|
|
|
@logger.debug("Waiting for machine to finish rebooting")
|
|
|
|
wait_remaining = ENV.fetch("VAGRANT_MAX_REBOOT_RETRY_DURATION",
|
|
DEFAULT_MAX_REBOOT_RETRY_DURATION).to_i
|
|
wait_remaining = DEFAULT_MAX_REBOOT_RETRY_DURATION if wait_remaining < 1
|
|
|
|
begin
|
|
wait_for_reboot(machine)
|
|
rescue => err
|
|
raise if wait_remaining < 0
|
|
@logger.debug("Exception caught while waiting for reboot: #{err}")
|
|
@logger.warn("Machine not ready, cannot start reboot yet. Trying again")
|
|
sleep(WAIT_SLEEP_TIME)
|
|
wait_remaining -= WAIT_SLEEP_TIME
|
|
retry
|
|
end
|
|
end
|
|
|
|
def self.wait_for_reboot(machine)
|
|
script = File.expand_path("../../scripts/reboot_detect.ps1", __FILE__)
|
|
script = File.read(script)
|
|
|
|
while machine.guest.ready? && machine.communicate.execute(script, error_check: false, shell: :powershell) != 0
|
|
sleep 10
|
|
end
|
|
|
|
# This re-establishes our symbolic links if they were
|
|
# created between now and a reboot
|
|
machine.communicate.execute("net use", error_check: false, shell: :powershell)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|