Merge pull request #7866 from chrisroberts/guest-linux/network-interfaces-sorting

guests/linux: Update network interface sorting implementation
This commit is contained in:
Chris Roberts 2016-10-10 10:59:52 -07:00 committed by GitHub
commit 07ce1c6930
2 changed files with 44 additions and 12 deletions

View File

@ -20,16 +20,13 @@ module VagrantPlugins
s << data if type == :stdout
end
ifaces = s.split("\n")
eth_prefix = nil
@@logger.debug("Unsorted list: #{ifaces.inspect}")
# Break out integers from strings and sort the arrays to provide
# a natural sort for the interface names
# NOTE: Devices named with a hex value suffix will _not_ be sorted
# as expected. This is generally seen with veth* devices, and proper ordering
# is currently not required
ifaces = ifaces.map do |iface|
if eth_prefix.nil?
eth_prefix = POSSIBLE_ETHERNET_PREFIXES.detect do |prefix|
iface.start_with?(prefix)
end
end
iface.scan(/(.+?)(\d+)/).flatten.map do |iface_part|
if iface_part.to_i.to_s == iface_part
iface_part.to_i
@ -37,15 +34,32 @@ module VagrantPlugins
iface_part
end
end
end.sort.map(&:join)
end
ifaces = ifaces.sort do |lhs, rhs|
result = 0
slice_length = [rhs.size, lhs.size].min
slice_length.times do |idx|
if(lhs[idx].is_a?(rhs[idx].class))
result = lhs[idx] <=> rhs[idx]
elsif(lhs[idx].is_a?(String))
result = 1
else
result = -1
end
break if result != 0
end
result
end.map(&:join)
@@logger.debug("Sorted list: #{ifaces.inspect}")
# Extract ethernet devices and place at start of list
if eth_prefix
eth_start = ifaces.index{|iface| iface.start_with?(eth_prefix) }
eth_end = ifaces.rindex{|iface| iface.start_with?(eth_prefix) }
ifaces.unshift(*ifaces.slice!(eth_start, eth_end - 1))
@@logger.debug("Ethernet preferred sorted list: #{ifaces.inspect}")
resorted_ifaces = []
resorted_ifaces += ifaces.find_all do |iface|
POSSIBLE_ETHERNET_PREFIXES.any?{|prefix| iface.start_with?(prefix)} &&
!iface.include?(':')
end
resorted_ifaces += ifaces - resorted_ifaces
ifaces = resorted_ifaces
@@logger.debug("Ethernet preferred sorted list: #{ifaces.inspect}")
ifaces
end
end

View File

@ -56,5 +56,23 @@ describe "VagrantPlugins::GuestLinux::Cap::NetworkInterfaces" do
result = cap.network_interfaces(machine)
expect(result).to eq(["enp0s3", "enp0s5", "enp0s8", "bridge0", "docker0"])
end
it "sorts ethernet devices discovered with predictable network interfaces naming first in list with less" do
expect(comm).to receive(:sudo).and_yield(:stdout, "enp0s3\nenp0s8\ndocker0")
result = cap.network_interfaces(machine)
expect(result).to eq(["enp0s3", "enp0s8", "docker0"])
end
it "does not include ethernet devices aliases within prefix device listing" do
expect(comm).to receive(:sudo).and_yield(:stdout, "eth1\neth2\ndocker0\nbridge0\neth0\ndocker1\neth0:0")
result = cap.network_interfaces(machine)
expect(result).to eq(["eth0", "eth1", "eth2", "bridge0", "docker0", "docker1", "eth0:0"])
end
it "properly sorts non-consistent device name formats" do
expect(comm).to receive(:sudo).and_yield(:stdout, "eth0\neth1\ndocker0\nveth437f7f9\nveth06b3e44\nveth8bb7081")
result = cap.network_interfaces(machine)
expect(result).to eq(["eth0", "eth1", "docker0", "veth8bb7081", "veth437f7f9", "veth06b3e44"])
end
end
end