Merge pull request #70931 from m1kola/port-forward-consistency

Fixes inconsistent behaviour in portforward

Kubernetes-commit: 162b79d2ec402d895e3738c240986590932508f4
This commit is contained in:
Kubernetes Publisher 2019-02-10 19:37:27 -08:00
commit ae78dce898
2 changed files with 68 additions and 4 deletions

View File

@ -23,6 +23,7 @@ import (
"io/ioutil" "io/ioutil"
"net" "net"
"net/http" "net/http"
"sort"
"strconv" "strconv"
"strings" "strings"
"sync" "sync"
@ -122,10 +123,14 @@ func parseAddresses(addressesToParse []string) ([]listenAddress, error) {
parsed := make(map[string]listenAddress) parsed := make(map[string]listenAddress)
for _, address := range addressesToParse { for _, address := range addressesToParse {
if address == "localhost" { if address == "localhost" {
if _, exists := parsed["127.0.0.1"]; !exists {
ip := listenAddress{address: "127.0.0.1", protocol: "tcp4", failureMode: "all"} ip := listenAddress{address: "127.0.0.1", protocol: "tcp4", failureMode: "all"}
parsed[ip.address] = ip parsed[ip.address] = ip
ip = listenAddress{address: "::1", protocol: "tcp6", failureMode: "all"} }
if _, exists := parsed["::1"]; !exists {
ip := listenAddress{address: "::1", protocol: "tcp6", failureMode: "all"}
parsed[ip.address] = ip parsed[ip.address] = ip
}
} else if net.ParseIP(address).To4() != nil { } else if net.ParseIP(address).To4() != nil {
parsed[address] = listenAddress{address: address, protocol: "tcp4", failureMode: "any"} parsed[address] = listenAddress{address: address, protocol: "tcp4", failureMode: "any"}
} else if net.ParseIP(address) != nil { } else if net.ParseIP(address) != nil {
@ -140,6 +145,9 @@ func parseAddresses(addressesToParse []string) ([]listenAddress, error) {
addresses[id] = v addresses[id] = v
id++ id++
} }
// Sort addresses before returning to get a stable order
sort.Slice(addresses, func(i, j int) bool { return addresses[i].address < addresses[j].address })
return addresses, nil return addresses, nil
} }

View File

@ -83,6 +83,62 @@ func TestParsePortsAndNew(t *testing.T) {
{protocol: "tcp6", address: "::1", failureMode: "all"}, {protocol: "tcp6", address: "::1", failureMode: "all"},
}, },
}, },
{
input: []string{"5000:5000"},
addresses: []string{"localhost", "::1"},
expectedPorts: []ForwardedPort{
{5000, 5000},
},
expectedAddresses: []listenAddress{
{protocol: "tcp4", address: "127.0.0.1", failureMode: "all"},
{protocol: "tcp6", address: "::1", failureMode: "any"},
},
},
{
input: []string{"5000:5000"},
addresses: []string{"localhost", "127.0.0.1", "::1"},
expectedPorts: []ForwardedPort{
{5000, 5000},
},
expectedAddresses: []listenAddress{
{protocol: "tcp4", address: "127.0.0.1", failureMode: "any"},
{protocol: "tcp6", address: "::1", failureMode: "any"},
},
},
{
input: []string{"5000:5000"},
addresses: []string{"localhost", "127.0.0.1", "10.10.10.1"},
expectedPorts: []ForwardedPort{
{5000, 5000},
},
expectedAddresses: []listenAddress{
{protocol: "tcp4", address: "127.0.0.1", failureMode: "any"},
{protocol: "tcp6", address: "::1", failureMode: "all"},
{protocol: "tcp4", address: "10.10.10.1", failureMode: "any"},
},
},
{
input: []string{"5000:5000"},
addresses: []string{"127.0.0.1", "::1", "localhost"},
expectedPorts: []ForwardedPort{
{5000, 5000},
},
expectedAddresses: []listenAddress{
{protocol: "tcp4", address: "127.0.0.1", failureMode: "any"},
{protocol: "tcp6", address: "::1", failureMode: "any"},
},
},
{
input: []string{"5000:5000"},
addresses: []string{"10.0.0.1", "127.0.0.1"},
expectedPorts: []ForwardedPort{
{5000, 5000},
},
expectedAddresses: []listenAddress{
{protocol: "tcp4", address: "10.0.0.1", failureMode: "any"},
{protocol: "tcp4", address: "127.0.0.1", failureMode: "any"},
},
},
{ {
input: []string{"5000", "5000:5000", "8888:5000", "5000:8888", ":5000", "0:5000"}, input: []string{"5000", "5000:5000", "8888:5000", "5000:8888", ":5000", "0:5000"},
addresses: []string{"127.0.0.1", "::1"}, addresses: []string{"127.0.0.1", "::1"},