github.com/afein/docker@v1.8.2/integration-cli/docker_cli_nat_test.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "net" 7 "strings" 8 9 "github.com/go-check/check" 10 ) 11 12 func startServerContainer(c *check.C, msg string, port int) string { 13 name := "server" 14 cmd := []string{ 15 "-d", 16 "-p", fmt.Sprintf("%d:%d", port, port), 17 "busybox", 18 "sh", "-c", fmt.Sprintf("echo %q | nc -lp %d", msg, port), 19 } 20 if err := waitForContainer(name, cmd...); err != nil { 21 c.Fatalf("Failed to launch server container: %v", err) 22 } 23 return name 24 } 25 26 func getExternalAddress(c *check.C) net.IP { 27 iface, err := net.InterfaceByName("eth0") 28 if err != nil { 29 c.Skip(fmt.Sprintf("Test not running with `make test`. Interface eth0 not found: %v", err)) 30 } 31 32 ifaceAddrs, err := iface.Addrs() 33 if err != nil || len(ifaceAddrs) == 0 { 34 c.Fatalf("Error retrieving addresses for eth0: %v (%d addresses)", err, len(ifaceAddrs)) 35 } 36 37 ifaceIP, _, err := net.ParseCIDR(ifaceAddrs[0].String()) 38 if err != nil { 39 c.Fatalf("Error retrieving the up for eth0: %s", err) 40 } 41 42 return ifaceIP 43 } 44 45 func getContainerLogs(c *check.C, containerID string) string { 46 out, _ := dockerCmd(c, "logs", containerID) 47 return strings.Trim(out, "\r\n") 48 } 49 50 func getContainerStatus(c *check.C, containerID string) string { 51 out, err := inspectField(containerID, "State.Running") 52 c.Assert(err, check.IsNil) 53 return out 54 } 55 56 func (s *DockerSuite) TestNetworkNat(c *check.C) { 57 testRequires(c, SameHostDaemon, NativeExecDriver) 58 msg := "it works" 59 startServerContainer(c, msg, 8080) 60 endpoint := getExternalAddress(c) 61 conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", endpoint.String(), 8080)) 62 if err != nil { 63 c.Fatalf("Failed to connect to container (%v)", err) 64 } 65 data, err := ioutil.ReadAll(conn) 66 conn.Close() 67 if err != nil { 68 c.Fatal(err) 69 } 70 final := strings.TrimRight(string(data), "\n") 71 if final != msg { 72 c.Fatalf("Expected message %q but received %q", msg, final) 73 } 74 } 75 76 func (s *DockerSuite) TestNetworkLocalhostTCPNat(c *check.C) { 77 testRequires(c, SameHostDaemon, NativeExecDriver) 78 var ( 79 msg = "hi yall" 80 ) 81 startServerContainer(c, msg, 8081) 82 conn, err := net.Dial("tcp", "localhost:8081") 83 if err != nil { 84 c.Fatalf("Failed to connect to container (%v)", err) 85 } 86 data, err := ioutil.ReadAll(conn) 87 conn.Close() 88 if err != nil { 89 c.Fatal(err) 90 } 91 final := strings.TrimRight(string(data), "\n") 92 if final != msg { 93 c.Fatalf("Expected message %q but received %q", msg, final) 94 } 95 } 96 97 func (s *DockerSuite) TestNetworkLoopbackNat(c *check.C) { 98 testRequires(c, SameHostDaemon, NativeExecDriver) 99 msg := "it works" 100 startServerContainer(c, msg, 8080) 101 endpoint := getExternalAddress(c) 102 out, _ := dockerCmd(c, "run", "-t", "--net=container:server", "busybox", 103 "sh", "-c", fmt.Sprintf("stty raw && nc -w 5 %s 8080", endpoint.String())) 104 final := strings.TrimRight(string(out), "\n") 105 if final != msg { 106 c.Fatalf("Expected message %q but received %q", msg, final) 107 } 108 }