diff --git a/lib/vagrant/provisioners/chef.rb b/lib/vagrant/provisioners/chef.rb index f3f53c69a..7ba763337 100644 --- a/lib/vagrant/provisioners/chef.rb +++ b/lib/vagrant/provisioners/chef.rb @@ -4,6 +4,14 @@ module Vagrant # chef-solo and chef-client provisioning are stored. This is **not an actual # provisioner**. Instead, {ChefSolo} or {ChefServer} should be used. class Chef < Base + include Util::Counter + + def initialize(env, config) + super + + config.provisioning_path ||= "/tmp/vagrant-chef-#{get_and_update_counter(:provisioning_path)}" + end + def prepare raise ChefError, :invalid_provisioner end @@ -76,8 +84,6 @@ module Vagrant class Chef < Base # This is the configuration which is available through `config.chef` class Config < Vagrant::Config::Base - extend Util::Counter - # Shared config attr_accessor :node_name attr_accessor :provisioning_path @@ -95,7 +101,7 @@ module Vagrant attr_writer :run_list def initialize - @provisioning_path = "/tmp/vagrant-chef-#{self.class.get_and_update_counter}" + @provisioning_path = nil @log_level = :info @json = {} @http_proxy = nil diff --git a/lib/vagrant/provisioners/chef_solo.rb b/lib/vagrant/provisioners/chef_solo.rb index 889361b82..27d3eb025 100644 --- a/lib/vagrant/provisioners/chef_solo.rb +++ b/lib/vagrant/provisioners/chef_solo.rb @@ -5,6 +5,7 @@ module Vagrant register :chef_solo extend Util::Counter + include Util::Counter class Config < Chef::Config attr_accessor :cookbooks_path @@ -71,7 +72,7 @@ module Vagrant remote_path = nil if type == :host # Path exists on the host, setup the remote path - remote_path = "#{config.provisioning_path}/chef-solo-#{self.class.get_and_update_counter}" + remote_path = "#{config.provisioning_path}/chef-solo-#{get_and_update_counter(:cookbooks_path)}" else # Path already exists on the virtual machine. Expand it # relative to where we're provisioning. @@ -88,7 +89,7 @@ module Vagrant def share_folders(prefix, folders) folders.each do |type, local_path, remote_path| if type == :host - env.config.vm.share_folder("v-#{prefix}-#{self.class.get_and_update_counter}", + env.config.vm.share_folder("v-#{prefix}-#{self.class.get_and_update_counter(:shared_folder)}", remote_path, local_path, :nfs => config.nfs) end end diff --git a/lib/vagrant/util/counter.rb b/lib/vagrant/util/counter.rb index 0114202ee..66c7c284f 100644 --- a/lib/vagrant/util/counter.rb +++ b/lib/vagrant/util/counter.rb @@ -5,11 +5,13 @@ module Vagrant # Atomic counter implementation. This is useful for incrementing # a counter which is guaranteed to only be used once in its class. module Counter - def get_and_update_counter + def get_and_update_counter(name=nil) + name ||= :global + mutex.synchronize do - @__counter ||= 1 - result = @__counter - @__counter += 1 + @__counter ||= Hash.new(1) + result = @__counter[name] + @__counter[name] += 1 result end end