vagrant 0.9.7 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. data/CHANGELOG.md +41 -0
  2. data/config/default.rb +0 -1
  3. data/lib/vagrant.rb +9 -5
  4. data/lib/vagrant/action.rb +1 -0
  5. data/lib/vagrant/action/builtin.rb +10 -0
  6. data/lib/vagrant/action/general/check_virtualbox.rb +28 -0
  7. data/lib/vagrant/action/general/package.rb +10 -7
  8. data/lib/vagrant/action/general/validate.rb +2 -3
  9. data/lib/vagrant/action/vm/customize.rb +1 -1
  10. data/lib/vagrant/action/vm/network.rb +10 -9
  11. data/lib/vagrant/action/vm/nfs.rb +7 -0
  12. data/lib/vagrant/command.rb +1 -0
  13. data/lib/vagrant/command/base.rb +8 -2
  14. data/lib/vagrant/command/destroy.rb +29 -3
  15. data/lib/vagrant/command/gem.rb +35 -0
  16. data/lib/vagrant/command/package.rb +1 -1
  17. data/lib/vagrant/command/ssh.rb +1 -1
  18. data/lib/vagrant/command/ssh_config.rb +1 -1
  19. data/lib/vagrant/config/loader.rb +2 -0
  20. data/lib/vagrant/config/ssh.rb +0 -20
  21. data/lib/vagrant/config/vm.rb +0 -48
  22. data/lib/vagrant/data_store.rb +18 -9
  23. data/lib/vagrant/driver/virtualbox.rb +1 -0
  24. data/lib/vagrant/driver/virtualbox_4_0.rb +36 -14
  25. data/lib/vagrant/driver/virtualbox_4_1.rb +36 -14
  26. data/lib/vagrant/driver/virtualbox_base.rb +37 -19
  27. data/lib/vagrant/environment.rb +21 -2
  28. data/lib/vagrant/errors.rb +10 -0
  29. data/lib/vagrant/guest.rb +1 -0
  30. data/lib/vagrant/guest/arch.rb +10 -2
  31. data/lib/vagrant/guest/base.rb +1 -1
  32. data/lib/vagrant/guest/debian.rb +5 -2
  33. data/lib/vagrant/guest/fedora.rb +66 -0
  34. data/lib/vagrant/guest/freebsd.rb +18 -7
  35. data/lib/vagrant/guest/gentoo.rb +6 -0
  36. data/lib/vagrant/guest/linux.rb +1 -0
  37. data/lib/vagrant/guest/redhat.rb +1 -0
  38. data/lib/vagrant/guest/ubuntu.rb +1 -1
  39. data/lib/vagrant/hosts.rb +1 -0
  40. data/lib/vagrant/hosts/opensuse.rb +30 -0
  41. data/lib/vagrant/plugin.rb +21 -19
  42. data/lib/vagrant/provisioners/chef.rb +3 -1
  43. data/lib/vagrant/provisioners/puppet.rb +18 -7
  44. data/lib/vagrant/util/line_ending_helpers.rb +14 -0
  45. data/lib/vagrant/util/subprocess.rb +9 -0
  46. data/lib/vagrant/version.rb +1 -1
  47. data/lib/vagrant/vm.rb +6 -6
  48. data/templates/commands/init/Vagrantfile.erb +1 -1
  49. data/templates/guests/fedora/network_dhcp.erb +6 -0
  50. data/templates/guests/fedora/network_static.erb +13 -0
  51. data/templates/guests/freebsd/network_dhcp.erb +3 -0
  52. data/templates/guests/freebsd/network_static.erb +3 -0
  53. data/templates/locales/en.yml +26 -0
  54. data/templates/nfs/exports_linux.erb +1 -1
  55. data/test/acceptance/networking/host_only_test.rb +2 -2
  56. data/test/unit/vagrant/config/vm_test.rb +4 -4
  57. data/test/unit/vagrant/data_store_test.rb +12 -0
  58. data/test/unit/vagrant/environment_test.rb +20 -0
  59. data/test/unit/vagrant/util/line_endings_helper_test.rb +16 -0
  60. data/vagrant.gemspec +1 -1
  61. metadata +37 -27
@@ -2,6 +2,7 @@ require 'log4r'
2
2
 
3
3
  require 'vagrant/util/busy'
4
4
  require 'vagrant/util/platform'
5
+ require 'vagrant/util/retryable'
5
6
  require 'vagrant/util/subprocess'
6
7
 
7
8
  module Vagrant
@@ -13,6 +14,7 @@ module Vagrant
13
14
  class VirtualBoxBase
14
15
  # Include this so we can use `Subprocess` more easily.
15
16
  include Vagrant::Util
17
+ include Vagrant::Util::Retryable
16
18
 
17
19
  def initialize
18
20
  @logger = Log4r::Logger.new("vagrant::driver::virtualbox_base")
@@ -232,6 +234,12 @@ module Vagrant
232
234
  def suspend
233
235
  end
234
236
 
237
+ # Verifies that the driver is ready to accept work.
238
+ #
239
+ # This should raise a VagrantError if things are not ready.
240
+ def verify!
241
+ end
242
+
235
243
  # Verifies that an image can be imported properly.
236
244
  #
237
245
  # @param [String] path Path to an OVF file.
@@ -245,28 +253,38 @@ module Vagrant
245
253
  def vm_exists?(uuid)
246
254
  end
247
255
 
248
- protected
249
-
250
256
  # Execute the given subcommand for VBoxManage and return the output.
251
257
  def execute(*command, &block)
252
- # Execute the command
253
- r = raw(*command, &block)
254
-
255
- # If the command was a failure, then raise an exception that is
256
- # nicely handled by Vagrant.
257
- if r.exit_code != 0
258
- if @interrupted
259
- @logger.info("Exit code != 0, but interrupted. Ignoring.")
258
+ # Get the options hash if it exists
259
+ opts = {}
260
+ opts = command.pop if command.last.is_a?(Hash)
261
+
262
+ tries = 0
263
+ tries = 3 if opts[:retryable]
264
+
265
+ # Variable to store our execution result
266
+ r = nil
267
+
268
+ retryable(:on => Errors::VBoxManageError, :tries => tries, :sleep => 1) do
269
+ # Execute the command
270
+ r = raw(*command, &block)
271
+
272
+ # If the command was a failure, then raise an exception that is
273
+ # nicely handled by Vagrant.
274
+ if r.exit_code != 0
275
+ if @interrupted
276
+ @logger.info("Exit code != 0, but interrupted. Ignoring.")
277
+ else
278
+ raise Errors::VBoxManageError, :command => command.inspect
279
+ end
260
280
  else
261
- raise Errors::VBoxManageError, :command => command.inspect
262
- end
263
- else
264
- # Sometimes, VBoxManage fails but doesn't actual return a non-zero
265
- # exit code. For this we inspect the output and determine if an error
266
- # occurred.
267
- if r.stderr =~ /VBoxManage: error:/
268
- @logger.info("VBoxManage error text found, assuming error.")
269
- raise Errors::VBoxManageError, :command => command.inspect
281
+ # Sometimes, VBoxManage fails but doesn't actual return a non-zero
282
+ # exit code. For this we inspect the output and determine if an error
283
+ # occurred.
284
+ if r.stderr =~ /VBoxManage: error:/
285
+ @logger.info("VBoxManage error text found, assuming error.")
286
+ raise Errors::VBoxManageError, :command => command.inspect
287
+ end
270
288
  end
271
289
  end
272
290
 
@@ -11,7 +11,7 @@ module Vagrant
11
11
  # defined as basically a folder with a "Vagrantfile." This class allows
12
12
  # access to the VMs, CLI, etc. all in the scope of this environment.
13
13
  class Environment
14
- HOME_SUBDIRS = ["tmp", "boxes"]
14
+ HOME_SUBDIRS = ["tmp", "boxes", "gems"]
15
15
  DEFAULT_VM = :default
16
16
  DEFAULT_HOME = "~/.vagrant.d"
17
17
 
@@ -34,6 +34,9 @@ module Vagrant
34
34
  # The directory where boxes are stored.
35
35
  attr_reader :boxes_path
36
36
 
37
+ # The path where the plugins are stored (gems)
38
+ attr_reader :gems_path
39
+
37
40
  # The path to the default private key
38
41
  attr_reader :default_private_key_path
39
42
 
@@ -80,10 +83,14 @@ module Vagrant
80
83
  setup_home_path
81
84
  @tmp_path = @home_path.join("tmp")
82
85
  @boxes_path = @home_path.join("boxes")
86
+ @gems_path = @home_path.join("gems")
83
87
 
84
88
  # Setup the default private key
85
89
  @default_private_key_path = @home_path.join("insecure_private_key")
86
90
  copy_insecure_private_key
91
+
92
+ # Load the plugins
93
+ load_plugins
87
94
  end
88
95
 
89
96
  #---------------------------------------------------------------
@@ -131,7 +138,7 @@ module Vagrant
131
138
  def primary_vm
132
139
  return vms.values.first if !multivm?
133
140
 
134
- config.vm.defined_vms.each do |name, subvm|
141
+ config.global.vm.defined_vms.each do |name, subvm|
135
142
  return vms[name] if subvm.options[:primary]
136
143
  end
137
144
 
@@ -490,5 +497,17 @@ module Vagrant
490
497
 
491
498
  nil
492
499
  end
500
+
501
+ # Loads the Vagrant plugins by properly setting up RubyGems so that
502
+ # our private gem repository is on the path.
503
+ def load_plugins
504
+ # Add our private gem path to the gem path and reset the paths
505
+ # that Rubygems knows about.
506
+ ENV["GEM_PATH"] = "#{@gems_path}:#{ENV["GEM_PATH"]}"
507
+ ::Gem.clear_paths
508
+
509
+ # Load the plugins
510
+ Plugin.load!
511
+ end
493
512
  end
494
513
  end
@@ -173,6 +173,11 @@ module Vagrant
173
173
  error_key(:environment_locked)
174
174
  end
175
175
 
176
+ class GemCommandInBundler < VagrantError
177
+ status_code(71)
178
+ error_key(:gem_command_in_bundler)
179
+ end
180
+
176
181
  class HomeDirectoryMigrationFailed < VagrantError
177
182
  status_code(53)
178
183
  error_key(:home_dir_migration_failed)
@@ -258,6 +263,11 @@ module Vagrant
258
263
  error_key(:include_file_missing, "vagrant.actions.general.package")
259
264
  end
260
265
 
266
+ class PackageOutputDirectory < VagrantError
267
+ status_code(72)
268
+ error_key(:output_is_directory, "vagrant.actions.general.package")
269
+ end
270
+
261
271
  class PackageOutputExists < VagrantError
262
272
  status_code(16)
263
273
  error_key(:output_exists, "vagrant.actions.general.package")
@@ -5,6 +5,7 @@ module Vagrant
5
5
  # Specific guests
6
6
  autoload :Arch, 'vagrant/guest/arch'
7
7
  autoload :Debian, 'vagrant/guest/debian'
8
+ autoload :Fedora, 'vagrant/guest/fedora'
8
9
  autoload :FreeBSD, 'vagrant/guest/freebsd'
9
10
  autoload :Gentoo, 'vagrant/guest/gentoo'
10
11
  autoload :Linux, 'vagrant/guest/linux'
@@ -1,9 +1,14 @@
1
1
  require 'set'
2
2
  require 'tempfile'
3
3
 
4
+ require 'vagrant/util/template_renderer'
5
+
4
6
  module Vagrant
5
7
  module Guest
6
8
  class Arch < Linux
9
+ # Make the TemplateRenderer top-level
10
+ include Vagrant::Util
11
+
7
12
  def change_host_name(name)
8
13
  # Only do this if the hostname is not already set
9
14
  if !vm.channel.test("sudo hostname | grep '#{name}'")
@@ -23,13 +28,16 @@ module Vagrant
23
28
  entries = []
24
29
  networks.each do |network|
25
30
  interfaces.add(network[:interface])
26
- entries << TemplateRenderer.render("guests/arch/network_#{network[:type]}",
27
- :options => network)
31
+ entry = TemplateRenderer.render("guests/arch/network_#{network[:type]}",
32
+ :options => network)
33
+
34
+ entries << entry
28
35
  end
29
36
 
30
37
  # Perform the careful dance necessary to reconfigure
31
38
  # the network interfaces
32
39
  temp = Tempfile.new("vagrant")
40
+ temp.binmode
33
41
  temp.write(entries.join("\n"))
34
42
  temp.close
35
43
 
@@ -81,7 +81,7 @@ module Vagrant
81
81
  #
82
82
  # {
83
83
  # :type => :static,
84
- # :ip => "33.33.33.10",
84
+ # :ip => "192.168.33.10",
85
85
  # :netmask => "255.255.255.0",
86
86
  # :interface => 1
87
87
  # }
@@ -22,13 +22,16 @@ module Vagrant
22
22
  entries = []
23
23
  networks.each do |network|
24
24
  interfaces.add(network[:interface])
25
- entries << TemplateRenderer.render("guests/debian/network_#{network[:type]}",
26
- :options => network)
25
+ entry = TemplateRenderer.render("guests/debian/network_#{network[:type]}",
26
+ :options => network)
27
+
28
+ entries << entry
27
29
  end
28
30
 
29
31
  # Perform the careful dance necessary to reconfigure
30
32
  # the network interfaces
31
33
  temp = Tempfile.new("vagrant")
34
+ temp.binmode
32
35
  temp.write(entries.join("\n"))
33
36
  temp.close
34
37
 
@@ -0,0 +1,66 @@
1
+ require 'set'
2
+ require 'tempfile'
3
+
4
+ require 'vagrant/util/template_renderer'
5
+
6
+ module Vagrant
7
+ module Guest
8
+ class Fedora < Linux
9
+ # Make the TemplateRenderer top-level
10
+ include Vagrant::Util
11
+
12
+ def configure_networks(networks)
13
+ # Accumulate the configurations to add to the interfaces file as well
14
+ # as what interfaces we're actually configuring since we use that later.
15
+ interfaces = Set.new
16
+ networks.each do |network|
17
+ interfaces.add(network[:interface])
18
+
19
+ # Remove any previous vagrant configuration in this network
20
+ # interface's configuration files.
21
+ vm.channel.sudo("touch #{network_scripts_dir}/ifcfg-p7p#{network[:interface]}")
22
+ vm.channel.sudo("sed -e '/^#VAGRANT-BEGIN/,/^#VAGRANT-END/ d' #{network_scripts_dir}/ifcfg-p7p#{network[:interface]} > /tmp/vagrant-ifcfg-p7p#{network[:interface]}")
23
+ vm.channel.sudo("cat /tmp/vagrant-ifcfg-p7p#{network[:interface]} > #{network_scripts_dir}/ifcfg-p7p#{network[:interface]}")
24
+
25
+ # Render and upload the network entry file to a deterministic
26
+ # temporary location.
27
+ entry = TemplateRenderer.render("guests/fedora/network_#{network[:type]}",
28
+ :options => network)
29
+
30
+ temp = Tempfile.new("vagrant")
31
+ temp.binmode
32
+ temp.write(entry)
33
+ temp.close
34
+
35
+ vm.channel.upload(temp.path, "/tmp/vagrant-network-entry_#{network[:interface]}")
36
+ end
37
+
38
+ # Bring down all the interfaces we're reconfiguring. By bringing down
39
+ # each specifically, we avoid reconfiguring p7p (the NAT interface) so
40
+ # SSH never dies.
41
+ interfaces.each do |interface|
42
+ vm.channel.sudo("/sbin/ifdown p7p#{interface} 2> /dev/null", :error_check => false)
43
+ vm.channel.sudo("cat /tmp/vagrant-network-entry_#{interface} >> #{network_scripts_dir}/ifcfg-p7p#{interface}")
44
+ vm.channel.sudo("/sbin/ifup p7p#{interface} 2> /dev/null")
45
+ end
46
+ end
47
+
48
+ # The path to the directory with the network configuration scripts.
49
+ # This is pulled out into its own directory since there are other
50
+ # operating systems (SuSE) which behave similarly but with a different
51
+ # path to the network scripts.
52
+ def network_scripts_dir
53
+ '/etc/sysconfig/network-scripts'
54
+ end
55
+
56
+ def change_host_name(name)
57
+ # Only do this if the hostname is not already set
58
+ if !vm.channel.test("sudo hostname | grep '#{name}'")
59
+ vm.channel.sudo("sed -i 's/\\(HOSTNAME=\\).*/\\1#{name}/' /etc/sysconfig/network")
60
+ vm.channel.sudo("hostname #{name}")
61
+ vm.channel.sudo("sed -i 's@^\\(127[.]0[.]0[.]1[[:space:]]\\+\\)@\\1#{name} #{name.split('.')[0]} @' /etc/hosts")
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -1,3 +1,5 @@
1
+ require 'vagrant/util/template_renderer'
2
+
1
3
  module Vagrant
2
4
  module Guest
3
5
  # A general Vagrant system implementation for "freebsd".
@@ -57,19 +59,28 @@ module Vagrant
57
59
  end
58
60
 
59
61
  def configure_networks(networks)
60
- # Remove any previous host only network additions to the
61
- # interface file.
62
- vm.channel.sudo("sed -e '/^#VAGRANT-BEGIN-HOSTONLY/,/^#VAGRANT-END-HOSTONLY/ d' /etc/rc.conf > /tmp/rc.conf")
63
- vm.channel.sudo("mv /tmp/rc.conf /etc/rc.conf")
62
+ # Remove any previous network additions to the configuration file.
63
+ vm.channel.sudo("sed -i '' -e '/^#VAGRANT-BEGIN/,/^#VAGRANT-END/ d' /etc/rc.conf")
64
64
 
65
65
  networks.each do |network|
66
- entry = "#VAGRANT-BEGIN-HOSTONLY\nifconfig_em#{network[:interface]}=\"inet #{network[:ip]} netmask #{network[:netmask]}\"\n#VAGRANT-END-HOSTONLY\n"
66
+ entry = TemplateRenderer.render("guests/freebsd/network_#{network[:type]}",
67
+ :options => network)
67
68
  vm.channel.upload(StringIO.new(entry), "/tmp/vagrant-network-entry")
68
-
69
69
  vm.channel.sudo("su -m root -c 'cat /tmp/vagrant-network-entry >> /etc/rc.conf'")
70
- vm.channel.sudo("ifconfig em#{network[:interface]} inet #{network[:ip]} netmask #{network[:netmask]}")
70
+ if network[:type].to_sym == :static
71
+ vm.channel.sudo("ifconfig em#{network[:interface]} inet #{network[:ip]} netmask #{network[:netmask]}")
72
+ elsif network[:type].to_sym == :dhcp
73
+ vm.channel.sudo("dhclient em#{network[:interface]}")
74
+ end
71
75
  end
72
76
  end
77
+
78
+ def change_host_name(name)
79
+ if !vm.channel.test("hostname -f | grep '^#{name}$' || hostname -s | grep '^#{name}$'")
80
+ vm.channel.sudo("sed -i '' 's/^hostname=.*$/hostname=#{name}/' /etc/rc.conf")
81
+ vm.channel.sudo("hostname #{name}")
82
+ end
83
+ end
73
84
  end
74
85
  end
75
86
  end
@@ -1,8 +1,13 @@
1
1
  require 'tempfile'
2
2
 
3
+ require 'vagrant/util/template_renderer'
4
+
3
5
  module Vagrant
4
6
  module Guest
5
7
  class Gentoo < Linux
8
+ # Make the TemplateRenderer top-level
9
+ include Vagrant::Util
10
+
6
11
  def configure_networks(networks)
7
12
  # Remove any previous host only network additions to the interface file
8
13
  vm.channel.sudo("sed -e '/^#VAGRANT-BEGIN/,/^#VAGRANT-END/ d' /etc/conf.d/net > /tmp/vagrant-network-interfaces")
@@ -15,6 +20,7 @@ module Vagrant
15
20
 
16
21
  # Upload the entry to a temporary location
17
22
  temp = Tempfile.new("vagrant")
23
+ temp.binmode
18
24
  temp.write(entry)
19
25
  temp.close
20
26
 
@@ -19,6 +19,7 @@ module Vagrant
19
19
  end
20
20
 
21
21
  return :gentoo if @vm.channel.test("cat /etc/gentoo-release")
22
+ return :fedora if @vm.channel.test("grep 'Fedora release 16' /etc/redhat-release")
22
23
  return :redhat if @vm.channel.test("cat /etc/redhat-release")
23
24
  return :suse if @vm.channel.test("cat /etc/SuSE-release")
24
25
  return :arch if @vm.channel.test("cat /etc/arch-release")
@@ -29,6 +29,7 @@ module Vagrant
29
29
  :options => network)
30
30
 
31
31
  temp = Tempfile.new("vagrant")
32
+ temp.binmode
32
33
  temp.write(entry)
33
34
  temp.close
34
35
 
@@ -8,7 +8,7 @@ module Vagrant
8
8
  super
9
9
 
10
10
  # Emit an upstart event if upstart is available
11
- @vm.channel.sudo("[ -x /sbin/initctl ] && /sbin/initctl emit vagrant-mounted MOUNTPOINT=#{guestpath}")
11
+ vm.channel.sudo("[ -x /sbin/initctl ] && /sbin/initctl emit vagrant-mounted MOUNTPOINT=#{guestpath}")
12
12
  end
13
13
 
14
14
  def change_host_name(name)
@@ -7,6 +7,7 @@ module Vagrant
7
7
  autoload :BSD, 'vagrant/hosts/bsd'
8
8
  autoload :FreeBSD, 'vagrant/hosts/freebsd'
9
9
  autoload :Fedora, 'vagrant/hosts/fedora'
10
+ autoload :OpenSUSE, 'vagrant/hosts/opensuse'
10
11
  autoload :Gentoo, 'vagrant/hosts/gentoo'
11
12
  autoload :Linux, 'vagrant/hosts/linux'
12
13
  autoload :Windows, 'vagrant/hosts/windows'
@@ -0,0 +1,30 @@
1
+ require 'pathname'
2
+
3
+ module Vagrant
4
+ module Hosts
5
+ class OpenSUSE < Linux
6
+ def self.match?
7
+ release_file = Pathname.new("/etc/SuSE-release")
8
+
9
+ if release_file.exist?
10
+ release_file.open("r") do |f|
11
+ return true if f.gets =~ /^openSUSE/
12
+ end
13
+ end
14
+
15
+ false
16
+ end
17
+
18
+ # Normal, mid-range precedence.
19
+ def self.precedence
20
+ 5
21
+ end
22
+
23
+ def initialize(*args)
24
+ super
25
+
26
+ @nfs_server_binary = "/etc/init.d/nfsserver"
27
+ end
28
+ end
29
+ end
30
+ end
@@ -1,5 +1,7 @@
1
1
  require "rubygems"
2
2
 
3
+ require "log4r"
4
+
3
5
  module Vagrant
4
6
  # Represents a single plugin and also manages loading plugins from
5
7
  # RubyGems. If a plugin has a `vagrant_init.rb` file somewhere on its
@@ -7,20 +9,17 @@ module Vagrant
7
9
  # (for debugging), the list of loaded plugins is stored in the {plugins}
8
10
  # array.
9
11
  class Plugin
10
- # The array of loaded plugins.
12
+ # The array of gem specifications that were loaded as plugins.
11
13
  @@plugins = []
12
14
 
13
- # The gemspec of this plugin. This is an actual gemspec object.
14
- attr_reader :gemspec
15
-
16
- # The path to the `vagrant_init.rb` file which was loaded for this plugin.
17
- attr_reader :file
18
-
19
15
  # Loads all the plugins for Vagrant. Plugins are currently
20
16
  # gems which have a "vagrant_init.rb" somewhere on their
21
17
  # load path. This file is loaded to kick off the load sequence
22
18
  # for that plugin.
23
19
  def self.load!
20
+ logger = Log4r::Logger.new("vagrant::plugin")
21
+ logger.info("Searching and loading any available plugins...")
22
+
24
23
  # Our version is used for checking dependencies
25
24
  our_version = Gem::Version.create(Vagrant::VERSION)
26
25
 
@@ -41,10 +40,18 @@ module Vagrant
41
40
  specs = Gem::VERSION >= "1.6.0" ? source.latest_specs(true) : source.latest_specs
42
41
 
43
42
  specs.each do |spec|
43
+ if @@plugins.include?(spec)
44
+ logger.debug("Plugin already loaded, not loading again: #{spec.name}")
45
+ next
46
+ end
47
+
44
48
  # If this gem depends on Vagrant, verify this is a valid release of
45
49
  # Vagrant for this gem to load into.
46
50
  vagrant_dep = spec.dependencies.find { |d| d.name == "vagrant" }
47
- next if vagrant_dep && !vagrant_dep.requirement.satisfied_by?(our_version)
51
+ if vagrant_dep && !vagrant_dep.requirement.satisfied_by?(our_version)
52
+ logger.debug("Plugin Vagrant dependency mismatch: #{spec.name} (#{spec.version})")
53
+ next
54
+ end
48
55
 
49
56
  # Find a vagrant_init.rb to verify if this is a plugin
50
57
  file = nil
@@ -55,8 +62,13 @@ module Vagrant
55
62
  end
56
63
 
57
64
  next if !file
58
- @@plugins << new(spec, file)
65
+
66
+ logger.info("Loading plugin: #{spec.name} (#{spec.version})")
67
+ @@plugins << spec
68
+ load file
59
69
  end
70
+
71
+ logger.info("Loaded #{@@plugins.length} plugins.")
60
72
  end
61
73
  end
62
74
 
@@ -65,15 +77,5 @@ module Vagrant
65
77
  #
66
78
  # @return [Array]
67
79
  def self.plugins; @@plugins; end
68
-
69
- # Initializes a new plugin, given a Gemspec and the path to the
70
- # gem's `vagrant_init.rb` file. This should never be called manually.
71
- # Instead {load!} creates all the instances.
72
- def initialize(spec, file)
73
- @gemspec = spec
74
- @file = file
75
-
76
- load file
77
- end
78
80
  end
79
81
  end