From 9083c2f10d7c0b42c9391f6c04fc971a0caa5f76 Mon Sep 17 00:00:00 2001 From: Rob Murray Date: Thu, 15 Feb 2024 19:36:13 +0000 Subject: [PATCH] Test DNS on Windows 'nat' networks Signed-off-by: Rob Murray --- integration/networking/bridge_test.go | 60 +++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/integration/networking/bridge_test.go b/integration/networking/bridge_test.go index e3d1fe2a36..29be429969 100644 --- a/integration/networking/bridge_test.go +++ b/integration/networking/bridge_test.go @@ -191,6 +191,66 @@ func TestBridgeICC(t *testing.T) { } } +// TestBridgeICCWindows 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 TestBridgeICCWindows(t *testing.T) { + skip.If(t, testEnv.DaemonInfo.OSType != "windows") + + 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, 5*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")) + }) + } +} + // TestBridgeINC makes sure two containers on two different bridge networks can't communicate with each other. func TestBridgeINC(t *testing.T) { skip.If(t, testEnv.DaemonInfo.OSType == "windows")