Customize #read_network_interfaces for hostonlynetworks
Adds an override for the #read_network_interfaces when hostonlynetworks are in use to properly identify the hostonly network information from the guest. This also adjusts the IP provided for the network to be the first in the subnet.
This commit is contained in:
parent
aa3be5b6ab
commit
9e4047533d
@ -157,11 +157,11 @@ module VagrantPlugins
|
||||
addr = IPAddr.new(net[:lowerip])
|
||||
net[:netmask] = net[:networkmask]
|
||||
if addr.ipv4?
|
||||
net[:ip] = addr.mask(net[:netmask]).to_s
|
||||
net[:ip] = addr.mask(net[:netmask]).succ.to_s
|
||||
net[:ipv6] = ""
|
||||
else
|
||||
net[:ip] = ""
|
||||
net[:ipv6] = addr.mask(net[:netmwask]).to_s
|
||||
net[:ipv6] = addr.mask(net[:netmwask]).succ.to_s
|
||||
net[:ipv6_prefix] = net[:netmask]
|
||||
end
|
||||
|
||||
@ -171,6 +171,29 @@ module VagrantPlugins
|
||||
end
|
||||
end
|
||||
|
||||
def read_network_interfaces
|
||||
return super if !use_host_only_nets?
|
||||
|
||||
{}.tap do |nics|
|
||||
execute("showvminfo", @uuid, "--machinereadable", retryable: true).each_line do |line|
|
||||
if m = line.match(/nic(?<adapter>\d+)="(?<type>.+?)"$/)
|
||||
nics[m[:adapter].to_i] ||= {}
|
||||
if m[:type] == "hostonlynetwork"
|
||||
nics[m[:adapter].to_i][:type] = :hostonly
|
||||
else
|
||||
nics[m[:adapter].to_i][:type] = m[:type].to_sym
|
||||
end
|
||||
elsif m = line.match(/^bridgeadapter(?<adapter>\d+)="(?<network>.+?)"$/)
|
||||
nics[m[:adapter].to_i] ||= {}
|
||||
nics[m[:adapter].to_i][:bridge] = m[:network]
|
||||
elsif m = line.match(/^hostonly-network(?<adapter>\d+)="(?<network>.+?)"$/)
|
||||
nics[m[:adapter].to_i] ||= {}
|
||||
nics[m[:adapter].to_i][:hostonly] = m[:network]
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# Generate list of host only networks
|
||||
def read_host_only_networks
|
||||
networks = []
|
||||
|
||||
@ -563,6 +563,12 @@ memory=1024)
|
||||
expect(result.first[:netmask]).to eq(result.first[:networkmask])
|
||||
expect(result.first[:status]).to eq("Up")
|
||||
end
|
||||
|
||||
it "should assign the address as the first in the subnet" do
|
||||
result = subject.read_host_only_interfaces
|
||||
ip = IPAddr.new(result.first[:lowerip]).mask(result.first[:networkmask])
|
||||
expect(result.first[:ip]).to eq(ip.succ.to_s)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -586,6 +592,71 @@ memory=1024)
|
||||
expect(result.last[:networkmask]).to eq("255.255.255.0")
|
||||
end
|
||||
end
|
||||
|
||||
describe "#read_network_interfaces" do
|
||||
before do
|
||||
allow(subject)
|
||||
.to receive(:execute).
|
||||
with("showvminfo", any_args).
|
||||
and_return(VBOX_GUEST_HOSTONLYVNETS_INFO)
|
||||
end
|
||||
|
||||
context "when hostonlynets is disabled" do
|
||||
before do
|
||||
allow(subject).to receive(:use_host_only_nets?).and_return(false)
|
||||
end
|
||||
|
||||
it "should return two interfaces" do
|
||||
valid_interfaces = subject.read_network_interfaces.find_all { |k, v|
|
||||
v[:type] != :none
|
||||
}
|
||||
expect(valid_interfaces.size).to eq(2)
|
||||
end
|
||||
|
||||
it "should include a nat type" do
|
||||
expect(subject.read_network_interfaces.detect { |_, v| v[:type] == :nat }).to be
|
||||
end
|
||||
|
||||
it "should include a hostonlynetwork type with no information" do
|
||||
expect(subject.read_network_interfaces[2]).to eq({type: :hostonlynetwork})
|
||||
end
|
||||
end
|
||||
|
||||
context "when hostonlynets is enabled" do
|
||||
before do
|
||||
allow(subject).to receive(:use_host_only_nets?).and_return(true)
|
||||
end
|
||||
|
||||
it "should return two interfaces" do
|
||||
valid_interfaces = subject.read_network_interfaces.find_all { |k, v|
|
||||
v[:type] != :none
|
||||
}
|
||||
expect(valid_interfaces.size).to eq(2)
|
||||
end
|
||||
|
||||
it "should include a nat type" do
|
||||
expect(subject.read_network_interfaces.detect { |_, v| v[:type] == :nat }).to be
|
||||
end
|
||||
|
||||
it "should include a hostonly type" do
|
||||
expect(subject.read_network_interfaces.detect { |_, v| v[:type] == :hostonly }).to be
|
||||
end
|
||||
|
||||
it "should not include a hostonlynetwork type" do
|
||||
expect(subject.read_network_interfaces.detect { |_, v|
|
||||
v[:type] == :hostonlynetwork
|
||||
}).to_not be
|
||||
end
|
||||
|
||||
it "should include the hostonly network name" do
|
||||
hostonly = subject.read_network_interfaces.values.detect { |v|
|
||||
v[:type] == :hostonly
|
||||
}
|
||||
expect(hostonly).to be
|
||||
expect(hostonly[:hostonly]).to eq("vagrantnet-vbox1")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
VBOX_VMCONFIG_FILE=%(<?xml version="1.0"?>
|
||||
@ -695,3 +766,30 @@ NetworkMask: 255.255.255.0
|
||||
LowerIP: 192.168.22.0
|
||||
UpperIP: 192.168.22.0
|
||||
VBoxNetworkName: hostonly-vagrantnet-vbox2)
|
||||
|
||||
VBOX_GUEST_HOSTONLYVNETS_INFO=%(
|
||||
natnet1="nat"
|
||||
macaddress1="080027BB1475"
|
||||
cableconnected1="on"
|
||||
nic1="nat"
|
||||
nictype1="82540EM"
|
||||
nicspeed1="0"
|
||||
mtu="0"
|
||||
sockSnd="64"
|
||||
sockRcv="64"
|
||||
tcpWndSnd="64"
|
||||
tcpWndRcv="64"
|
||||
Forwarding(0)="ssh,tcp,127.0.0.1,2222,,22"
|
||||
hostonly-network2="vagrantnet-vbox1"
|
||||
macaddress2="080027FBC15B"
|
||||
cableconnected2="on"
|
||||
nic2="hostonlynetwork"
|
||||
nictype2="82540EM"
|
||||
nicspeed2="0"
|
||||
nic3="none"
|
||||
nic4="none"
|
||||
nic5="none"
|
||||
nic6="none"
|
||||
nic7="none"
|
||||
nic8="none"
|
||||
)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user