From a6a42b31df397ebd7afdef0704a6fe667db25ba0 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Sat, 4 Feb 2012 15:04:28 +0100 Subject: [PATCH] Ability to specify `:bridge` to networking [GH-655] --- CHANGELOG.md | 2 + lib/vagrant/action/vm/network.rb | 71 ++++++++++++++++++++++---------- templates/locales/en.yml | 3 ++ 3 files changed, 55 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 93dedf5ba..e1ccfc4e3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,8 @@ that are up as choices. [GH-701] - More intelligent handling of the `certname` option for puppet server. [GH-702] + - You may now explicitly set the network to bridge to in the Vagrantfile + using the `:bridge` parameter. [GH-655] ## 0.9.4 (January 28, 2012) diff --git a/lib/vagrant/action/vm/network.rb b/lib/vagrant/action/vm/network.rb index 8f2ddcf74..66ebf6652 100644 --- a/lib/vagrant/action/vm/network.rb +++ b/lib/vagrant/action/vm/network.rb @@ -313,6 +313,7 @@ module Vagrant return { :adapter => nil, :mac => nil, + :bridge => nil, :auto_config => true }.merge(options) end @@ -322,32 +323,60 @@ module Vagrant bridgedifs = @env[:vm].driver.read_bridged_interfaces bridgedifs.delete_if { |interface| interface[:status] == "Down" } + # The name of the chosen bridge interface will be assigned to this + # variable. chosen_bridge = nil - if bridgedifs.length == 1 - # One bridgable interface? Just use it. - chosen_bridge = bridgedifs[0][:name] - @logger.debug("Only one bridged interface available. Using it by default.") - else - # More than one bridgable interface requires a user decision, so - # show options to choose from. - @env[:ui].info I18n.t("vagrant.actions.vm.bridged_networking.available", - :prefix => false) - bridgedifs.each_index do |index| - interface = bridgedifs[index] - @env[:ui].info("#{index + 1}) #{interface[:name]}", :prefix => false) + + if config[:bridge] + @logger.debug("Bridge was directly specified in config, searching for: #{config[:bridge]}") + + # Search for a matching bridged interface + bridgedifs.each do |interface| + if interface[:name].downcase == config[:bridge].downcase + @logger.debug("Specific bridge found as configured in the Vagrantfile. Using it.") + chosen_bridge = interface[:name] + break + end end - # The range of valid choices - valid = Range.new(1, bridgedifs.length) - - # The choice that the user has chosen as the bridging interface - choice = nil - while !valid.include?(choice) - choice = @env[:ui].ask("What interface should the network bridge to? ") - choice = choice.to_i + # If one wasn't found, then we notify the user here. + if !chosen_bridge + @env[:ui].info I18n.t("vagrant.actions.vm.bridged_networking.specific_not_found", + :bridge => config[:bridge]) end + end - chosen_bridge = bridgedifs[choice - 1][:name] + # If we still don't have a bridge chosen (this means that one wasn't + # specified in the Vagrantfile, or the bridge specified in the Vagrantfile + # wasn't found), then we fall back to the normal means of searchign for a + # bridged network. + if !chosen_bridge + if bridgedifs.length == 1 + # One bridgable interface? Just use it. + chosen_bridge = bridgedifs[0][:name] + @logger.debug("Only one bridged interface available. Using it by default.") + else + # More than one bridgable interface requires a user decision, so + # show options to choose from. + @env[:ui].info I18n.t("vagrant.actions.vm.bridged_networking.available", + :prefix => false) + bridgedifs.each_index do |index| + interface = bridgedifs[index] + @env[:ui].info("#{index + 1}) #{interface[:name]}", :prefix => false) + end + + # The range of valid choices + valid = Range.new(1, bridgedifs.length) + + # The choice that the user has chosen as the bridging interface + choice = nil + while !valid.include?(choice) + choice = @env[:ui].ask("What interface should the network bridge to? ") + choice = choice.to_i + end + + chosen_bridge = bridgedifs[choice - 1][:name] + end end @logger.info("Bridging adapter #{config[:adapter]} to #{chosen_bridge}") diff --git a/templates/locales/en.yml b/templates/locales/en.yml index 9440a50aa..95ecb8a71 100644 --- a/templates/locales/en.yml +++ b/templates/locales/en.yml @@ -299,6 +299,9 @@ en: Enabling bridged network... preparing: |- Preparing bridged networking... + specific_not_found: |- + Specific bridge '%{bridge}' not found. You may be asked to specify + which network to bridge to. check_box: not_found: Box %{name} was not found. Fetching box from specified URL... not_specified: |-