Merge pull request #7705 from chrisroberts/fix/linux-guest-net-iface

guests/linux: Always order discovered network interfaces
This commit is contained in:
Chris Roberts 2016-08-12 10:37:01 -07:00 committed by GitHub
commit 4b3fefe220
2 changed files with 65 additions and 1 deletions

View File

@ -2,6 +2,8 @@ module VagrantPlugins
module GuestLinux module GuestLinux
module Cap module Cap
class NetworkInterfaces class NetworkInterfaces
@@logger = Log4r::Logger.new("vagrant::guest::linux::network_interfaces")
# Get network interfaces as a list. The result will be something like: # Get network interfaces as a list. The result will be something like:
# #
# eth0\nenp0s8\nenp0s9 # eth0\nenp0s8\nenp0s9
@ -12,7 +14,21 @@ module VagrantPlugins
machine.communicate.sudo("#{path} -o -0 addr | grep -v LOOPBACK | awk '{print $2}' | sed 's/://'") do |type, data| machine.communicate.sudo("#{path} -o -0 addr | grep -v LOOPBACK | awk '{print $2}' | sed 's/://'") do |type, data|
s << data if type == :stdout s << data if type == :stdout
end end
s.split("\n") ifaces = s.split("\n")
@@logger.debug("Unsorted list: #{ifaces.inspect}")
# Break out integers from strings and sort the arrays to provide
# a natural sort for the interface names
ifaces = ifaces.map do |iface|
iface.scan(/(.+?)(\d+)/).flatten.map do |iface_part|
if iface_part.to_i.to_s == iface_part
iface_part.to_i
else
iface_part
end
end
end.sort.map(&:join)
@@logger.debug("Sorted list: #{ifaces.inspect}")
ifaces
end end
end end
end end

View File

@ -0,0 +1,48 @@
require_relative "../../../../base"
describe "VagrantPlugins::GuestLinux::Cap::NetworkInterfaces" do
let(:caps) do
VagrantPlugins::GuestLinux::Plugin
.components
.guest_capabilities[:linux]
end
let(:machine) { double("machine") }
let(:comm) { VagrantTests::DummyCommunicator::Communicator.new(machine) }
before do
allow(machine).to receive(:communicate).and_return(comm)
end
after do
comm.verify_expectations!
end
describe ".network_interfaces" do
let(:cap){ caps.get(:network_interfaces) }
it "sorts discovered classic interfaces" do
expect(comm).to receive(:sudo).and_yield(:stdout, "eth1\neth2\neth0")
result = cap.network_interfaces(machine)
expect(result).to eq(["eth0", "eth1", "eth2"])
end
it "sorts discovered predictable network interfaces" do
expect(comm).to receive(:sudo).and_yield(:stdout, "enp0s8\nenp0s3\nenp0s5")
result = cap.network_interfaces(machine)
expect(result).to eq(["enp0s3", "enp0s5", "enp0s8"])
end
it "sorts discovered classic interfaces naturally" do
expect(comm).to receive(:sudo).and_yield(:stdout, "eth1\neth2\neth12\neth0\neth10")
result = cap.network_interfaces(machine)
expect(result).to eq(["eth0", "eth1", "eth2", "eth10", "eth12"])
end
it "sorts discovered predictable network interfaces naturally" do
expect(comm).to receive(:sudo).and_yield(:stdout, "enp0s8\nenp0s3\nenp0s5\nenp0s10\nenp1s3")
result = cap.network_interfaces(machine)
expect(result).to eq(["enp0s3", "enp0s5", "enp0s8", "enp0s10", "enp1s3"])
end
end
end