docker_cli_nat_test.go 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. package main
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "net"
  6. "strings"
  7. "github.com/docker/docker/integration-cli/checker"
  8. "github.com/docker/docker/integration-cli/cli"
  9. "github.com/go-check/check"
  10. )
  11. func startServerContainer(c *check.C, msg string, port int) string {
  12. name := "server"
  13. cmd := []string{
  14. "run",
  15. "--name",
  16. name,
  17. "-d",
  18. "-p", fmt.Sprintf("%d:%d", port, port),
  19. "busybox",
  20. "sh", "-c", fmt.Sprintf("echo %q | nc -lp %d", msg, port),
  21. }
  22. cli.DockerCmd(c, cmd...)
  23. cli.WaitRun(c, name)
  24. return name
  25. }
  26. func getExternalAddress(c *check.C) net.IP {
  27. iface, err := net.InterfaceByName("eth0")
  28. if err != nil {
  29. c.Skip(fmt.Sprintf("Test not running with `make test`. Interface eth0 not found: %v", err))
  30. }
  31. ifaceAddrs, err := iface.Addrs()
  32. c.Assert(err, check.IsNil)
  33. c.Assert(ifaceAddrs, checker.Not(checker.HasLen), 0)
  34. ifaceIP, _, err := net.ParseCIDR(ifaceAddrs[0].String())
  35. c.Assert(err, check.IsNil)
  36. return ifaceIP
  37. }
  38. func (s *DockerSuite) TestNetworkNat(c *check.C) {
  39. testRequires(c, DaemonIsLinux, SameHostDaemon)
  40. msg := "it works"
  41. startServerContainer(c, msg, 8080)
  42. endpoint := getExternalAddress(c)
  43. conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", endpoint.String(), 8080))
  44. c.Assert(err, check.IsNil)
  45. data, err := ioutil.ReadAll(conn)
  46. conn.Close()
  47. c.Assert(err, check.IsNil)
  48. final := strings.TrimRight(string(data), "\n")
  49. c.Assert(final, checker.Equals, msg)
  50. }
  51. func (s *DockerSuite) TestNetworkLocalhostTCPNat(c *check.C) {
  52. testRequires(c, DaemonIsLinux, SameHostDaemon)
  53. var (
  54. msg = "hi yall"
  55. )
  56. startServerContainer(c, msg, 8081)
  57. conn, err := net.Dial("tcp", "localhost:8081")
  58. c.Assert(err, check.IsNil)
  59. data, err := ioutil.ReadAll(conn)
  60. conn.Close()
  61. c.Assert(err, check.IsNil)
  62. final := strings.TrimRight(string(data), "\n")
  63. c.Assert(final, checker.Equals, msg)
  64. }
  65. func (s *DockerSuite) TestNetworkLoopbackNat(c *check.C) {
  66. testRequires(c, DaemonIsLinux, SameHostDaemon, NotUserNamespace)
  67. msg := "it works"
  68. startServerContainer(c, msg, 8080)
  69. endpoint := getExternalAddress(c)
  70. out, _ := dockerCmd(c, "run", "-t", "--net=container:server", "busybox",
  71. "sh", "-c", fmt.Sprintf("stty raw && nc -w 5 %s 8080", endpoint.String()))
  72. final := strings.TrimRight(string(out), "\n")
  73. c.Assert(final, checker.Equals, msg)
  74. }