Nice error message if port collisions are detected on `resume` [GH-602]

This commit is contained in:
Mitchell Hashimoto 2011-12-25 09:48:49 -08:00
parent fc9bda08cd
commit 76f605f08d
5 changed files with 39 additions and 0 deletions

View File

@ -29,6 +29,7 @@ module Vagrant
autoload :CheckAccessible, 'vagrant/action/vm/check_accessible' autoload :CheckAccessible, 'vagrant/action/vm/check_accessible'
autoload :CheckBox, 'vagrant/action/vm/check_box' autoload :CheckBox, 'vagrant/action/vm/check_box'
autoload :CheckGuestAdditions, 'vagrant/action/vm/check_guest_additions' autoload :CheckGuestAdditions, 'vagrant/action/vm/check_guest_additions'
autoload :CheckPortCollisions, 'vagrant/action/vm/check_port_collisions'
autoload :CleanMachineFolder, 'vagrant/action/vm/clean_machine_folder' autoload :CleanMachineFolder, 'vagrant/action/vm/clean_machine_folder'
autoload :ClearForwardedPorts, 'vagrant/action/vm/clear_forwarded_ports' autoload :ClearForwardedPorts, 'vagrant/action/vm/clear_forwarded_ports'
autoload :ClearNFSExports, 'vagrant/action/vm/clear_nfs_exports' autoload :ClearNFSExports, 'vagrant/action/vm/clear_nfs_exports'

View File

@ -59,6 +59,7 @@ module Vagrant
Builder.new do Builder.new do
use General::Validate use General::Validate
use VM::CheckAccessible use VM::CheckAccessible
use VM::CheckPortCollisions
use VM::Resume use VM::Resume
end end
end end

View File

@ -0,0 +1,26 @@
module Vagrant
module Action
module VM
# Action that checks to make sure there are no forwarded port collisions,
# and raises an exception if there is.
class CheckPortCollisions
def initialize(app, env)
@app = app
end
def call(env)
existing = env[:vm].driver.read_used_ports
env[:vm].config.vm.forwarded_ports.each do |name, options|
if existing.include?(options[:hostport].to_i)
# We have a collision!
raise Errors::ForwardPortCollisionResume
end
end
@app.call(env)
end
end
end
end
end

View File

@ -188,6 +188,11 @@ module Vagrant
error_key(:collision_error, "vagrant.actions.vm.forward_ports") error_key(:collision_error, "vagrant.actions.vm.forward_ports")
end end
class ForwardPortCollisionResume < VagrantError
status_code(62)
error_key(:port_collision_resume)
end
class MultiVMEnvironmentRequired < VagrantError class MultiVMEnvironmentRequired < VagrantError
status_code(5) status_code(5)
error_key(:multi_vm_required) error_key(:multi_vm_required)

View File

@ -71,6 +71,12 @@ en:
no_env: |- no_env: |-
A Vagrant environment is required to run this command. Run `vagrant init` A Vagrant environment is required to run this command. Run `vagrant init`
to set one up. to set one up.
port_collision_resume: |-
This VM cannot be resumed, because the forwarded ports would collide with
another running virtual machine. Normally, Vagrant will attempt to fix this
for you but VirtualBox only allows forwarded ports to change if the VM is
powered off. Therefore, please reload your VM or halt the other running
VMs to continue.
scp_unavailable: |- scp_unavailable: |-
SSH server on the guest doesn't support SCP. Please install the necessary SSH server on the guest doesn't support SCP. Please install the necessary
software to enable SCP on your guest operating system. software to enable SCP on your guest operating system.