Fix tests and clear fmt mess in manager.go

This commit is contained in:
Harry Zhang 2015-08-31 20:53:02 +08:00
parent 18315db025
commit 7b2e2e5649
2 changed files with 73 additions and 45 deletions

View File

@ -22,6 +22,7 @@ import (
"hash/adler32" "hash/adler32"
"reflect" "reflect"
"sort" "sort"
"strconv"
"strings" "strings"
"testing" "testing"
@ -698,55 +699,81 @@ func TestMakePortsAndBindings(t *testing.T) {
HostPort: 445, HostPort: 445,
Protocol: "foobar", Protocol: "foobar",
}, },
{ {
ContainerPort: 443, ContainerPort: 443,
HostPort: 446, HostPort: 446,
Protocol: "tcp", Protocol: "tcp",
}, },
{
ContainerPort: 443,
HostPort: 446,
Protocol: "udp",
},
} }
exposedPorts, bindings := makePortsAndBindings(ports) exposedPorts, bindings := makePortsAndBindings(ports)
if len(ports) != len(exposedPorts) ||
len(ports) != len(bindings) { // Count the expected exposed ports and bindings
expectedExposedPorts := map[string]struct{}{}
for _, binding := range ports {
dockerKey := strconv.Itoa(binding.ContainerPort) + "/" + string(binding.Protocol)
expectedExposedPorts[dockerKey] = struct{}{}
}
// Should expose right ports in docker
if len(expectedExposedPorts) != len(exposedPorts) {
t.Errorf("Unexpected ports and bindings, %#v %#v %#v", ports, exposedPorts, bindings) t.Errorf("Unexpected ports and bindings, %#v %#v %#v", ports, exposedPorts, bindings)
} }
for key, value := range bindings {
switch value[0].HostPort { // Construct expected bindings
case "8080": expectPortBindings := map[string][]docker.PortBinding{
if !reflect.DeepEqual(docker.Port("80/tcp"), key) { "80/tcp": {
t.Errorf("Unexpected docker port: %#v", key) docker.PortBinding{
} HostPort: "8080",
if value[0].HostIP != "127.0.0.1" { HostIP: "127.0.0.1",
t.Errorf("Unexpected host IP: %s", value[0].HostIP) },
} },
case "443": "443/tcp": {
if !reflect.DeepEqual(docker.Port("443/tcp"), key) { docker.PortBinding{
t.Errorf("Unexpected docker port: %#v", key) HostPort: "443",
} HostIP: "",
if value[0].HostIP != "" { },
t.Errorf("Unexpected host IP: %s", value[0].HostIP) docker.PortBinding{
} HostPort: "446",
case "444": HostIP: "",
if !reflect.DeepEqual(docker.Port("444/udp"), key) { },
t.Errorf("Unexpected docker port: %#v", key) },
} "443/udp": {
if value[0].HostIP != "" { docker.PortBinding{
t.Errorf("Unexpected host IP: %s", value[0].HostIP) HostPort: "446",
} HostIP: "",
case "445": },
if !reflect.DeepEqual(docker.Port("445/tcp"), key) { },
t.Errorf("Unexpected docker port: %#v", key) "444/udp": {
} docker.PortBinding{
if value[0].HostIP != "" { HostPort: "444",
t.Errorf("Unexpected host IP: %s", value[0].HostIP) HostIP: "",
} },
case "446": },
// allow multiple host ports bind to same container port "445/tcp": {
if !reflect.DeepEqual(docker.Port("443/tcp"), key) { docker.PortBinding{
t.Errorf("Unexpected docker port: %#v", key) HostPort: "445",
} HostIP: "",
if value[0].HostIP != "" { },
t.Errorf("Unexpected host IP: %s", value[0].HostIP) },
}
// interate the bindings by dockerPort, and check its portBindings
for dockerPort, portBindings := range bindings {
switch dockerPort {
case "80/tcp", "443/tcp", "443/udp", "444/udp", "445/tcp":
if !reflect.DeepEqual(expectPortBindings[string(dockerPort)], portBindings) {
t.Errorf("Unexpected portbindings for %#v, expected: %#v, but got: %#v",
dockerPort, expectPortBindings[string(dockerPort)], portBindings)
} }
default:
t.Errorf("Unexpected docker port: %#v with portbindings: %#v", dockerPort, portBindings)
} }
} }
} }

View File

@ -571,17 +571,18 @@ func makePortsAndBindings(portMappings []kubecontainer.PortMapping) (map[docker.
glog.Warningf("Unknown protocol %q: defaulting to TCP", port.Protocol) glog.Warningf("Unknown protocol %q: defaulting to TCP", port.Protocol)
protocol = "/tcp" protocol = "/tcp"
} }
dockerPort := docker.Port(strconv.Itoa(interiorPort) + protocol) dockerPort := docker.Port(strconv.Itoa(interiorPort) + protocol)
exposedPorts[dockerPort] = struct{}{} exposedPorts[dockerPort] = struct{}{}
hostBinding := docker.PortBinding{ hostBinding := docker.PortBinding{
HostPort: strconv.Itoa(exteriorPort), HostPort: strconv.Itoa(exteriorPort),
HostIP: port.HostIP, HostIP: port.HostIP,
} }
// Allow multiple host ports bind to same container port // Allow multiple host ports bind to same docker port
if existedBindings := portBindings[dockerPort]; len(existedBindings) != 0 { if existedBindings, ok := portBindings[dockerPort]; ok {
// If a container port already map to a host port, append to the host ports // If a docker port already map to a host port, just append the host ports
portBindings[dockerPort] = append(existedBindings, hostBinding) portBindings[dockerPort] = append(existedBindings, hostBinding)
} else { } else {
// Otherwise, it's fresh new port binding // Otherwise, it's fresh new port binding