docker_cli_nat_test.go 3.0 KB

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