docker_cli_nat_test.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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, SameHostDaemon, NativeExecDriver)
  48. msg := "it works"
  49. startServerContainer(c, msg, 8080)
  50. endpoint := getExternalAddress(c)
  51. conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", endpoint.String(), 8080))
  52. if err != nil {
  53. c.Fatalf("Failed to connect to container (%v)", err)
  54. }
  55. data, err := ioutil.ReadAll(conn)
  56. conn.Close()
  57. if err != nil {
  58. c.Fatal(err)
  59. }
  60. final := strings.TrimRight(string(data), "\n")
  61. if final != msg {
  62. c.Fatalf("Expected message %q but received %q", msg, final)
  63. }
  64. }
  65. func (s *DockerSuite) TestNetworkLocalhostTCPNat(c *check.C) {
  66. testRequires(c, SameHostDaemon, NativeExecDriver)
  67. var (
  68. msg = "hi yall"
  69. )
  70. startServerContainer(c, msg, 8081)
  71. conn, err := net.Dial("tcp", "localhost:8081")
  72. if err != nil {
  73. c.Fatalf("Failed to connect to container (%v)", err)
  74. }
  75. data, err := ioutil.ReadAll(conn)
  76. conn.Close()
  77. if err != nil {
  78. c.Fatal(err)
  79. }
  80. final := strings.TrimRight(string(data), "\n")
  81. if final != msg {
  82. c.Fatalf("Expected message %q but received %q", msg, final)
  83. }
  84. }
  85. func (s *DockerSuite) TestNetworkLoopbackNat(c *check.C) {
  86. testRequires(c, SameHostDaemon, NativeExecDriver)
  87. msg := "it works"
  88. startServerContainer(c, msg, 8080)
  89. endpoint := getExternalAddress(c)
  90. out, _ := dockerCmd(c, "run", "-t", "--net=container:server", "busybox",
  91. "sh", "-c", fmt.Sprintf("stty raw && nc -w 5 %s 8080", endpoint.String()))
  92. final := strings.TrimRight(string(out), "\n")
  93. if final != msg {
  94. c.Fatalf("Expected message %q but received %q", msg, final)
  95. }
  96. }