mirror of
https://github.com/vagrant-libvirt/vagrant-libvirt.git
synced 2025-02-25 18:55:27 -06:00
Updates the halt action to use the GracefulHalt builtin action.
If the GracefulHalt builtin action fails to properly transition
the state of the guest, it will use the HaltDomain action to
forcibly stop it.
399 lines
13 KiB
Ruby
399 lines
13 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'vagrant/action/builder'
|
|
require 'log4r'
|
|
|
|
module VagrantPlugins
|
|
module ProviderLibvirt
|
|
module Action
|
|
# Include the built-in & general modules so we can use them as top-level things.
|
|
include Vagrant::Action::Builtin
|
|
include Vagrant::Action::General
|
|
@logger = Log4r::Logger.new('vagrant_libvirt::action')
|
|
|
|
# remove image from Libvirt storage pool
|
|
def self.remove_libvirt_image
|
|
Vagrant::Action::Builder.new.tap do |b|
|
|
b.use RemoveLibvirtImage
|
|
end
|
|
end
|
|
|
|
# This action is called to bring the box up from nothing.
|
|
def self.action_up
|
|
Vagrant::Action::Builder.new.tap do |b|
|
|
b.use ConfigValidate
|
|
b.use BoxCheckOutdated
|
|
b.use Call, IsCreated do |env, b2|
|
|
# Create VM if not yet created.
|
|
if !env[:result]
|
|
b2.use SetNameOfDomain
|
|
if !env[:machine].config.vm.box
|
|
b2.use CreateDomain
|
|
b2.use CreateNetworks
|
|
b2.use CreateNetworkInterfaces
|
|
b2.use SetBootOrder
|
|
b2.use StartDomain
|
|
else
|
|
b2.use HandleStoragePool
|
|
b2.use HandleBox
|
|
b2.use HandleBoxImage
|
|
b2.use CreateDomainVolume
|
|
b2.use CreateDomain
|
|
|
|
b2.use Provision
|
|
b2.use PrepareNFSValidIds
|
|
b2.use SyncedFolderCleanup
|
|
b2.use SyncedFolders
|
|
b2.use PrepareNFSSettings
|
|
b2.use ShareFolders
|
|
b2.use CreateNetworks
|
|
b2.use CreateNetworkInterfaces
|
|
b2.use SetBootOrder
|
|
|
|
b2.use StartDomain
|
|
b2.use WaitTillUp
|
|
b2.use WaitForCommunicator, [:running]
|
|
|
|
b2.use ForwardPorts
|
|
b2.use SetHostname
|
|
# b2.use SyncFolders
|
|
end
|
|
else
|
|
env[:halt_on_error] = true
|
|
b2.use action_start
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
# Assuming VM is created, just start it. This action is not called
|
|
# directly by any subcommand. VM can be suspended, already running or in
|
|
# poweroff state.
|
|
def self.action_start
|
|
Vagrant::Action::Builder.new.tap do |b|
|
|
b.use ConfigValidate
|
|
b.use Call, IsRunning do |env, b2|
|
|
# If the VM is running, run the necessary provisioners
|
|
if env[:result]
|
|
b2.use action_provision
|
|
next
|
|
end
|
|
|
|
b2.use Call, IsSuspended do |env2, b3|
|
|
# if vm is suspended resume it then exit
|
|
if env2[:result]
|
|
b3.use CreateNetworks
|
|
b3.use ResumeDomain
|
|
next
|
|
end
|
|
|
|
if !env[:machine].config.vm.box
|
|
# With no box, we just care about network creation and starting it
|
|
b3.use CreateNetworks
|
|
b3.use SetBootOrder
|
|
b3.use StartDomain
|
|
else
|
|
# VM is not running or suspended.
|
|
|
|
b3.use Provision
|
|
|
|
# Ensure networks are created and active
|
|
b3.use CreateNetworks
|
|
b3.use SetBootOrder
|
|
|
|
b3.use PrepareNFSValidIds
|
|
b3.use SyncedFolderCleanup
|
|
b3.use SyncedFolders
|
|
|
|
# Start it..
|
|
b3.use StartDomain
|
|
|
|
# Machine should gain IP address when comming up,
|
|
# so wait for dhcp lease and store IP into machines data_dir.
|
|
b3.use WaitTillUp
|
|
b3.use WaitForCommunicator, [:running]
|
|
|
|
b3.use ForwardPorts
|
|
b3.use PrepareNFSSettings
|
|
b3.use ShareFolders
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
# This is the action that is primarily responsible for halting the
|
|
# virtual machine.
|
|
def self.action_halt
|
|
Vagrant::Action::Builder.new.tap do |b|
|
|
b.use ConfigValidate
|
|
b.use ClearForwardedPorts
|
|
b.use Call, IsCreated do |env, b2|
|
|
unless env[:result]
|
|
b2.use MessageNotCreated
|
|
next
|
|
end
|
|
|
|
b2.use Call, IsSuspended do |env2, b3|
|
|
b3.use CreateNetworks if env2[:result]
|
|
b3.use ResumeDomain if env2[:result]
|
|
end
|
|
|
|
b2.use Call, IsRunning do |env2, b3|
|
|
next unless env2[:result]
|
|
|
|
# VM is running, halt it.
|
|
b3.use Call, GracefulHalt, :shutoff, :running do |env3, b4|
|
|
if !env3[:result]
|
|
b4.use HaltDomain
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
# This is the action implements the reload command
|
|
# It uses the halt and start actions
|
|
def self.action_reload
|
|
Vagrant::Action::Builder.new.tap do |b|
|
|
b.use Call, IsCreated do |env, b2|
|
|
unless env[:result]
|
|
b2.use MessageNotCreated
|
|
next
|
|
end
|
|
|
|
b2.use ConfigValidate
|
|
b2.use action_halt
|
|
b2.use action_start
|
|
end
|
|
end
|
|
end
|
|
|
|
# not implemented and looks like not require
|
|
def self.action_package
|
|
Vagrant::Action::Builder.new.tap do |b|
|
|
b.use ConfigValidate
|
|
b.use Call, IsCreated do |env, b2|
|
|
unless env[:result]
|
|
b2.use MessageNotCreated
|
|
next
|
|
end
|
|
|
|
b2.use PackageSetupFolders
|
|
b2.use PackageSetupFiles
|
|
b2.use action_halt
|
|
b2.use Package
|
|
b2.use PackageDomain
|
|
end
|
|
end
|
|
end
|
|
|
|
# This is the action that is primarily responsible for completely
|
|
# freeing the resources of the underlying virtual machine.
|
|
def self.action_destroy
|
|
Vagrant::Action::Builder.new.tap do |b|
|
|
b.use ConfigValidate
|
|
b.use Call, IsCreated do |env, b2|
|
|
unless env[:result]
|
|
# Try to remove stale volumes anyway
|
|
b2.use SetNameOfDomain
|
|
b2.use RemoveStaleVolume if env[:machine].config.vm.box
|
|
b2.use CleanMachineFolder, quiet: true
|
|
b2.use MessageNotCreated unless env[:result]
|
|
|
|
next
|
|
end
|
|
|
|
b2.use Call, DestroyConfirm do |env2, b3|
|
|
if env2[:result]
|
|
b3.use ProvisionerCleanup, :before
|
|
b3.use ClearForwardedPorts
|
|
b3.use PruneNFSExports
|
|
b3.use DestroyDomain
|
|
b3.use DestroyNetworks
|
|
b3.use CleanMachineFolder
|
|
else
|
|
b3.use MessageWillNotDestroy
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
# This action is called to SSH into the machine.
|
|
def self.action_ssh
|
|
Vagrant::Action::Builder.new.tap do |b|
|
|
b.use ConfigValidate
|
|
b.use Call, IsCreated do |env, b2|
|
|
unless env[:result]
|
|
b2.use MessageNotCreated
|
|
next
|
|
end
|
|
|
|
b2.use Call, IsRunning do |env2, b3|
|
|
unless env2[:result]
|
|
b3.use MessageNotRunning
|
|
next
|
|
end
|
|
|
|
b3.use SSHExec
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
# This action is called when `vagrant provision` is called.
|
|
def self.action_provision
|
|
Vagrant::Action::Builder.new.tap do |b|
|
|
b.use ConfigValidate
|
|
b.use Call, IsCreated do |env, b2|
|
|
unless env[:result]
|
|
b2.use MessageNotCreated
|
|
next
|
|
end
|
|
|
|
b2.use Call, IsRunning do |env2, b3|
|
|
unless env2[:result]
|
|
b3.use MessageNotRunning
|
|
next
|
|
end
|
|
|
|
b3.use Provision
|
|
# b3.use SyncFolders
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
# This is the action that is primarily responsible for suspending
|
|
# the virtual machine.
|
|
def self.action_suspend
|
|
Vagrant::Action::Builder.new.tap do |b|
|
|
b.use ConfigValidate
|
|
b.use Call, IsCreated do |env, b2|
|
|
unless env[:result]
|
|
b2.use MessageNotCreated
|
|
next
|
|
end
|
|
|
|
b2.use Call, IsRunning do |env2, b3|
|
|
unless env2[:result]
|
|
b3.use MessageNotRunning
|
|
next
|
|
end
|
|
b3.use SuspendDomain
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
# This is the action that is primarily responsible for resuming
|
|
# suspended machines.
|
|
def self.action_resume
|
|
Vagrant::Action::Builder.new.tap do |b|
|
|
b.use ConfigValidate
|
|
b.use Call, IsCreated do |env, b2|
|
|
unless env[:result]
|
|
b2.use MessageNotCreated
|
|
next
|
|
end
|
|
|
|
b2.use Call, IsSuspended do |env2, b3|
|
|
unless env2[:result]
|
|
b3.use MessageNotSuspended
|
|
next
|
|
end
|
|
b3.use CreateNetworks
|
|
b3.use ResumeDomain
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
def self.action_read_mac_addresses
|
|
Vagrant::Action::Builder.new.tap do |b|
|
|
b.use ConfigValidate
|
|
b.use ReadMacAddresses
|
|
end
|
|
end
|
|
|
|
# This is the action that will run a single SSH command.
|
|
def self.action_ssh_run
|
|
Vagrant::Action::Builder.new.tap do |b|
|
|
b.use ConfigValidate
|
|
b.use Call, IsCreated do |env, b2|
|
|
unless env[:result]
|
|
b2.use MessageNotCreated
|
|
next
|
|
end
|
|
|
|
b2.use Call, IsRunning do |env2, b3|
|
|
unless env2[:result]
|
|
b3.use MessageNotRunning
|
|
next
|
|
end
|
|
|
|
b3.use SSHRun
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
action_root = Pathname.new(File.expand_path('../action', __FILE__))
|
|
autoload :PackageDomain, action_root.join('package_domain')
|
|
autoload :CreateDomain, action_root.join('create_domain')
|
|
autoload :CreateDomainVolume, action_root.join('create_domain_volume')
|
|
autoload :CreateNetworkInterfaces, action_root.join('create_network_interfaces')
|
|
autoload :CreateNetworks, action_root.join('create_networks')
|
|
autoload :CleanMachineFolder, action_root.join('clean_machine_folder')
|
|
autoload :DestroyDomain, action_root.join('destroy_domain')
|
|
autoload :DestroyNetworks, action_root.join('destroy_networks')
|
|
autoload :ForwardPorts, action_root.join('forward_ports')
|
|
autoload :ClearForwardedPorts, action_root.join('forward_ports')
|
|
autoload :HaltDomain, action_root.join('halt_domain')
|
|
autoload :HandleBoxImage, action_root.join('handle_box_image')
|
|
autoload :HandleStoragePool, action_root.join('handle_storage_pool')
|
|
autoload :RemoveLibvirtImage, action_root.join('remove_libvirt_image')
|
|
autoload :IsCreated, action_root.join('is_created')
|
|
autoload :IsRunning, action_root.join('is_running')
|
|
autoload :IsSuspended, action_root.join('is_suspended')
|
|
autoload :MessageAlreadyCreated, action_root.join('message_already_created')
|
|
autoload :MessageNotCreated, action_root.join('message_not_created')
|
|
autoload :MessageNotRunning, action_root.join('message_not_running')
|
|
autoload :MessageNotSuspended, action_root.join('message_not_suspended')
|
|
autoload :MessageWillNotDestroy, action_root.join('message_will_not_destroy')
|
|
|
|
autoload :RemoveStaleVolume, action_root.join('remove_stale_volume')
|
|
|
|
autoload :PrepareNFSSettings, action_root.join('prepare_nfs_settings')
|
|
autoload :PrepareNFSValidIds, action_root.join('prepare_nfs_valid_ids')
|
|
autoload :PruneNFSExports, action_root.join('prune_nfs_exports')
|
|
|
|
autoload :ReadMacAddresses, action_root.join('read_mac_addresses')
|
|
autoload :ResumeDomain, action_root.join('resume_domain')
|
|
autoload :SetNameOfDomain, action_root.join('set_name_of_domain')
|
|
autoload :SetBootOrder, action_root.join('set_boot_order')
|
|
|
|
# I don't think we need it anymore
|
|
autoload :ShareFolders, action_root.join('share_folders')
|
|
autoload :StartDomain, action_root.join('start_domain')
|
|
autoload :SuspendDomain, action_root.join('suspend_domain')
|
|
autoload :TimedProvision, action_root.join('timed_provision')
|
|
|
|
autoload :WaitTillUp, action_root.join('wait_till_up')
|
|
autoload :PrepareNFSValidIds, action_root.join('prepare_nfs_valid_ids')
|
|
|
|
autoload :Package, 'vagrant/action/general/package'
|
|
autoload :PackageSetupFiles, 'vagrant/action/general/package_setup_files'
|
|
autoload :PackageSetupFolders, 'vagrant/action/general/package_setup_folders'
|
|
autoload :SSHRun, 'vagrant/action/builtin/ssh_run'
|
|
autoload :HandleBox, 'vagrant/action/builtin/handle_box'
|
|
autoload :SyncedFolders, 'vagrant/action/builtin/synced_folders'
|
|
autoload :SyncedFolderCleanup, 'vagrant/action/builtin/synced_folder_cleanup'
|
|
autoload :ProvisionerCleanup, 'vagrant/action/builtin/provisioner_cleanup'
|
|
autoload :WaitForCommunicator, 'vagrant/action/builtin/wait_for_communicator'
|
|
end
|
|
end
|
|
end
|