diff --git a/lib/vagrant/action/vm/forward_ports.rb b/lib/vagrant/action/vm/forward_ports.rb index 27dc8246e..7959118d0 100644 --- a/lib/vagrant/action/vm/forward_ports.rb +++ b/lib/vagrant/action/vm/forward_ports.rb @@ -11,7 +11,7 @@ module Vagrant @env = env threshold_check - external_collision_check if !env.error? + external_collision_check end #-------------------------------------------------------------- @@ -23,7 +23,7 @@ module Vagrant # 1024, which causes the forwarded ports to fail. def threshold_check @env.env.config.vm.forwarded_ports.each do |name, options| - return @env.error!(:vm_port_below_threshold) if options[:hostport] <= 1024 + raise Errors::ForwardPortBelowThreshold.new if options[:hostport] <= 1024 end end @@ -47,7 +47,9 @@ module Vagrant if !options[:auto] # Auto fixing is disabled for this port forward, so we # must throw an error so the user can fix it. - return @env.error!(:vm_port_collision, :name => name, :hostport => options[:hostport].to_s, :guestport => options[:guestport].to_s, :adapter => options[:adapter]) + raise Errors::ForwardPortCollision.new(:name => name, + :host_port => options[:hostport].to_s, + :guest_port => options[:guestport].to_s) end # Get the auto port range and get rid of the used ports and @@ -58,7 +60,10 @@ module Vagrant range -= existing_ports if range.empty? - return @env.error!(:vm_port_auto_empty, :vm_name => @env["vm"].name, :name => name, :options => options) + raise Errors::ForwardPortAutolistEmpty.new(:vm_name => @env["vm"].name, + :name => name, + :host_port => options[:hostport].to_s, + :guest_port => options[:guestport].to_s) end # Set the port up to be the first one and add that port to diff --git a/lib/vagrant/action/vm/import.rb b/lib/vagrant/action/vm/import.rb index 98172c5a7..8c936a67f 100644 --- a/lib/vagrant/action/vm/import.rb +++ b/lib/vagrant/action/vm/import.rb @@ -15,7 +15,7 @@ module Vagrant end # Flag as erroneous and return if import failed - return env.error!(:virtualbox_import_failure) if !env['vm'].vm + raise Errors::VMImportFailure.new if !env["vm"].vm # Import completed successfully. Continue the chain @app.call(env) diff --git a/lib/vagrant/action/vm/network.rb b/lib/vagrant/action/vm/network.rb index 3187cdd96..07e395eaa 100644 --- a/lib/vagrant/action/vm/network.rb +++ b/lib/vagrant/action/vm/network.rb @@ -11,10 +11,7 @@ module Vagrant @env = env env["config"].vm.network_options.compact.each do |network_options| - if !verify_no_bridge_collision(network_options) - env.error!(:network_collides) - return - end + raise Errors::NetworkCollision.new if !verify_no_bridge_collision(network_options) end end @@ -24,7 +21,7 @@ module Vagrant @app.call(env) - if !env.error? && enable_network? + if enable_network? catch_action_exception(env) do @env.ui.info "vagrant.actions.vm.network.enabling" @env["vm"].system.prepare_host_only_network @@ -90,7 +87,7 @@ module Vagrant end end - return @env.error!(:network_not_found, :name => net_options[:name]) if net_options[:name] + raise Errors::NetworkNotFound.new(:name => net_options[:name]) if net_options[:name] # One doesn't exist, create it. @env.ui.info "vagrant.actions.vm.network.creating" diff --git a/lib/vagrant/action/vm/nfs.rb b/lib/vagrant/action/vm/nfs.rb index 4bb9f4d63..3ebd1442b 100644 --- a/lib/vagrant/action/vm/nfs.rb +++ b/lib/vagrant/action/vm/nfs.rb @@ -37,11 +37,11 @@ module Vagrant export_folders end - return if env.error? - @app.call(env) - mount_folders if !folders.empty? && !env.error? + mount_folders if !folders.empty? + + # TODO: Make recover method clear_nfs_exports(env) if env.error? end @@ -151,9 +151,9 @@ module Vagrant # Verifies that the host is set and supports NFS. def verify_settings - return @env.error!(:nfs_host_required) if @env["host"].nil? - return @env.error!(:nfs_not_supported) if !@env["host"].nfs? - return @env.error!(:nfs_no_host_network) if @env["config"].vm.network_options.empty? + raise Errors::NFSHostRequired.new if @env["host"].nil? + raise Errors::NFSNotSupported.new if !@env["host"].nfs? + raise Errors::NFSNoHostNetwork.new if @env["config"].vm.network_options.empty? end end end diff --git a/lib/vagrant/errors.rb b/lib/vagrant/errors.rb index fbd297b98..6e176c1c1 100644 --- a/lib/vagrant/errors.rb +++ b/lib/vagrant/errors.rb @@ -79,6 +79,21 @@ module Vagrant error_key(:cli_missing_env) end + class ForwardPortAutolistEmpty < VagrantError + status_code(27) + error_key(:auto_empty, "vagrant.actions.vm.forward_ports") + end + + class ForwardPortBelowThreshold < VagrantError + status_code(25) + error_key(:below_threshold_error, "vagrant.actions.vm.forward_ports") + end + + class ForwardPortCollision < VagrantError + status_code(26) + error_key(:collision_error, "vagrant.actions.vm.forward_ports") + end + class MultiVMEnvironmentRequired < VagrantError status_code(5) error_key(:multi_vm_required) @@ -89,6 +104,31 @@ module Vagrant error_key(:multi_vm_target_required) end + class NetworkCollision < VagrantError + status_code(29) + error_key(:collides, "vagrant.actions.vm.network") + end + + class NetworkNotFound < VagrantError + status_code(30) + error_key(:not_found, "vagrant.actions.vm.network") + end + + class NFSHostRequired < VagrantError + status_code(31) + error_key(:host_required, "vagrant.actions.vm.nfs") + end + + class NFSNotSupported < VagrantError + status_code(32) + error_key(:not_supported, "vagrant.actions.vm.nfs") + end + + class NFSNoHostNetwork < VagrantError + status_code(33) + error_key(:no_host_network, "vagrant.actions.vm.nfs") + end + class NoEnvironmentError < VagrantError status_code(3) error_key(:no_env) @@ -144,6 +184,11 @@ module Vagrant error_key(:failed_to_boot, "vagrant.actions.vm.boot") end + class VMImportFailure < VagrantError + status_code(28) + error_key(:failure, "vagrant.actions.vm.import") + end + class VMNotCreatedError < VagrantError status_code(6) error_key(:vm_creation_required) diff --git a/templates/locales/en.yml b/templates/locales/en.yml index da0b3427f..405ed595d 100644 --- a/templates/locales/en.yml +++ b/templates/locales/en.yml @@ -149,6 +149,29 @@ en: exporting: Exporting VM... power_off: "The Vagrant virtual environment you are trying to package must be powered off." forward_ports: + auto_empty: |- + Vagrant found a port collision for the specified port and virtual machine. + While this port was marked to be auto-corrected, the ports in the + auto-correction range are all also used. + + VM: %{vm_name} + Forwarded port: %{name} (%{guest_port} => %{host_port}) + below_threshold_error: |- + The host port of all forwarded ports must be above 1024. VirtualBox + does not allow host ports to be below 1024. (Guest ports below 1024 + are fine. For example: SSH on port 22 on the guest can be forwarded + to port 2222, but not 222). + collision_error: |- + Vagrant cannot forward the specified ports on this VM, since they + would collide with another VirtualBox virtual machine's forwarded + ports! The '%{name}' forwarded port (%{host_port}) is already in use on the host + machine. + + To fix this, modify your current projects Vagrantfile to use another + port. Example, where '1234' would be replaced by a unique host port: + + config.vm.forward_port("%{name}", %{guest_port}, 1234) + fixed_collision: Fixed port collision '%{name}'. Now on port %{new_port}. forwarding: Forwarding ports... forwarding_entry: "-- %{name}: %{guest_port} => %{host_port} (adapter %{adapter})" @@ -159,13 +182,37 @@ en: force: Forcing shutdown of VM... import: importing: Importing base box '%{name}'... + failure: |- + The VM import failed! Try running `VBoxManage import` on the box file + manually for more verbose error output. match_mac: matching: Matching MAC address for NAT networking... network: - enabling: Enabling host only network... - preparing: Preparing host only network... + collides: |- + The specified host network collides with a non-hostonly network! + This will cause your specified IP to be inaccessible. Please change + the IP or name of your host only network to not match that of + a bridged or non-hostonly network. creating: Creating new host only network for environment... + enabling: Enabling host only network... + not_found: |- + The specified host network could not be found: '%{name}.' + If the name specification is removed, Vagrant will create a new + host only network for you. Alternatively, please create the + specified network manually. + preparing: Preparing host only network... nfs: + host_required: |- + A host class is required for NFS shared folders. By default, these + are auto-detected, but can be overriden with `config.vagrant.host`. + There is currently not host class loaded. + no_host_network: |- + NFS shared folders requires that host only networking is enabled. + Please enable host only networking via `config.vm.network`. + not_supported: |- + The host class is reporting that NFS is not supported by this host, + or `nfsd` may not be installed. Please verify that `nfsd` is installed + on your machine, and retry. exporting: Exporting NFS shared folders... mounting: Mounting NFS shared folders... persist: diff --git a/templates/strings.yml b/templates/strings.yml index 93d471298..2574dadaf 100644 --- a/templates/strings.yml +++ b/templates/strings.yml @@ -68,27 +68,6 @@ The given box does not exist on the file system: <%= source_url %> -:nfs_host_required: |- - A host class is required for NFS shared folders. By default, these - are auto-detected, but can be overriden with `config.vagrant.host`. - There is currently not host class loaded. -:nfs_not_supported: |- - The host class is reporting that NFS is not supported by this host, - or `nfsd` may not be installed. Please verify that `nfsd` is installed - on your machine, and retry. -:nfs_no_host_network: |- - NFS shared folders requires that host only networking is enabled. - Please enable host only networking via `config.vm.network`. -:network_not_found: |- - The specified host network could not be found: <%= name %>. - If the name specification is removed, Vagrant will create a new - host only network for you. Alternatively, please create the - specified network manually. -:network_collides: |- - The specified host network collides with a non-hostonly network! - This will cause your specified IP to be inaccessible. Please change - the IP or name of your host only network to not match that of - a bridged or non-hostonly network. :package_requires_export: |- Package must be used in conjunction with export. :provisioner_invalid_class: |- @@ -111,31 +90,6 @@ :system_unspecified: |- A VM system type must be specified! This is done via the `config.vm.system` configuration value. Please read the documentation online for more information. -:virtualbox_import_failure: |- - The VM import failed! Try running `VBoxManage import` on the box file - manually for more verbose error output. -:vm_port_auto_empty: |- - Vagrant found a port collision for the specified port and virtual machine. - While this port was marked to be auto-corrected, the ports in the - auto-correction range are all also used. - - VM: <%= vm_name %> - Forwarded port: <%= name %> (<%= options[:guestport] %> => <%= options[:hostport] %>) -:vm_port_below_threshold: |- - The host port of all forwarded ports must be above 1024. VirtualBox - does not allow host ports to be below 1024. (Guest ports below 1024 - are fine. For example: SSH on port 22 on the guest can be forwarded - to port 2222, but not 222). -:vm_port_collision: |- - Vagrant cannot forward the specified ports on this VM, since they - would collide with another VirtualBox virtual machine's forwarded - ports! The "<%= name %>" forwarded port (<%= hostport %>) is already in use on the host - machine. - - To fix this, modify your current projects Vagrantfile to use another - port. Example, where '1234' would be replaced by a unique host port: - - config.vm.forward_port("<%= name %>", <%= guestport %>, 1234) :vm_mount_fail: |- Failed to mount shared folders. vboxsf was not available. #--------------------------------------------------------------------- diff --git a/test/vagrant/action/vm/forward_ports_test.rb b/test/vagrant/action/vm/forward_ports_test.rb index 481a20e8c..2d74238fa 100644 --- a/test/vagrant/action/vm/forward_ports_test.rb +++ b/test/vagrant/action/vm/forward_ports_test.rb @@ -26,9 +26,10 @@ class ForwardPortsVMActionTest < Test::Unit::TestCase should "error if has a port below threshold" do @env.env.config.vm.forwarded_ports.clear @env.env.config.vm.forward_port("foo", 22, 222) - @klass.new(@app, @env) - assert @env.error? - assert_equal :vm_port_below_threshold, @env.error.first + + assert_raises(Vagrant::Errors::ForwardPortBelowThreshold) { + @klass.new(@app, @env) + } end should "not error if ports are fine" do @@ -84,9 +85,10 @@ class ForwardPortsVMActionTest < Test::Unit::TestCase should "error if auto forwarding is disabled" do @options[:auto] = false - @instance.handle_collision(@name, @options, @used_ports) - assert @env.error? - assert_equal :vm_port_collision, @env.error.first + + assert_raises(Vagrant::Errors::ForwardPortCollision) { + @instance.handle_collision(@name, @options, @used_ports) + } end should "set the host port to the first available port" do @@ -111,9 +113,10 @@ class ForwardPortsVMActionTest < Test::Unit::TestCase should "raise an exception if there are no auto ports available" do @env.env.config.vm.auto_port_range = (1..3) - @instance.handle_collision(@name, @options, @used_ports) - assert @env.error? - assert_equal :vm_port_auto_empty, @env.error.first + + assert_raises(Vagrant::Errors::ForwardPortAutolistEmpty) { + @instance.handle_collision(@name, @options, @used_ports) + } end end diff --git a/test/vagrant/action/vm/import_test.rb b/test/vagrant/action/vm/import_test.rb index 0388aef22..a9bebe581 100644 --- a/test/vagrant/action/vm/import_test.rb +++ b/test/vagrant/action/vm/import_test.rb @@ -33,9 +33,9 @@ class ImportVMActionTest < Test::Unit::TestCase should "mark environment erroneous and not continue chain on failure" do @app.expects(:call).never - @instance.call(@env) - - assert @env.error? + assert_raises(Vagrant::Errors::VMImportFailure) { + @instance.call(@env) + } end should "run the destroy action on recover" do diff --git a/test/vagrant/action/vm/network_test.rb b/test/vagrant/action/vm/network_test.rb index 038e837e4..bce96d70e 100644 --- a/test/vagrant/action/vm/network_test.rb +++ b/test/vagrant/action/vm/network_test.rb @@ -18,7 +18,7 @@ class NetworkVMActionTest < Test::Unit::TestCase context "initializing" do should "verify no bridge collisions for each network enabled" do @env.env.config.vm.network("foo") - @klass.any_instance.expects(:verify_no_bridge_collision).once.with() do |options| + @klass.any_instance.expects(:verify_no_bridge_collision).returns(true).once.with() do |options| assert_equal "foo", options[:ip] true end @@ -139,8 +139,9 @@ class NetworkVMActionTest < Test::Unit::TestCase mock_interface(:name => @options[:name], :interface_type => :bridged) - @instance.network_name(@options) - assert @env.error? + assert_raises(Vagrant::Errors::NetworkNotFound) { + @instance.network_name(@options) + } end should "return the network which matches the name if given" do @@ -154,9 +155,9 @@ class NetworkVMActionTest < Test::Unit::TestCase @options[:name] = "foo" @interfaces.expects(:create).never - @instance.network_name(@options) - assert @env.error? - assert_equal :network_not_found, @env.error.first + assert_raises(Vagrant::Errors::NetworkNotFound) { + @instance.network_name(@options) + } end should "create a network for the IP and netmask" do diff --git a/test/vagrant/action/vm/nfs_test.rb b/test/vagrant/action/vm/nfs_test.rb index aa24040a7..bad1e4502 100644 --- a/test/vagrant/action/vm/nfs_test.rb +++ b/test/vagrant/action/vm/nfs_test.rb @@ -66,18 +66,6 @@ class NFSVMActionTest < Test::Unit::TestCase @instance.call(@env) end - should "halt chain if environment error occured" do - @env.error!(:foo) - - seq = sequence('seq') - @instance.expects(:extract_folders).in_sequence(seq) - @instance.expects(:prepare_folders).in_sequence(seq) - @instance.expects(:clear_nfs_exports).in_sequence(seq) - @instance.expects(:export_folders).in_sequence(seq) - @app.expects(:call).never - @instance.call(@env) - end - should "not mount folders if an error occured" do seq = sequence("seq") @app.expects(:call).in_sequence(seq).with() do @@ -240,29 +228,30 @@ class NFSVMActionTest < Test::Unit::TestCase should "error environment if host is nil" do @env.env.stubs(:host).returns(nil) - @instance.verify_settings - assert @env.error? - assert_equal :nfs_host_required, @env.error.first + assert_raises(Vagrant::Errors::NFSHostRequired) { + @instance.verify_settings + } end should "error environment if host does not support NFS" do @env.env.host.stubs(:nfs?).returns(false) - @instance.verify_settings - assert @env.error? - assert_equal :nfs_not_supported, @env.error.first + assert_raises(Vagrant::Errors::NFSNotSupported) { + @instance.verify_settings + } end should "error environment if host only networking is not enabled" do @env.env.config.vm.network_options.clear - @instance.verify_settings - assert @env.error? - assert_equal :nfs_no_host_network, @env.error.first + assert_raises(Vagrant::Errors::NFSNoHostNetwork) { + @instance.verify_settings + } end should "be fine if everything passes" do @env.env.host.stubs(:nfs?).returns(true) - @instance.verify_settings - assert !@env.error? + assert_nothing_raised { + @instance.verify_settings + } end end end