|
@@ -0,0 +1,79 @@
|
|
|
|
+package networking
|
|
|
|
+
|
|
|
|
+import (
|
|
|
|
+ "testing"
|
|
|
|
+
|
|
|
|
+ containertypes "github.com/docker/docker/api/types/container"
|
|
|
|
+ "github.com/docker/docker/integration/internal/container"
|
|
|
|
+ "github.com/docker/docker/integration/internal/network"
|
|
|
|
+ "github.com/docker/docker/testutil/daemon"
|
|
|
|
+ "gotest.tools/v3/assert"
|
|
|
|
+ is "gotest.tools/v3/assert/cmp"
|
|
|
|
+ "gotest.tools/v3/skip"
|
|
|
|
+)
|
|
|
|
+
|
|
|
|
+// TestMACAddrOnRestart is a regression test for https://github.com/moby/moby/issues/47146
|
|
|
|
+// - Start a container, let it use a generated MAC address.
|
|
|
|
+// - Stop that container.
|
|
|
|
+// - Start a second container, it'll also use a generated MAC address.
|
|
|
|
+// (It's likely to recycle the first container's MAC address.)
|
|
|
|
+// - Restart the first container.
|
|
|
|
+// (The bug was that it kept its original MAC address, now already in-use.)
|
|
|
|
+// - Check that the two containers have different MAC addresses.
|
|
|
|
+func TestMACAddrOnRestart(t *testing.T) {
|
|
|
|
+ skip.If(t, testEnv.DaemonInfo.OSType == "windows")
|
|
|
|
+
|
|
|
|
+ ctx := setupTest(t)
|
|
|
|
+
|
|
|
|
+ d := daemon.New(t)
|
|
|
|
+ d.StartWithBusybox(ctx, t)
|
|
|
|
+ defer d.Stop(t)
|
|
|
|
+
|
|
|
|
+ c := d.NewClientT(t)
|
|
|
|
+ defer c.Close()
|
|
|
|
+
|
|
|
|
+ const netName = "testmacaddrs"
|
|
|
|
+ network.CreateNoError(ctx, t, c, netName,
|
|
|
|
+ network.WithDriver("bridge"),
|
|
|
|
+ network.WithOption("com.docker.network.bridge.name", netName))
|
|
|
|
+ defer network.RemoveNoError(ctx, t, c, netName)
|
|
|
|
+
|
|
|
|
+ const ctr1Name = "ctr1"
|
|
|
|
+ id1 := container.Run(ctx, t, c,
|
|
|
|
+ container.WithName(ctr1Name),
|
|
|
|
+ container.WithImage("busybox:latest"),
|
|
|
|
+ container.WithCmd("top"),
|
|
|
|
+ container.WithNetworkMode(netName))
|
|
|
|
+ defer c.ContainerRemove(ctx, id1, containertypes.RemoveOptions{
|
|
|
|
+ Force: true,
|
|
|
|
+ })
|
|
|
|
+ err := c.ContainerStop(ctx, ctr1Name, containertypes.StopOptions{})
|
|
|
|
+ assert.Assert(t, is.Nil(err))
|
|
|
|
+
|
|
|
|
+ // Start a second container, giving the daemon a chance to recycle the first container's
|
|
|
|
+ // IP and MAC addresses.
|
|
|
|
+ const ctr2Name = "ctr2"
|
|
|
|
+ id2 := container.Run(ctx, t, c,
|
|
|
|
+ container.WithName(ctr2Name),
|
|
|
|
+ container.WithImage("busybox:latest"),
|
|
|
|
+ container.WithCmd("top"),
|
|
|
|
+ container.WithNetworkMode(netName))
|
|
|
|
+ defer c.ContainerRemove(ctx, id2, containertypes.RemoveOptions{
|
|
|
|
+ Force: true,
|
|
|
|
+ })
|
|
|
|
+
|
|
|
|
+ // Restart the first container.
|
|
|
|
+ err = c.ContainerStart(ctx, ctr1Name, containertypes.StartOptions{})
|
|
|
|
+ assert.Assert(t, is.Nil(err))
|
|
|
|
+
|
|
|
|
+ // Check that the containers ended up with different MAC addresses.
|
|
|
|
+
|
|
|
|
+ ctr1Inspect := container.Inspect(ctx, t, c, ctr1Name)
|
|
|
|
+ ctr1MAC := ctr1Inspect.NetworkSettings.Networks[netName].MacAddress
|
|
|
|
+
|
|
|
|
+ ctr2Inspect := container.Inspect(ctx, t, c, ctr2Name)
|
|
|
|
+ ctr2MAC := ctr2Inspect.NetworkSettings.Networks[netName].MacAddress
|
|
|
|
+
|
|
|
|
+ assert.Check(t, ctr1MAC != ctr2MAC,
|
|
|
|
+ "expected containers to have different MAC addresses; got %q for both", ctr1MAC)
|
|
|
|
+}
|