Merge pull request #7705 from chrisroberts/fix/linux-guest-net-iface
guests/linux: Always order discovered network interfaces
This commit is contained in:
commit
4b3fefe220
|
@ -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
|
||||||
|
|
|
@ -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
|
Loading…
Reference in New Issue