diff --git a/lib/vagrant/action/vm/provision.rb b/lib/vagrant/action/vm/provision.rb index 1d711646e..09b10f269 100644 --- a/lib/vagrant/action/vm/provision.rb +++ b/lib/vagrant/action/vm/provision.rb @@ -9,11 +9,16 @@ module Vagrant end def call(env) + # Instantiate and prepare the provisioners. Preparation must happen here + # so that shared folders and such can properly take effect. + provisioners = enabled_provisioners + provisioners.map { |p| p.prepare } + @app.call(env) - enabled_provisioners.each do |instance| + # Take prepared provisioners and run the provisioning + provisioners.each do |instance| @env.ui.info I18n.t("vagrant.actions.vm.provision.beginning", :provisioner => instance.class) - instance.prepare instance.provision! end end diff --git a/test/vagrant/action/vm/provision_test.rb b/test/vagrant/action/vm/provision_test.rb index b9dfcf7f8..446160500 100644 --- a/test/vagrant/action/vm/provision_test.rb +++ b/test/vagrant/action/vm/provision_test.rb @@ -46,10 +46,15 @@ class ProvisionVMActionTest < Test::Unit::TestCase should "provision and continue chain" do provisioners = [mock("one"), mock("two")] seq = sequence("seq") - @app.expects(:call).with(@env).in_sequence(seq) @instance.stubs(:enabled_provisioners).returns(provisioners) + provisioners.each do |prov| prov.expects(:prepare).in_sequence(seq) + end + + @app.expects(:call).with(@env).in_sequence(seq) + + provisioners.each do |prov| prov.expects(:provision!).in_sequence(seq) end