12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- 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)
- }
|