lib/vagrant-cloudstack/action.rb
require "pathname"
require "vagrant/action/builder"
module VagrantPlugins
module Cloudstack
module Action
# Include the built-in modules so we can use them as top-level things.
include Vagrant::Action::Builtin
# This action is called to halt the remote machine.
def self.action_halt
Vagrant::Action::Builder.new.tap do |b|
b.use ConfigValidate
b.use Call, IsCreated do |env, b2|
if !env[:result]
b2.use MessageNotCreated
next
end
b2.use ConnectCloudstack
b2.use StopInstance
end
end
end
# This action is called to terminate the remote machine.
def self.action_destroy
Vagrant::Action::Builder.new.tap do |b|
b.use Call, DestroyConfirm do |env, b2|
if env[:result]
b2.use ConfigValidate
b.use Call, IsCreated do |env2, b3|
if !env2[:result]
b3.use MessageNotCreated
next
end
end
b2.use ConnectCloudstack
b2.use TerminateInstance
else
b2.use MessageWillNotDestroy
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|
if !env[:result]
b2.use MessageNotCreated
next
end
b2.use Provision
b2.use SyncedFolders
end
end
end
# This action is called to read the WinRM info of the machine. The
# resulting state is expected to be put into the `:machine_winrm_info`
# key.
def self.action_read_rdp_info
Vagrant::Action::Builder.new.tap do |b|
b.use ConfigValidate
b.use ConnectCloudstack
b.use ReadRdpInfo
end
end
# This action is called to read the WinRM info of the machine. The
# resulting state is expected to be put into the `:machine_winrm_info`
# key.
def self.action_read_winrm_info
Vagrant::Action::Builder.new.tap do |b|
b.use ConfigValidate
b.use ConnectCloudstack
b.use ReadWinrmInfo
end
end
# This action is called to read the SSH info of the machine. The
# resulting state is expected to be put into the `:machine_ssh_info`
# key.
def self.action_read_ssh_info
Vagrant::Action::Builder.new.tap do |b|
b.use ConfigValidate
b.use ConnectCloudstack
b.use ReadSSHInfo
end
end
# This action is called to read the state of the machine. The
# resulting state is expected to be put into the `:machine_state_id`
# key.
def self.action_read_state
Vagrant::Action::Builder.new.tap do |b|
b.use ConfigValidate
b.use ConnectCloudstack
b.use ReadState
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|
if !env[:result]
b2.use MessageNotCreated
next
end
b2.use SSHExec
end
end
end
def self.action_ssh_run
Vagrant::Action::Builder.new.tap do |b|
b.use ConfigValidate
b.use Call, IsCreated do |env, b2|
if !env[:result]
b2.use MessageNotCreated
next
end
b2.use SSHRun
end
end
end
def self.action_prepare_boot
Vagrant::Action::Builder.new.tap do |b|
b.use Provision
b.use SyncedFolders
b.use WarnNetworks
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 ConnectCloudstack
b.use Call, IsCreated do |env1, b1|
if env1[:result]
b1.use Call, IsStopped do |env2, b2|
if env2[:result]
b2.use action_prepare_boot
b2.use StartInstance # restart this instance
else
b2.use MessageAlreadyCreated # TODO write a better message
end
end
else
b1.use action_prepare_boot
b1.use RunInstance # launch a new instance
end
end
end
end
def self.action_reload
Vagrant::Action::Builder.new.tap do |b|
b.use ConfigValidate
b.use ConnectCloudstack
b.use Call, IsCreated do |env, b2|
if !env[:result]
b2.use MessageNotCreated
next
end
b2.use action_halt
b2.use Call, WaitForState, :stopped, 120 do |env2, b3|
if env2[:result]
b3.use action_up
else
# TODO we couldn't reach :stopped, what now?
end
end
end
end
end
# The autoload farm
action_root = Pathname.new(File.expand_path("../action", __FILE__))
autoload :ConnectCloudstack, action_root.join("connect_cloudstack")
autoload :IsCreated, action_root.join("is_created")
autoload :IsStopped, action_root.join("is_stopped")
autoload :MessageAlreadyCreated, action_root.join("message_already_created")
autoload :MessageNotCreated, action_root.join("message_not_created")
autoload :MessageWillNotDestroy, action_root.join("message_will_not_destroy")
autoload :ReadSSHInfo, action_root.join("read_ssh_info")
autoload :ReadWinrmInfo, action_root.join("read_winrm_info")
autoload :ReadRdpInfo, action_root.join("read_rdp_info")
autoload :ReadState, action_root.join("read_state")
autoload :RunInstance, action_root.join("run_instance")
autoload :StartInstance, action_root.join("start_instance")
autoload :StopInstance, action_root.join("stop_instance")
autoload :TimedProvision, action_root.join("timed_provision")
autoload :WaitForState, action_root.join("wait_for_state")
autoload :WarnNetworks, action_root.join("warn_networks")
autoload :TerminateInstance, action_root.join("terminate_instance")
end
end
end