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