Merge pull request #10409 from chrisroberts/e-vbox-ssh-port-detect

Update VirtualBox driver ssh_port helper
This commit is contained in:
Chris Roberts 2018-11-13 15:44:15 -08:00 committed by GitHub
commit efbf99c451
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 67 additions and 5 deletions

View File

@ -689,12 +689,21 @@ module VagrantPlugins
def ssh_port(expected_port)
@logger.debug("Searching for SSH port: #{expected_port.inspect}")
# Look for the forwarded port only by comparing the guest port
read_forwarded_ports.each do |_, _, hostport, guestport|
return hostport if guestport == expected_port
end
# Look for the forwarded port. Valid based on the guest port, but will do
# scoring based matching to determine best value when multiple results are
# available.
matches = read_forwarded_ports.map do |_, name, hostport, guestport, host_ip|
next if guestport != expected_port
match = [0, hostport]
match[0] += 1 if name == "ssh"
match[0] += 1 if name.downcase == "ssh"
match[0] += 1 if host_ip == "127.0.0.1"
match
end.compact
nil
result = matches.sort_by(&:first).last
result.last if result
end
def resume

View File

@ -79,4 +79,57 @@ describe VagrantPlugins::ProviderVirtualBox::Driver::Version_5_0 do
end
end
end
describe "#ssh_port" do
let(:forwards) {
[[1, "ssh", 2222, 22, "127.0.0.1"],
[1, "ssh", 8080, 80, ""]]
}
before { allow(subject).to receive(:read_forwarded_ports).and_return(forwards) }
it "should return the host port" do
expect(subject.ssh_port(22)).to eq(2222)
end
context "when multiple matches are available" do
let(:forwards) {
[[1, "ssh", 2222, 22, "127.0.0.1"],
[1, "", 2221, 22, ""]]
}
it "should choose localhost port forward" do
expect(subject.ssh_port(22)).to eq(2222)
end
context "when multiple named matches are available" do
let(:forwards) {
[[1, "ssh", 2222, 22, "127.0.0.1"],
[1, "SSH", 2221, 22, "127.0.0.1"]]
}
it "should choose lowercased name forward" do
expect(subject.ssh_port(22)).to eq(2222)
end
end
end
context "when only ports are defined" do
let(:forwards) {
[[1, "", 2222, 22, ""]]
}
it "should return the host port" do
expect(subject.ssh_port(22)).to eq(2222)
end
end
context "when no matches are available" do
let(:forwards) { [] }
it "should return nil" do
expect(subject.ssh_port(22)).to be_nil
end
end
end
end