Join a specific host only network if name is specified.

This commit is contained in:
Mitchell Hashimoto 2010-06-03 00:17:04 -07:00
parent 77f7b09a26
commit d16efa1a34
5 changed files with 47 additions and 12 deletions

View File

@ -19,40 +19,46 @@ module Vagrant
def assign_network
logger.info "Enabling host only network..."
options = runner.env.config.vm.network_options
adapter = runner.vm.network_adapters[options[:adapter]]
network_options = runner.env.config.vm.network_options
adapter = runner.vm.network_adapters[network_options[:adapter]]
adapter.enabled = true
adapter.attachment_type = :host_only
adapter.host_interface = network_name(options)
adapter.host_interface = network_name(network_options)
adapter.save
end
# Returns the name of the proper host only network, or creates
# it if it does not exist. Vagrant determines if the host only
# network exists by comparing the netmask and the IP.
def network_name(options)
def network_name(net_options)
# First try to find a matching network
interfaces = VirtualBox::Global.global.host.network_interfaces
interfaces.each do |ni|
return ni.name if matching_network?(ni, options)
if net_options[:name]
return ni.name if net_options[:name] == ni.name
else
return ni.name if matching_network?(ni, net_options)
end
end
raise ActionException.new(:network_not_found, :name => net_options[:name]) if net_options[:name]
# One doesn't exist, create it.
logger.info "Creating new host only network for environment..."
ni = interfaces.create
ni.enable_static(network_ip(options[:ip], options[:netmask]),
options[:netmask])
ni.enable_static(network_ip(net_options[:ip], net_options[:netmask]),
net_options[:netmask])
ni.name
end
# Tests if a network matches the given options by applying the
# netmask to the IP of the network and also to the IP of the
# virtual machine and see if they match.
def matching_network?(interface, options)
interface.network_mask == options[:netmask] &&
def matching_network?(interface, net_options)
interface.network_mask == net_options[:netmask] &&
apply_netmask(interface.ip_address, interface.network_mask) ==
apply_netmask(options[:ip], options[:netmask])
apply_netmask(net_options[:ip], net_options[:netmask])
end
# Applies a netmask to an IP and returns the corresponding

View File

@ -136,6 +136,7 @@ module Vagrant
options = {
:ip => ip,
:netmask => "255.255.255.0",
:adapter => 1,
:name => nil
}.merge(options || {})

View File

@ -111,6 +111,11 @@
already be created, but unfortunately this vagrant still appears to
have no box! You can setup the environment by setting up your
<%= Vagrant::Environment::ROOTFILE_NAME %> and running `vagrant up`
: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.
:package_include_file_doesnt_exist: |-
File specified to include: '<%= filename %>' does not exist!
:package_multivm: |-

View File

@ -70,7 +70,7 @@ class NetworkTest < Test::Unit::TestCase
@action.stubs(:matching_network?).returns(false)
@options = { :ip => :foo, :netmask => :bar }
@options = { :ip => :foo, :netmask => :bar, :name => nil }
end
should "return the network which matches" do
@ -83,6 +83,26 @@ class NetworkTest < Test::Unit::TestCase
assert_equal result, @action.network_name(@options)
end
should "return the network which matches the name if given" do
@options[:name] = "foo"
interface = mock("interface")
interface.stubs(:name).returns(@options[:name])
@interfaces << interface
assert_equal @options[:name], @action.network_name(@options)
end
should "error and exit if the given network name is not found" do
@options[:name] = "foo"
@interfaces.expects(:create).never
assert_raises(Vagrant::Actions::ActionException) {
@action.network_name(@options)
}
end
should "create a network for the IP and netmask" do
result = mock("result")
interface = mock("interface")

View File

@ -9,7 +9,7 @@ Gem::Specification.new do |s|
s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
s.authors = ["Mitchell Hashimoto", "John Bender"]
s.date = %q{2010-05-30}
s.date = %q{2010-06-03}
s.default_executable = %q{vagrant}
s.description = %q{Vagrant is a tool for building and distributing virtualized development environments.}
s.email = ["mitchell.hashimoto@gmail.com", "john.m.bender@gmail.com"]
@ -50,6 +50,7 @@ Gem::Specification.new do |s|
"lib/vagrant/actions/vm/halt.rb",
"lib/vagrant/actions/vm/import.rb",
"lib/vagrant/actions/vm/move_hard_drive.rb",
"lib/vagrant/actions/vm/network.rb",
"lib/vagrant/actions/vm/package.rb",
"lib/vagrant/actions/vm/provision.rb",
"lib/vagrant/actions/vm/reload.rb",
@ -128,6 +129,7 @@ Gem::Specification.new do |s|
"test/vagrant/actions/vm/halt_test.rb",
"test/vagrant/actions/vm/import_test.rb",
"test/vagrant/actions/vm/move_hard_drive_test.rb",
"test/vagrant/actions/vm/network_test.rb",
"test/vagrant/actions/vm/package_test.rb",
"test/vagrant/actions/vm/provision_test.rb",
"test/vagrant/actions/vm/reload_test.rb",
@ -218,6 +220,7 @@ Gem::Specification.new do |s|
"test/vagrant/actions/vm/import_test.rb",
"test/vagrant/actions/vm/customize_test.rb",
"test/vagrant/actions/vm/start_test.rb",
"test/vagrant/actions/vm/network_test.rb",
"test/vagrant/actions/vm/move_hard_drive_test.rb",
"test/vagrant/actions/vm/up_test.rb",
"test/vagrant/actions/vm/export_test.rb",