Chris Roberts 4751353a5f Fetch reboot env var at run time and keep constant values constant
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.
2020-11-03 15:11:10 -08:00

54 lines
1.5 KiB
Ruby

require 'vagrant/util/guest_inspection'
require "log4r"
module VagrantPlugins
module GuestLinux
module Cap
class Reboot
extend Vagrant::Util::GuestInspection::Linux
DEFAULT_MAX_REBOOT_RETRY_DURATION = 120
WAIT_SLEEP_TIME = 5
def self.reboot(machine)
@logger = Log4r::Logger.new("vagrant::linux::reboot")
if systemd?(machine.communicate)
reboot_script = "systemctl reboot"
else
reboot_script = "reboot"
end
comm = machine.communicate
@logger.debug("Issuing reboot command for guest")
comm.sudo(reboot_script)
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 Vagrant::Errors::MachineGuestNotReady
raise if wait_remaining < 0
@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)
while !machine.guest.ready?
sleep 10
end
end
end
end
end
end