diff --git a/lib/vagrant-openstack-provider/action.rb b/lib/vagrant-openstack-provider/action.rb index 684b2a5..ce55cec 100644 --- a/lib/vagrant-openstack-provider/action.rb +++ b/lib/vagrant-openstack-provider/action.rb @@ -33,7 +33,7 @@ def self.action_provision if env[:machine_state_id] == :not_created b2.use Message, I18n.t('vagrant_openstack.not_created') else - b2.use Provision + b2.use ProvisionWrapper b2.use SyncFolders end end @@ -99,7 +99,7 @@ def self.action_up case env[:machine_state_id] when :not_created ssh_disabled = env[:machine].provider_config.ssh_disabled - b2.use Provision unless ssh_disabled + b2.use ProvisionWrapper unless ssh_disabled b2.use SyncFolders b2.use CreateStack b2.use CreateServer @@ -212,6 +212,7 @@ def self.action_reload autoload :SyncFolders, action_root.join('sync_folders') autoload :Suspend, action_root.join('suspend') autoload :Resume, action_root.join('resume') + autoload :ProvisionWrapper, action_root.join('provision') autoload :WaitForServerToStop, action_root.join('wait_stop') autoload :WaitForServerToBeActive, action_root.join('wait_active') autoload :WaitForServerToBeAccessible, action_root.join('wait_accessible') diff --git a/lib/vagrant-openstack-provider/action/provision.rb b/lib/vagrant-openstack-provider/action/provision.rb new file mode 100644 index 0000000..fc65a4e --- /dev/null +++ b/lib/vagrant-openstack-provider/action/provision.rb @@ -0,0 +1,60 @@ +require 'log4r' + +require 'vagrant/action/builder' + +require 'vagrant-openstack-provider/action/abstract_action' +require 'vagrant-openstack-provider/action/read_ssh_info' + +module VagrantPlugins + module Openstack + module Action + include Vagrant::Action::Builtin + + class ProvisionWrapper < AbstractAction + def initialize(app, env) + @app = app + @env = env + @logger = Log4r::Logger.new('vagrant_openstack::action::provision_wrapper') + end + + def execute(env) + @logger.info 'Run provisioning' + InternalProvisionWrapper.new(@app, @env).call(@env) + @app.call(env) + end + end + + class InternalProvisionWrapper < Vagrant::Action::Builtin::Provision + def initialize(app, env) + @logger = Log4r::Logger.new('vagrant_openstack::action::internal_provision_wrapper') + super app, env + end + + def run_provisioner(env) + if env[:provisioner].class == VagrantPlugins::Shell::Provisioner + handle_shell_meta_args(env) + end + env[:provisioner].provision + end + + private + + def handle_shell_meta_args(env) + config = env[:provisioner].config + args = config.args.nil? ? [] : [config.args].flatten + config.args = [] + @logger.info "Shell provisioner args: #{args}" + args.each do |arg| + if '@@ssh_ip@@'.eql? arg + ssh_info = VagrantPlugins::Openstack::Action.get_ssh_info(env) + @logger.info "Replace meta-arg #{arg} by value #{ssh_info[:host]}" + config.args << ssh_info[:host] + else + config.args << arg + end + end + end + end + end + end +end diff --git a/lib/vagrant-openstack-provider/action/read_ssh_info.rb b/lib/vagrant-openstack-provider/action/read_ssh_info.rb index 3b7cbc9..67a29ac 100644 --- a/lib/vagrant-openstack-provider/action/read_ssh_info.rb +++ b/lib/vagrant-openstack-provider/action/read_ssh_info.rb @@ -63,6 +63,10 @@ def initialize @ssh_info = {} end end + + def self.get_ssh_info(env) + SSHInfoHolder.instance.ssh_info[env[:machine].id.to_sym] + end end end end