mirror of
https://github.com/vagrant-libvirt/vagrant-libvirt.git
synced 2025-02-25 18:55:27 -06:00
Consolidate actions around starting the VM into a single place, and re-order the call to the CreateNetworkInterfaces to allow it to be used during initial bring up without needing to duplicate the remaining start actions in the up process.
386 lines
13 KiB
Ruby
386 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 action_start
|
|
else
|
|
b2.use HandleStoragePool
|
|
b2.use HandleBox
|
|
b2.use HandleBoxImage
|
|
b2.use CreateDomainVolume
|
|
b2.use CreateDomain
|
|
b2.use CreateNetworks
|
|
b2.use CreateNetworkInterfaces
|
|
|
|
b2.use action_start
|
|
|
|
b2.use SetHostname
|
|
end
|
|
else
|
|
env[:halt_on_error] = true
|
|
b2.use CreateNetworks
|
|
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 ResumeDomain
|
|
next
|
|
end
|
|
|
|
if !env[:machine].config.vm.box
|
|
# With no box, we just care about network creation and starting it
|
|
b3.use SetBootOrder
|
|
b3.use StartDomain
|
|
else
|
|
# VM is not running or suspended.
|
|
b3.use Provision
|
|
|
|
b3.use PrepareNFSValidIds
|
|
b3.use SyncedFolderCleanup
|
|
b3.use SyncedFolders
|
|
b3.use PrepareNFSSettings
|
|
b3.use ShareFolders
|
|
|
|
b3.use SetBootOrder
|
|
|
|
# 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
|
|
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
|
|
|
|
# only perform shutdown if VM is running
|
|
b2.use Call, IsRunning do |env2, b3|
|
|
next unless env2[:result]
|
|
|
|
b3.use StartShutdownTimer
|
|
b3.use Call, GracefulHalt, :shutoff, :running do |env3, b4|
|
|
if !env3[:result]
|
|
b4.use Call, ShutdownDomain, :shutoff, :running do |env4, b5|
|
|
if !env4[:result]
|
|
b5.use HaltDomain
|
|
end
|
|
end
|
|
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]
|
|
raise Vagrant::Errors::VMNotCreatedError
|
|
end
|
|
|
|
b2.use Call, IsRunning do |env2, b3|
|
|
unless env2[:result]
|
|
raise Vagrant::Errors::VMNotRunningError
|
|
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
|
|
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]
|
|
raise Vagrant::Errors::VMNotCreatedError
|
|
end
|
|
|
|
b2.use Call, IsRunning do |env2, b3|
|
|
unless env2[:result]
|
|
raise Vagrant::Errors::VMNotRunningError
|
|
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 :StartShutdownTimer, action_root.join('shutdown_domain')
|
|
autoload :ShutdownDomain, action_root.join('shutdown_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
|