vagrant 0.7.8 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. data/CHANGELOG.md +39 -0
  2. data/Gemfile +1 -7
  3. data/Rakefile +0 -11
  4. data/bin/vagrant +4 -0
  5. data/config/default.rb +1 -2
  6. data/lib/vagrant.rb +7 -5
  7. data/lib/vagrant/action.rb +5 -1
  8. data/lib/vagrant/action/builtin.rb +4 -1
  9. data/lib/vagrant/action/general/package.rb +6 -2
  10. data/lib/vagrant/action/vm.rb +2 -0
  11. data/lib/vagrant/action/vm/clear_forwarded_ports.rb +9 -22
  12. data/lib/vagrant/action/vm/clear_shared_folders.rb +9 -14
  13. data/lib/vagrant/action/vm/customize.rb +9 -4
  14. data/lib/vagrant/action/vm/forward_ports.rb +10 -11
  15. data/lib/vagrant/action/vm/match_mac_address.rb +8 -3
  16. data/lib/vagrant/action/vm/modify.rb +37 -0
  17. data/lib/vagrant/action/vm/network.rb +9 -2
  18. data/lib/vagrant/action/vm/provision.rb +10 -17
  19. data/lib/vagrant/action/vm/provisioner_cleanup.rb +26 -0
  20. data/lib/vagrant/action/vm/share_folders.rb +16 -8
  21. data/lib/vagrant/action/warden.rb +8 -2
  22. data/lib/vagrant/command/ssh.rb +4 -4
  23. data/lib/vagrant/command/ssh_config.rb +4 -2
  24. data/lib/vagrant/config/ssh.rb +3 -0
  25. data/lib/vagrant/config/vm.rb +16 -12
  26. data/lib/vagrant/downloaders/http.rb +2 -0
  27. data/lib/vagrant/environment.rb +136 -12
  28. data/lib/vagrant/errors.rb +15 -0
  29. data/lib/vagrant/provisioners.rb +1 -1
  30. data/lib/vagrant/provisioners/base.rb +4 -0
  31. data/lib/vagrant/provisioners/chef.rb +13 -11
  32. data/lib/vagrant/provisioners/{chef_server.rb → chef_client.rb} +5 -5
  33. data/lib/vagrant/provisioners/chef_solo.rb +48 -89
  34. data/lib/vagrant/provisioners/shell.rb +47 -12
  35. data/lib/vagrant/ssh.rb +61 -27
  36. data/lib/vagrant/systems.rb +1 -0
  37. data/lib/vagrant/systems/base.rb +1 -1
  38. data/lib/vagrant/systems/linux.rb +7 -9
  39. data/lib/vagrant/systems/redhat.rb +12 -4
  40. data/lib/vagrant/systems/solaris.rb +9 -4
  41. data/lib/vagrant/systems/suse.rb +9 -0
  42. data/lib/vagrant/ui.rb +12 -5
  43. data/lib/vagrant/util.rb +2 -2
  44. data/lib/vagrant/util/counter.rb +22 -0
  45. data/lib/vagrant/util/platform.rb +1 -2
  46. data/lib/vagrant/util/safe_exec.rb +28 -0
  47. data/lib/vagrant/version.rb +1 -1
  48. data/lib/vagrant/vm.rb +2 -0
  49. data/templates/chef_solo_solo.erb +4 -4
  50. data/templates/commands/init/Vagrantfile.erb +4 -0
  51. data/templates/locales/en.yml +31 -8
  52. data/templates/ssh_config.erb +6 -0
  53. data/test/test_helper.rb +5 -3
  54. data/test/vagrant/action/builder_test.rb +4 -0
  55. data/test/vagrant/action/vm/clear_forwarded_ports_test.rb +18 -38
  56. data/test/vagrant/action/vm/clear_shared_folders_test.rb +7 -16
  57. data/test/vagrant/action/vm/customize_test.rb +12 -5
  58. data/test/vagrant/action/vm/forward_ports_test.rb +12 -7
  59. data/test/vagrant/action/vm/match_mac_address_test.rb +5 -1
  60. data/test/vagrant/action/vm/modify_test.rb +38 -0
  61. data/test/vagrant/action/vm/provision_test.rb +13 -38
  62. data/test/vagrant/action/vm/provisioner_cleanup_test.rb +56 -0
  63. data/test/vagrant/action/vm/share_folders_test.rb +10 -5
  64. data/test/vagrant/action/warden_test.rb +13 -7
  65. data/test/vagrant/config/vm_test.rb +0 -22
  66. data/test/vagrant/downloaders/http_test.rb +2 -0
  67. data/test/vagrant/environment_test.rb +110 -20
  68. data/test/vagrant/provisioners/{chef_server_test.rb → chef_client_test.rb} +2 -2
  69. data/test/vagrant/provisioners/chef_solo_test.rb +16 -173
  70. data/test/vagrant/ssh_test.rb +8 -43
  71. data/test/vagrant/systems/linux_test.rb +9 -19
  72. data/test/vagrant/util/counter_test.rb +29 -0
  73. data/test/vagrant/util/platform_test.rb +2 -2
  74. data/vagrant.gemspec +1 -2
  75. metadata +114 -84
  76. data/lib/vagrant/util/plain_logger.rb +0 -25
  77. data/lib/vagrant/util/resource_logger.rb +0 -63
  78. data/test/vagrant/util/plain_logger_test.rb +0 -17
  79. data/test/vagrant/util/resource_logger_test.rb +0 -78
@@ -2,37 +2,30 @@ module Vagrant
2
2
  class Action
3
3
  module VM
4
4
  class Provision
5
- attr_reader :provisioners
6
-
7
5
  def initialize(app, env)
8
6
  @app = app
9
7
  @env = env
10
8
  @env["provision.enabled"] = true if !@env.has_key?("provision.enabled")
11
- @provisioners = []
12
-
13
- load_provisioners if provisioning_enabled?
14
9
  end
15
10
 
16
11
  def call(env)
12
+ # Instantiate and prepare the provisioners. Preparation must happen here
13
+ # so that shared folders and such can properly take effect.
14
+ provisioners = enabled_provisioners
15
+ provisioners.map { |p| p.prepare }
16
+
17
17
  @app.call(env)
18
18
 
19
- @provisioners.each do |instance|
19
+ # Take prepared provisioners and run the provisioning
20
+ provisioners.each do |instance|
20
21
  @env.ui.info I18n.t("vagrant.actions.vm.provision.beginning", :provisioner => instance.class)
21
22
  instance.provision!
22
23
  end
23
24
  end
24
25
 
25
- def provisioning_enabled?
26
- !@env["config"].vm.provisioners.empty? && @env["provision.enabled"]
27
- end
28
-
29
- def load_provisioners
30
- @env["config"].vm.provisioners.each do |provisioner|
31
- @env.ui.info I18n.t("vagrant.actions.vm.provision.enabled", :provisioner => provisioner.shortcut)
32
-
33
- instance = provisioner.provisioner.new(@env, provisioner.config)
34
- instance.prepare
35
- @provisioners << instance
26
+ def enabled_provisioners
27
+ @env["config"].vm.provisioners.map do |provisioner|
28
+ provisioner.provisioner.new(@env, provisioner.config)
36
29
  end
37
30
  end
38
31
  end
@@ -0,0 +1,26 @@
1
+ module Vagrant
2
+ class Action
3
+ module VM
4
+ class ProvisionerCleanup
5
+ def initialize(app, env)
6
+ @app = app
7
+ @env = env
8
+ end
9
+
10
+ def call(env)
11
+ enabled_provisioners.each do |instance|
12
+ instance.cleanup
13
+ end
14
+
15
+ @app.call(env)
16
+ end
17
+
18
+ def enabled_provisioners
19
+ @env["config"].vm.provisioners.map do |provisioner|
20
+ provisioner.provisioner.new(@env, provisioner.config)
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -33,16 +33,18 @@ module Vagrant
33
33
  end
34
34
 
35
35
  def create_metadata
36
- @env.ui.info I18n.t("vagrant.actions.vm.share_folders.creating")
36
+ proc = lambda do |vm|
37
+ @env.ui.info I18n.t("vagrant.actions.vm.share_folders.creating")
37
38
 
38
- shared_folders.each do |name, data|
39
- folder = VirtualBox::SharedFolder.new
40
- folder.name = name
41
- folder.host_path = File.expand_path(data[:hostpath], @env.env.root_path)
42
- @env["vm"].vm.shared_folders << folder
39
+ shared_folders.each do |name, data|
40
+ folder = VirtualBox::SharedFolder.new
41
+ folder.name = name
42
+ folder.host_path = File.expand_path(data[:hostpath], @env.env.root_path)
43
+ vm.shared_folders << folder
44
+ end
43
45
  end
44
46
 
45
- @env["vm"].vm.save
47
+ @env["vm.modify"].call(proc)
46
48
  end
47
49
 
48
50
  def mount_shared_folders
@@ -55,7 +57,13 @@ module Vagrant
55
57
  @env.ui.info(I18n.t("vagrant.actions.vm.share_folders.mounting_entry",
56
58
  :name => name,
57
59
  :guest_path => data[:guestpath]))
58
- @env["vm"].system.mount_shared_folder(ssh, name, data[:guestpath])
60
+
61
+ # Calculate the owner and group
62
+ owner = data[:owner] || @env["config"].ssh.username
63
+ group = data[:group] || @env["config"].ssh.username
64
+
65
+ # Mount the actual folder
66
+ @env["vm"].system.mount_shared_folder(ssh, name, data[:guestpath], owner, group)
59
67
  else
60
68
  # If no guest path is specified, then automounting is disabled
61
69
  @env.ui.info(I18n.t("vagrant.actions.vm.share_folders.nomount_entry",
@@ -25,13 +25,16 @@ module Vagrant
25
25
  # Call the next middleware in the sequence, appending to the stack
26
26
  # of "recoverable" middlewares in case something goes wrong!
27
27
  raise Errors::VagrantInterrupt if env.interrupted?
28
- @stack.unshift(@actions.shift).first.call(env)
28
+ action = @actions.shift
29
+ env["logger"].info("warden") { "Calling action: #{action}" }
30
+ @stack.unshift(action).first.call(env)
29
31
  raise Errors::VagrantInterrupt if env.interrupted?
30
32
  rescue SystemExit
31
33
  # This means that an "exit" or "abort" was called. In these cases,
32
34
  # we just exit immediately.
33
35
  raise
34
36
  rescue Exception => e
37
+ env["logger"].info("warden") { "Error occurred: #{e}" }
35
38
  env["vagrant.error"] = e
36
39
 
37
40
  # Something went horribly wrong. Start the rescue chain then
@@ -46,7 +49,10 @@ module Vagrant
46
49
  # which has already run, in reverse order.
47
50
  def begin_rescue(env)
48
51
  @stack.each do |act|
49
- act.recover(env) if act.respond_to?(:recover)
52
+ if act.respond_to?(:recover)
53
+ env["logger"].info("warden") { "Calling recover: #{act}" }
54
+ act.recover(env)
55
+ end
50
56
  end
51
57
 
52
58
  # Clear stack so that warden down the middleware chain doesn't
@@ -1,11 +1,11 @@
1
1
  module Vagrant
2
2
  module Command
3
3
  class SSHCommand < NamedBase
4
- class_option :execute, :type => :string, :default => false, :aliases => "-e"
4
+ class_option :command, :type => :string, :default => false, :aliases => "-c"
5
5
  register "ssh", "SSH into the currently running Vagrant environment."
6
6
 
7
7
  def execute
8
- if options[:execute]
8
+ if options[:command]
9
9
  ssh_execute
10
10
  else
11
11
  ssh_connect
@@ -16,8 +16,8 @@ module Vagrant
16
16
 
17
17
  def ssh_execute
18
18
  ssh_vm.ssh.execute do |ssh|
19
- ssh_vm.env.ui.info I18n.t("vagrant.commands.ssh.execute", :command => options[:execute])
20
- ssh.exec!(options[:execute]) do |channel, type, data|
19
+ ssh_vm.env.ui.info I18n.t("vagrant.commands.ssh.command", :command => options[:command])
20
+ ssh.exec!(options[:command]) do |channel, type, data|
21
21
  ssh_vm.env.ui.info "#{data}"
22
22
  end
23
23
  end
@@ -14,11 +14,13 @@ module Vagrant
14
14
  vm.ssh.check_key_permissions(vm.env.config.ssh.private_key_path)
15
15
 
16
16
  $stdout.puts(Util::TemplateRenderer.render("ssh_config", {
17
- :host_key => options[:host] || "vagrant",
17
+ :host_key => options[:host] || vm.name || "vagrant",
18
18
  :ssh_host => vm.env.config.ssh.host,
19
19
  :ssh_user => vm.env.config.ssh.username,
20
20
  :ssh_port => vm.ssh.port,
21
- :private_key_path => vm.env.config.ssh.private_key_path
21
+ :private_key_path => vm.env.config.ssh.private_key_path,
22
+ :forward_agent => vm.env.config.ssh.forward_agent,
23
+ :forward_x11 => vm.env.config.ssh.forward_x11
22
24
  }))
23
25
  end
24
26
  end
@@ -6,6 +6,7 @@ module Vagrant
6
6
  attr_accessor :username
7
7
  attr_accessor :host
8
8
  attr_accessor :forwarded_port_key
9
+ attr_accessor :forwarded_port_destination
9
10
  attr_accessor :max_tries
10
11
  attr_accessor :timeout
11
12
  attr_writer :private_key_path
@@ -17,6 +18,8 @@ module Vagrant
17
18
  def initialize
18
19
  @sudo_shell = "bash"
19
20
  @port = nil
21
+ @forward_agent = false
22
+ @forward_x11 = false
20
23
  end
21
24
 
22
25
  def private_key_path
@@ -20,8 +20,6 @@ module Vagrant
20
20
  attr_reader :network_options
21
21
  attr_reader :provisioners
22
22
  attr_accessor :disk_image_format
23
- attr_writer :shared_folder_uid
24
- attr_writer :shared_folder_gid
25
23
  attr_accessor :system
26
24
 
27
25
  def initialize
@@ -46,7 +44,10 @@ module Vagrant
46
44
  def share_folder(name, guestpath, hostpath, opts=nil)
47
45
  @shared_folders[name] = {
48
46
  :guestpath => guestpath,
49
- :hostpath => hostpath
47
+ :hostpath => hostpath,
48
+ :owner => nil,
49
+ :group => nil,
50
+ :nfs => false
50
51
  }.merge(opts || {})
51
52
  end
52
53
 
@@ -73,14 +74,6 @@ module Vagrant
73
74
  raise Errors::VagrantError, :_key => :provisioner_equals_not_supported
74
75
  end
75
76
 
76
- def shared_folder_uid
77
- @shared_folder_uid || env.config.ssh.username
78
- end
79
-
80
- def shared_folder_gid
81
- @shared_folder_gid || env.config.ssh.username
82
- end
83
-
84
77
  def customize(&block)
85
78
  push_proc(&block)
86
79
  end
@@ -125,11 +118,22 @@ module Vagrant
125
118
  :name => name,
126
119
  :path => options[:hostpath]))
127
120
  end
121
+
122
+ if options[:nfs] && (options[:owner] || options[:group])
123
+ # Owner/group don't work with NFS
124
+ errors.add(I18n.t("vagrant.config.vm.shared_folder_nfs_owner_group",
125
+ :name => name))
126
+ end
128
127
  end
129
128
 
130
129
  # Each provisioner can validate itself
131
130
  provisioners.each do |prov|
132
- prov.validate(errors)
131
+ # TODO: Remove at some point
132
+ if prov.shortcut == :chef_server
133
+ errors.add(I18n.t("vagrant.config.vm.provisioner_chef_server_changed"))
134
+ else
135
+ prov.validate(errors)
136
+ end
133
137
  end
134
138
  end
135
139
  end
@@ -33,6 +33,8 @@ module Vagrant
33
33
  # TODO: Error on some redirect limit
34
34
  download!(response["Location"], destination_file)
35
35
  return
36
+ elsif !response.is_a?(Net::HTTPOK)
37
+ raise Errors::DownloaderHTTPStatusError, :status => response.code
36
38
  end
37
39
 
38
40
  total = response.content_length
@@ -1,15 +1,15 @@
1
1
  require 'pathname'
2
2
  require 'fileutils'
3
+ require 'logger'
3
4
 
4
5
  module Vagrant
5
6
  # Represents a single Vagrant environment. A "Vagrant environment" is
6
7
  # defined as basically a folder with a "Vagrantfile." This class allows
7
8
  # access to the VMs, CLI, etc. all in the scope of this environment.
8
9
  class Environment
9
- ROOTFILE_NAME = "Vagrantfile"
10
10
  HOME_SUBDIRS = ["tmp", "boxes", "logs"]
11
11
  DEFAULT_VM = :default
12
- DEFAULT_HOME = "~/.vagrant"
12
+ DEFAULT_HOME = "~/.vagrant.d"
13
13
 
14
14
  # Parent environment (in the case of multi-VMs)
15
15
  attr_reader :parent
@@ -17,6 +17,9 @@ module Vagrant
17
17
  # The `cwd` that this environment represents
18
18
  attr_reader :cwd
19
19
 
20
+ # The valid name for a Vagrantfile for this environment.
21
+ attr_reader :vagrantfile_name
22
+
20
23
  # The single VM that this environment represents, in the case of
21
24
  # multi-VM.
22
25
  attr_accessor :vm
@@ -36,7 +39,7 @@ module Vagrant
36
39
  def check_virtualbox!
37
40
  version = VirtualBox.version
38
41
  raise Errors::VirtualBoxNotDetected if version.nil?
39
- raise Errors::VirtualBoxInvalidVersion, :version => version.to_s if version.to_f < 4.0 || version.to_f >= 4.1
42
+ raise Errors::VirtualBoxInvalidVersion, :version => version.to_s if version.to_f < 4.1 || version.to_f >= 4.2
40
43
  rescue Errors::VirtualBoxNotDetected
41
44
  # On 64-bit Windows, show a special error. This error is a subclass
42
45
  # of VirtualBoxNotDetected, so libraries which use Vagrant can just
@@ -58,16 +61,30 @@ module Vagrant
58
61
  :parent => nil,
59
62
  :vm => nil,
60
63
  :cwd => nil,
64
+ :vagrantfile_name => nil,
65
+ :lock_path => nil
61
66
  }.merge(opts || {})
62
67
 
68
+ # Set the default working directory to look for the vagrantfile
63
69
  opts[:cwd] ||= Dir.pwd
64
70
  opts[:cwd] = Pathname.new(opts[:cwd])
65
71
 
72
+ # Set the default vagrantfile name, which can be either Vagrantfile
73
+ # or vagrantfile (capital for backwards compatibility)
74
+ opts[:vagrantfile_name] ||= ["Vagrantfile", "vagrantfile"]
75
+ opts[:vagrantfile_name] = [opts[:vagrantfile_name]] if !opts[:vagrantfile_name].is_a?(Array)
76
+
66
77
  opts.each do |key, value|
67
78
  instance_variable_set("@#{key}".to_sym, opts[key])
68
79
  end
69
80
 
70
81
  @loaded = false
82
+ @lock_acquired = false
83
+
84
+ logger.info("environment") { "Environment initialized (#{self})" }
85
+ logger.info("environment") { " - cwd: #{cwd}" }
86
+ logger.info("environment") { " - parent: #{parent}" }
87
+ logger.info("environment") { " - vm: #{vm}" }
71
88
  end
72
89
 
73
90
  #---------------------------------------------------------------
@@ -86,7 +103,33 @@ module Vagrant
86
103
  #
87
104
  # @return [Pathname]
88
105
  def home_path
106
+ return parent.home_path if parent
107
+ return @_home_path if defined?(@_home_path)
108
+
89
109
  @_home_path ||= Pathname.new(File.expand_path(ENV["VAGRANT_HOME"] || DEFAULT_HOME))
110
+ logger.info("environment") { "Home path: #{@_home_path}" }
111
+
112
+ # This is the old default that Vagrant used to be put things into
113
+ # up until Vagrant 0.8.0. We keep around an automatic migration
114
+ # script here in case any old users upgrade.
115
+ old_home = File.expand_path("~/.vagrant")
116
+ if File.exists?(old_home) && File.directory?(old_home)
117
+ logger.info("environment") { "Found both an old and new Vagrantfile. Migration initiated." }
118
+
119
+ # We can't migrate if the home directory already exists
120
+ if File.exists?(@_home_path)
121
+ ui.warn I18n.t("vagrant.general.home_dir_migration_failed",
122
+ :old => old_home,
123
+ :new => @_home_path.to_s)
124
+ else
125
+ # If the new home path doesn't exist, simply transition to it
126
+ ui.info I18n.t("vagrant.general.moving_home_dir", :directory => @_home_path)
127
+ FileUtils.mv(old_home, @_home_path)
128
+ end
129
+ end
130
+
131
+ # Return the home path
132
+ @_home_path
90
133
  end
91
134
 
92
135
  # The path to the Vagrant tmp directory
@@ -249,7 +292,27 @@ module Vagrant
249
292
  # @return [Logger]
250
293
  def logger
251
294
  return parent.logger if parent
252
- @logger ||= Util::ResourceLogger.new(resource, self)
295
+ return @logger if @logger
296
+
297
+ # Figure out where the output should go to.
298
+ output = nil
299
+ if ENV["VAGRANT_LOG"] == "STDOUT"
300
+ output = STDOUT
301
+ elsif ENV["VAGRANT_LOG"] == "NULL"
302
+ output = nil
303
+ elsif ENV["VAGRANT_LOG"]
304
+ output = ENV["VAGRANT_LOG"]
305
+ else
306
+ output = nil #log_path.join("#{Time.now.to_i}.log")
307
+ end
308
+
309
+ # Create the logger and custom formatter
310
+ @logger = Logger.new(output)
311
+ @logger.formatter = Proc.new do |severity, datetime, progname, msg|
312
+ "#{datetime} - #{progname} - [#{resource}] #{msg}\n"
313
+ end
314
+
315
+ @logger
253
316
  end
254
317
 
255
318
  # The root path is the path where the top-most (loaded last)
@@ -261,7 +324,13 @@ module Vagrant
261
324
  return @root_path if defined?(@root_path)
262
325
 
263
326
  root_finder = lambda do |path|
264
- return path if File.exist?(File.join(path.to_s, ROOTFILE_NAME))
327
+ # Note: To remain compatible with Ruby 1.8, we have to use
328
+ # a `find` here instead of an `each`.
329
+ found = vagrantfile_name.find do |rootfile|
330
+ File.exist?(File.join(path.to_s, rootfile))
331
+ end
332
+
333
+ return path if found
265
334
  return nil if path.root? || !File.exist?(path)
266
335
  root_finder.call(path.parent)
267
336
  end
@@ -269,6 +338,39 @@ module Vagrant
269
338
  @root_path = root_finder.call(cwd)
270
339
  end
271
340
 
341
+ # This returns the path which Vagrant uses to determine the location
342
+ # of the file lock. This is specific to each operating system.
343
+ def lock_path
344
+ @lock_path || tmp_path.join("vagrant.lock")
345
+ end
346
+
347
+ # This locks Vagrant for the duration of the block passed to this
348
+ # method. During this time, any other environment which attempts
349
+ # to lock which points to the same lock file will fail.
350
+ def lock
351
+ # This allows multiple locks in the same process to be nested
352
+ return yield if @lock_acquired
353
+
354
+ File.open(lock_path, "w+") do |f|
355
+ # The file locking fails only if it returns "false." If it
356
+ # succeeds it returns a 0, so we must explicitly check for
357
+ # the proper error case.
358
+ raise Errors::EnvironmentLockedError if f.flock(File::LOCK_EX | File::LOCK_NB) === false
359
+
360
+ begin
361
+ # Mark that we have a lock
362
+ @lock_acquired = true
363
+
364
+ yield
365
+ ensure
366
+ # We need to make sure that no matter what this is always
367
+ # reset to false so we don't think we have a lock when we
368
+ # actually don't.
369
+ @lock_acquired = false
370
+ end
371
+ end
372
+ end
373
+
272
374
  #---------------------------------------------------------------
273
375
  # Config Methods
274
376
  #---------------------------------------------------------------
@@ -301,7 +403,15 @@ module Vagrant
301
403
  def load!
302
404
  if !loaded?
303
405
  @loaded = true
304
- self.class.check_virtualbox!
406
+
407
+ if !parent
408
+ # We only need to check the virtualbox version once, so do it on
409
+ # the parent most environment and then forget about it
410
+ logger.info("environment") { "Environment not loaded. Checking virtual box version..." }
411
+ self.class.check_virtualbox!
412
+ end
413
+
414
+ logger.info("environment") { "Loading configuration..." }
305
415
  load_config!
306
416
  end
307
417
 
@@ -327,9 +437,26 @@ module Vagrant
327
437
  @config_loader ||= Config.new(parent ? parent.config_loader : nil)
328
438
  @config_loader.load_order = [:default, :box, :home, :root, :sub_vm]
329
439
  @config_loader.set(:default, File.expand_path("config/default.rb", Vagrant.source_root))
330
- @config_loader.set(:box, File.join(box.directory, ROOTFILE_NAME)) if !first_run && vm && box
331
- @config_loader.set(:home, File.join(home_path, ROOTFILE_NAME)) if !first_run && home_path
332
- @config_loader.set(:root, File.join(root_path, ROOTFILE_NAME)) if root_path
440
+
441
+ vagrantfile_name.each do |rootfile|
442
+ if !first_run && vm && box
443
+ # We load the box Vagrantfile
444
+ box_vagrantfile = box.directory.join(rootfile)
445
+ @config_loader.set(:box, box_vagrantfile) if box_vagrantfile.exist?
446
+ end
447
+
448
+ if !first_run && home_path
449
+ # Load the home Vagrantfile
450
+ home_vagrantfile = home_path.join(rootfile)
451
+ @config_loader.set(:home, home_vagrantfile) if home_vagrantfile.exist?
452
+ end
453
+
454
+ if root_path
455
+ # Load the Vagrantfile in this directory
456
+ root_vagrantfile = root_path.join(rootfile)
457
+ @config_loader.set(:root, root_vagrantfile) if root_vagrantfile.exist?
458
+ end
459
+ end
333
460
 
334
461
  # If this environment is representing a sub-VM, then we push that
335
462
  # proc on as the last configuration.
@@ -342,9 +469,6 @@ module Vagrant
342
469
  # value in the config ivar.
343
470
  @config = @config_loader.load(self)
344
471
 
345
- # (re)load the logger
346
- @logger = nil
347
-
348
472
  if first_run
349
473
  # After the first run we want to load the configuration again since
350
474
  # it can change due to box Vagrantfiles and home directory Vagrantfiles