diff --git a/CHANGELOG.md b/CHANGELOG.md index 9ff8b9b71..128c0ac57 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,8 @@ `ssh_config` output. [GH-105] - Chef JSON can now be set with `chef.json =` instead of the old `merge` technique. [GH-314] + - Provisioner configuration is no longer cleared when the box + needs to be downloaded during an `up`. [GH-308] ## 0.7.6 (July 2, 2011) diff --git a/lib/vagrant/action/vm/provision.rb b/lib/vagrant/action/vm/provision.rb index 8de288d8c..fb818c033 100644 --- a/lib/vagrant/action/vm/provision.rb +++ b/lib/vagrant/action/vm/provision.rb @@ -8,31 +8,22 @@ module Vagrant @app = app @env = env @env["provision.enabled"] = true if !@env.has_key?("provision.enabled") - @provisioners = [] - - load_provisioners if provisioning_enabled? end def call(env) @app.call(env) - @provisioners.each do |instance| + enabled_provisioners.each do |instance| @env.ui.info I18n.t("vagrant.actions.vm.provision.beginning", :provisioner => instance.class) instance.provision! end end - def provisioning_enabled? - !@env["config"].vm.provisioners.empty? && @env["provision.enabled"] - end - - def load_provisioners - @env["config"].vm.provisioners.each do |provisioner| - @env.ui.info I18n.t("vagrant.actions.vm.provision.enabled", :provisioner => provisioner.shortcut) - + def enabled_provisioners + @env["config"].vm.provisioners.map do |provisioner| instance = provisioner.provisioner.new(@env, provisioner.config) instance.prepare - @provisioners << instance + instance end end end diff --git a/templates/locales/en.yml b/templates/locales/en.yml index 0df478d4e..208faf51c 100644 --- a/templates/locales/en.yml +++ b/templates/locales/en.yml @@ -395,7 +395,6 @@ en: persisting: "Persisting the VM UUID (%{uuid})..." provision: beginning: "Running provisioner: %{provisioner}..." - enabled: "Provisioning enabled with %{provisioner}..." resume: resuming: Resuming suspended VM... share_folders: diff --git a/test/vagrant/action/vm/provision_test.rb b/test/vagrant/action/vm/provision_test.rb index 9df61fc53..d5e6d8664 100644 --- a/test/vagrant/action/vm/provision_test.rb +++ b/test/vagrant/action/vm/provision_test.rb @@ -15,29 +15,6 @@ class ProvisionVMActionTest < Test::Unit::TestCase @vm.stubs(:vm).returns(@internal_vm) end - context "initializing" do - setup do - @klass.any_instance.stubs(:load_provisioners) - end - - should "load provisioner if provisioning enabled" do - @env["config"].vm.provision :chef_solo - @klass.any_instance.expects(:load_provisioners).once - @klass.new(@app, @env) - end - - should "not load provisioner if disabled" do - @klass.any_instance.expects(:load_provisioners).never - @klass.new(@app, @env) - end - - should "not load provisioner if disabled through env hash" do - @env["provision.enabled"] = false - @klass.any_instance.expects(:load_provisioners).never - @klass.new(@app, @env) - end - end - context "with an instance" do setup do # Set provisioner to nil so the provisioner isn't loaded on init @@ -53,9 +30,9 @@ class ProvisionVMActionTest < Test::Unit::TestCase should "instantiate and prepare each provisioner" do @env["config"].vm.provision :chef_solo @env["config"].vm.provision :chef_solo - @instance.load_provisioners + provisioners = @instance.enabled_provisioners - assert_equal 2, @instance.provisioners.length + assert_equal 2, provisioners.length end should "set the config for each provisioner" do @@ -63,9 +40,9 @@ class ProvisionVMActionTest < Test::Unit::TestCase chef.cookbooks_path = "foo" end - @instance.load_provisioners + provisioners = @instance.enabled_provisioners - assert_equal "foo", @instance.provisioners.first.config.cookbooks_path + assert_equal "foo", provisioners.first.config.cookbooks_path end end @@ -73,13 +50,14 @@ class ProvisionVMActionTest < Test::Unit::TestCase setup do Vagrant::Provisioners::ChefSolo.any_instance.stubs(:prepare) @env["config"].vm.provision :chef_solo - @instance.load_provisioners end should "provision and continue chain" do + provisioners = [mock("one"), mock("two")] seq = sequence("seq") @app.expects(:call).with(@env).in_sequence(seq) - @instance.provisioners.each do |prov| + @instance.stubs(:enabled_provisioners).returns(provisioners) + provisioners.each do |prov| prov.expects(:provision!).in_sequence(seq) end