mirror of
https://github.com/moby/moby.git
synced 2026-01-11 18:51:37 +00:00
117 lines
3.6 KiB
Go
117 lines
3.6 KiB
Go
package networking
|
|
|
|
import (
|
|
"context"
|
|
"net"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/docker/docker/integration/internal/container"
|
|
"github.com/docker/docker/integration/internal/network"
|
|
"github.com/docker/docker/testutil"
|
|
"github.com/docker/go-connections/nat"
|
|
containertypes "github.com/moby/moby/api/types/container"
|
|
"gotest.tools/v3/assert"
|
|
is "gotest.tools/v3/assert/cmp"
|
|
)
|
|
|
|
// TestNatNetworkICC tries to ping container ctr1 from container ctr2 using its hostname.
|
|
// Checks DNS resolution, and whether containers can communicate with each other.
|
|
// Regression test for https://github.com/moby/moby/issues/47370
|
|
func TestNatNetworkICC(t *testing.T) {
|
|
ctx := setupTest(t)
|
|
c := testEnv.APIClient()
|
|
|
|
testcases := []struct {
|
|
name string
|
|
netName string
|
|
}{
|
|
{
|
|
name: "Default nat network",
|
|
netName: "nat",
|
|
},
|
|
{
|
|
name: "User defined nat network",
|
|
netName: "mynat",
|
|
},
|
|
}
|
|
|
|
for _, tc := range testcases {
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
ctx := testutil.StartSpan(ctx, t)
|
|
|
|
if tc.netName != "nat" {
|
|
network.CreateNoError(ctx, t, c, tc.netName,
|
|
network.WithDriver("nat"),
|
|
)
|
|
defer network.RemoveNoError(ctx, t, c, tc.netName)
|
|
}
|
|
|
|
const ctr1Name = "ctr1"
|
|
id1 := container.Run(ctx, t, c,
|
|
container.WithName(ctr1Name),
|
|
container.WithNetworkMode(tc.netName),
|
|
)
|
|
defer c.ContainerRemove(ctx, id1, containertypes.RemoveOptions{Force: true})
|
|
|
|
pingCmd := []string{"ping", "-n", "1", "-w", "3000", ctr1Name}
|
|
|
|
const ctr2Name = "ctr2"
|
|
attachCtx, cancel := context.WithTimeout(ctx, 15*time.Second)
|
|
defer cancel()
|
|
res := container.RunAttach(attachCtx, t, c,
|
|
container.WithName(ctr2Name),
|
|
container.WithCmd(pingCmd...),
|
|
container.WithNetworkMode(tc.netName),
|
|
)
|
|
defer c.ContainerRemove(ctx, res.ContainerID, containertypes.RemoveOptions{Force: true})
|
|
|
|
assert.Check(t, is.Equal(res.ExitCode, 0))
|
|
assert.Check(t, is.Equal(res.Stderr.Len(), 0))
|
|
assert.Check(t, is.Contains(res.Stdout.String(), "Sent = 1, Received = 1, Lost = 0"))
|
|
})
|
|
}
|
|
}
|
|
|
|
// Check that a container on one network can reach a service in a container on
|
|
// another network, via a mapped port on the host.
|
|
//
|
|
// FIXME: flaky test; see https://github.com/moby/moby/issues/48881
|
|
func TestFlakyPortMappedHairpinWindows(t *testing.T) {
|
|
ctx := setupTest(t)
|
|
c := testEnv.APIClient()
|
|
|
|
// Find an address on the test host.
|
|
conn, err := net.Dial("tcp4", "hub.docker.com:80")
|
|
assert.NilError(t, err)
|
|
hostAddr := conn.LocalAddr().(*net.TCPAddr).IP.String()
|
|
conn.Close()
|
|
|
|
const serverNetName = "servernet"
|
|
network.CreateNoError(ctx, t, c, serverNetName, network.WithDriver("nat"))
|
|
defer network.RemoveNoError(ctx, t, c, serverNetName)
|
|
const clientNetName = "clientnet"
|
|
network.CreateNoError(ctx, t, c, clientNetName, network.WithDriver("nat"))
|
|
defer network.RemoveNoError(ctx, t, c, clientNetName)
|
|
|
|
serverId := container.Run(ctx, t, c,
|
|
container.WithNetworkMode(serverNetName),
|
|
container.WithExposedPorts("80"),
|
|
container.WithPortMap(nat.PortMap{"80": {{HostIP: "0.0.0.0"}}}),
|
|
container.WithCmd("httpd", "-f"),
|
|
)
|
|
defer c.ContainerRemove(ctx, serverId, containertypes.RemoveOptions{Force: true})
|
|
|
|
inspect := container.Inspect(ctx, t, c, serverId)
|
|
hostPort := inspect.NetworkSettings.Ports["80/tcp"][0].HostPort
|
|
|
|
attachCtx, cancel := context.WithTimeout(ctx, 15*time.Second)
|
|
defer cancel()
|
|
res := container.RunAttach(attachCtx, t, c,
|
|
container.WithNetworkMode(clientNetName),
|
|
container.WithCmd("wget", "http://"+hostAddr+":"+hostPort),
|
|
)
|
|
defer c.ContainerRemove(ctx, res.ContainerID, containertypes.RemoveOptions{Force: true})
|
|
assert.Check(t, is.Contains(res.Stderr.String(), "404 Not Found"))
|
|
}
|