mirror of https://github.com/docker/docs.git
Merge branch 'master' of ssh://github.com/dotcloud/docker
This commit is contained in:
commit
5edafd6284
46
network.go
46
network.go
|
@ -485,20 +485,38 @@ type Nat struct {
|
||||||
|
|
||||||
func parseNat(spec string) (*Nat, error) {
|
func parseNat(spec string) (*Nat, error) {
|
||||||
var nat Nat
|
var nat Nat
|
||||||
// If spec starts with ':', external and internal ports must be the same.
|
|
||||||
// This might fail if the requested external port is not available.
|
if strings.Contains(spec, ":") {
|
||||||
var sameFrontend bool
|
specParts := strings.Split(spec, ":")
|
||||||
if spec[0] == ':' {
|
if len(specParts) != 2 {
|
||||||
sameFrontend = true
|
return nil, fmt.Errorf("Invalid port format.")
|
||||||
spec = spec[1:]
|
}
|
||||||
}
|
// If spec starts with ':', external and internal ports must be the same.
|
||||||
port, err := strconv.ParseUint(spec, 10, 16)
|
// This might fail if the requested external port is not available.
|
||||||
if err != nil {
|
var sameFrontend bool
|
||||||
return nil, err
|
if len(specParts[0]) == 0 {
|
||||||
}
|
sameFrontend = true
|
||||||
nat.Backend = int(port)
|
} else {
|
||||||
if sameFrontend {
|
front, err := strconv.ParseUint(specParts[0], 10, 16)
|
||||||
nat.Frontend = nat.Backend
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
nat.Frontend = int(front)
|
||||||
|
}
|
||||||
|
back, err := strconv.ParseUint(specParts[1], 10, 16)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
nat.Backend = int(back)
|
||||||
|
if sameFrontend {
|
||||||
|
nat.Frontend = nat.Backend
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
port, err := strconv.ParseUint(spec, 10, 16)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
nat.Backend = int(port)
|
||||||
}
|
}
|
||||||
nat.Proto = "tcp"
|
nat.Proto = "tcp"
|
||||||
return &nat, nil
|
return &nat, nil
|
||||||
|
|
|
@ -18,6 +18,32 @@ func TestIptables(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestParseNat(t *testing.T) {
|
||||||
|
if nat, err := parseNat("4500"); err == nil {
|
||||||
|
if nat.Frontend != 0 || nat.Backend != 4500 {
|
||||||
|
t.Errorf("-p 4500 should produce 0->4500, got %d->%d", nat.Frontend, nat.Backend)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if nat, err := parseNat(":4501"); err == nil {
|
||||||
|
if nat.Frontend != 4501 || nat.Backend != 4501 {
|
||||||
|
t.Errorf("-p :4501 should produce 4501->4501, got %d->%d", nat.Frontend, nat.Backend)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if nat, err := parseNat("4502:4503"); err == nil {
|
||||||
|
if nat.Frontend != 4502 || nat.Backend != 4503 {
|
||||||
|
t.Errorf("-p 4502:4503 should produce 4502->4503, got %d->%d", nat.Frontend, nat.Backend)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestPortAllocation(t *testing.T) {
|
func TestPortAllocation(t *testing.T) {
|
||||||
allocator, err := newPortAllocator()
|
allocator, err := newPortAllocator()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
Loading…
Reference in New Issue