Merge pull request #12992 from chrisroberts/vbox-networks-nfs

VirtualBox read networks support with hostonlynets
This commit is contained in:
Chris Roberts 2022-11-14 12:14:03 -08:00 committed by GitHub
commit d8de3016ea
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 123 additions and 2 deletions

View File

@ -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 = []

View File

@ -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"
)