Fixes - https://github.com/docker/for-linux/issues/632
Signed-off-by: Arko Dasgupta <arko.dasgupta@docker.com>
(cherry picked from commit 871acb1c86979c534665498d715c596bcfe50786)
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
| ... | ... |
@@ -354,6 +354,14 @@ func (daemon *Daemon) findAndAttachNetwork(container *container.Container, idOrN |
| 354 | 354 |
if container.Managed || !n.Info().Dynamic() {
|
| 355 | 355 |
return n, nil, nil |
| 356 | 356 |
} |
| 357 |
+ // Throw an error if the container is already attached to the network |
|
| 358 |
+ if container.NetworkSettings.Networks != nil {
|
|
| 359 |
+ networkName := n.Name() |
|
| 360 |
+ containerName := strings.TrimPrefix(container.Name, "/") |
|
| 361 |
+ if network, ok := container.NetworkSettings.Networks[networkName]; ok && network.EndpointID != "" {
|
|
| 362 |
+ return n, nil, types.ForbiddenErrorf("%s is already attached to network %s", containerName, networkName)
|
|
| 363 |
+ } |
|
| 364 |
+ } |
|
| 357 | 365 |
} |
| 358 | 366 |
|
| 359 | 367 |
var addresses []string |
| ... | ... |
@@ -75,3 +75,43 @@ func TestDockerNetworkConnectAlias(t *testing.T) {
|
| 75 | 75 |
assert.Check(t, is.Equal(len(ng2.NetworkSettings.Networks[name].Aliases), 2)) |
| 76 | 76 |
assert.Check(t, is.Equal(ng2.NetworkSettings.Networks[name].Aliases[0], "bbb")) |
| 77 | 77 |
} |
| 78 |
+ |
|
| 79 |
+func TestDockerNetworkReConnect(t *testing.T) {
|
|
| 80 |
+ skip.If(t, testEnv.DaemonInfo.OSType == "windows") |
|
| 81 |
+ defer setupTest(t)() |
|
| 82 |
+ d := swarm.NewSwarm(t, testEnv) |
|
| 83 |
+ defer d.Stop(t) |
|
| 84 |
+ client := d.NewClientT(t) |
|
| 85 |
+ defer client.Close() |
|
| 86 |
+ ctx := context.Background() |
|
| 87 |
+ |
|
| 88 |
+ name := t.Name() + "dummyNet" |
|
| 89 |
+ net.CreateNoError(t, ctx, client, name, |
|
| 90 |
+ net.WithDriver("overlay"),
|
|
| 91 |
+ net.WithAttachable(), |
|
| 92 |
+ ) |
|
| 93 |
+ |
|
| 94 |
+ c1 := container.Create(t, ctx, client, func(c *container.TestContainerConfig) {
|
|
| 95 |
+ c.NetworkingConfig = &network.NetworkingConfig{
|
|
| 96 |
+ EndpointsConfig: map[string]*network.EndpointSettings{
|
|
| 97 |
+ name: {},
|
|
| 98 |
+ }, |
|
| 99 |
+ } |
|
| 100 |
+ }) |
|
| 101 |
+ |
|
| 102 |
+ err := client.NetworkConnect(ctx, name, c1, &network.EndpointSettings{})
|
|
| 103 |
+ assert.NilError(t, err) |
|
| 104 |
+ |
|
| 105 |
+ err = client.ContainerStart(ctx, c1, types.ContainerStartOptions{})
|
|
| 106 |
+ assert.NilError(t, err) |
|
| 107 |
+ |
|
| 108 |
+ n1, err := client.ContainerInspect(ctx, c1) |
|
| 109 |
+ assert.NilError(t, err) |
|
| 110 |
+ |
|
| 111 |
+ err = client.NetworkConnect(ctx, name, c1, &network.EndpointSettings{})
|
|
| 112 |
+ assert.ErrorContains(t, err, "is already attached to network") |
|
| 113 |
+ |
|
| 114 |
+ n2, err := client.ContainerInspect(ctx, c1) |
|
| 115 |
+ assert.NilError(t, err) |
|
| 116 |
+ assert.Check(t, is.DeepEqual(n1, n2)) |
|
| 117 |
+} |