docker_cli_nat_test.go 2.9 KB

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