github.com/tsuna/docker@v1.7.0-rc3/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  }