Browse code

Add container's short-id as default network alias

link feature in docker0 bridge by default provides short-id as a
container alias. With built-in SD feature, providing a container
short-id as a network alias will fill that gap.

Signed-off-by: Madhu Venugopal <madhu@docker.com>

Madhu Venugopal authored on 2016/04/09 07:25:07
Showing 4 changed files
... ...
@@ -12,6 +12,7 @@ import (
12 12
 	"github.com/docker/docker/container"
13 13
 	"github.com/docker/docker/daemon/network"
14 14
 	derr "github.com/docker/docker/errors"
15
+	"github.com/docker/docker/pkg/stringid"
15 16
 	"github.com/docker/docker/runconfig"
16 17
 	containertypes "github.com/docker/engine-api/types/container"
17 18
 	networktypes "github.com/docker/engine-api/types/network"
... ...
@@ -485,6 +486,18 @@ func (daemon *Daemon) updateNetworkConfig(container *container.Container, idOrNa
485 485
 		if endpointConfig != nil && len(endpointConfig.Aliases) > 0 {
486 486
 			return nil, runconfig.ErrUnsupportedNetworkAndAlias
487 487
 		}
488
+	} else {
489
+		addShortID := true
490
+		shortID := stringid.TruncateID(container.ID)
491
+		for _, alias := range endpointConfig.Aliases {
492
+			if alias == shortID {
493
+				addShortID = false
494
+				break
495
+			}
496
+		}
497
+		if addShortID {
498
+			endpointConfig.Aliases = append(endpointConfig.Aliases, shortID)
499
+		}
488 500
 	}
489 501
 
490 502
 	n, err := daemon.FindNetwork(idOrName)
... ...
@@ -505,6 +518,9 @@ func (daemon *Daemon) updateNetworkConfig(container *container.Container, idOrNa
505 505
 }
506 506
 
507 507
 func (daemon *Daemon) connectToNetwork(container *container.Container, idOrName string, endpointConfig *networktypes.EndpointSettings, updateSettings bool) (err error) {
508
+	if endpointConfig == nil {
509
+		endpointConfig = &networktypes.EndpointSettings{}
510
+	}
508 511
 	n, err := daemon.updateNetworkConfig(container, idOrName, endpointConfig, updateSettings)
509 512
 	if err != nil {
510 513
 		return err
... ...
@@ -533,10 +549,7 @@ func (daemon *Daemon) connectToNetwork(container *container.Container, idOrName
533 533
 			}
534 534
 		}
535 535
 	}()
536
-
537
-	if endpointConfig != nil {
538
-		container.NetworkSettings.Networks[n.Name()] = endpointConfig
539
-	}
536
+	container.NetworkSettings.Networks[n.Name()] = endpointConfig
540 537
 
541 538
 	if err := daemon.updateEndpointNetworkSettings(container, n, ep); err != nil {
542 539
 		return err
... ...
@@ -101,6 +101,9 @@ func (daemon *Daemon) getSize(container *container.Container) (int64, int64) {
101 101
 
102 102
 // ConnectToNetwork connects a container to a network
103 103
 func (daemon *Daemon) ConnectToNetwork(container *container.Container, idOrName string, endpointConfig *networktypes.EndpointSettings) error {
104
+	if endpointConfig == nil {
105
+		endpointConfig = &networktypes.EndpointSettings{}
106
+	}
104 107
 	if !container.Running {
105 108
 		if container.RemovalInProgress || container.Dead {
106 109
 			return errRemovalContainer(container.ID)
... ...
@@ -108,9 +111,7 @@ func (daemon *Daemon) ConnectToNetwork(container *container.Container, idOrName
108 108
 		if _, err := daemon.updateNetworkConfig(container, idOrName, endpointConfig, true); err != nil {
109 109
 			return err
110 110
 		}
111
-		if endpointConfig != nil {
112
-			container.NetworkSettings.Networks[idOrName] = endpointConfig
113
-		}
111
+		container.NetworkSettings.Networks[idOrName] = endpointConfig
114 112
 	} else {
115 113
 		if err := daemon.connectToNetwork(container, idOrName, endpointConfig, true); err != nil {
116 114
 			return err
... ...
@@ -14,6 +14,7 @@ import (
14 14
 	"time"
15 15
 
16 16
 	"github.com/docker/docker/pkg/integration/checker"
17
+	"github.com/docker/docker/pkg/stringid"
17 18
 	"github.com/docker/docker/runconfig"
18 19
 	"github.com/docker/engine-api/types"
19 20
 	"github.com/docker/engine-api/types/versions/v1p20"
... ...
@@ -1348,7 +1349,7 @@ func (s *DockerSuite) TestUserDefinedNetworkConnectDisconnectAlias(c *check.C) {
1348 1348
 	dockerCmd(c, "network", "create", "-d", "bridge", "net1")
1349 1349
 	dockerCmd(c, "network", "create", "-d", "bridge", "net2")
1350 1350
 
1351
-	dockerCmd(c, "run", "-d", "--net=net1", "--name=first", "--net-alias=foo", "busybox", "top")
1351
+	cid, _ := dockerCmd(c, "run", "-d", "--net=net1", "--name=first", "--net-alias=foo", "busybox", "top")
1352 1352
 	c.Assert(waitRun("first"), check.IsNil)
1353 1353
 
1354 1354
 	dockerCmd(c, "run", "-d", "--net=net1", "--name=second", "busybox", "top")
... ...
@@ -1360,6 +1361,10 @@ func (s *DockerSuite) TestUserDefinedNetworkConnectDisconnectAlias(c *check.C) {
1360 1360
 	_, _, err = dockerCmdWithError("exec", "second", "ping", "-c", "1", "foo")
1361 1361
 	c.Assert(err, check.IsNil)
1362 1362
 
1363
+	// ping first container's short-id alias
1364
+	_, _, err = dockerCmdWithError("exec", "second", "ping", "-c", "1", stringid.TruncateID(cid))
1365
+	c.Assert(err, check.IsNil)
1366
+
1363 1367
 	// connect first container to net2 network
1364 1368
 	dockerCmd(c, "network", "connect", "--alias=bar", "net2", "first")
1365 1369
 	// connect second container to foo2 network with a different alias for first container
... ...
@@ -1379,6 +1384,9 @@ func (s *DockerSuite) TestUserDefinedNetworkConnectDisconnectAlias(c *check.C) {
1379 1379
 	// ping to net2 scoped alias "bar" must still succeed
1380 1380
 	_, _, err = dockerCmdWithError("exec", "second", "ping", "-c", "1", "bar")
1381 1381
 	c.Assert(err, check.IsNil)
1382
+	// ping to net2 scoped alias short-id must still succeed
1383
+	_, _, err = dockerCmdWithError("exec", "second", "ping", "-c", "1", stringid.TruncateID(cid))
1384
+	c.Assert(err, check.IsNil)
1382 1385
 
1383 1386
 	// verify the alias option is rejected when running on predefined network
1384 1387
 	out, _, err := dockerCmdWithError("run", "--rm", "--name=any", "--net-alias=any", "busybox", "top")
... ...
@@ -20,6 +20,7 @@ import (
20 20
 
21 21
 	"github.com/docker/docker/pkg/integration/checker"
22 22
 	"github.com/docker/docker/pkg/mount"
23
+	"github.com/docker/docker/pkg/stringid"
23 24
 	"github.com/docker/docker/pkg/stringutils"
24 25
 	"github.com/docker/docker/runconfig"
25 26
 	"github.com/docker/go-connections/nat"
... ...
@@ -285,12 +286,22 @@ func (s *DockerSuite) TestUserDefinedNetworkAlias(c *check.C) {
285 285
 	testRequires(c, DaemonIsLinux, NotUserNamespace, NotArm)
286 286
 	dockerCmd(c, "network", "create", "-d", "bridge", "net1")
287 287
 
288
-	dockerCmd(c, "run", "-d", "--net=net1", "--name=first", "--net-alias=foo1", "--net-alias=foo2", "busybox", "top")
288
+	cid1, _ := dockerCmd(c, "run", "-d", "--net=net1", "--name=first", "--net-alias=foo1", "--net-alias=foo2", "busybox", "top")
289 289
 	c.Assert(waitRun("first"), check.IsNil)
290 290
 
291
-	dockerCmd(c, "run", "-d", "--net=net1", "--name=second", "busybox", "top")
291
+	// Check if default short-id alias is added automatically
292
+	id := strings.TrimSpace(cid1)
293
+	aliases := inspectField(c, id, "NetworkSettings.Networks.net1.Aliases")
294
+	c.Assert(aliases, checker.Contains, stringid.TruncateID(id))
295
+
296
+	cid2, _ := dockerCmd(c, "run", "-d", "--net=net1", "--name=second", "busybox", "top")
292 297
 	c.Assert(waitRun("second"), check.IsNil)
293 298
 
299
+	// Check if default short-id alias is added automatically
300
+	id = strings.TrimSpace(cid2)
301
+	aliases = inspectField(c, id, "NetworkSettings.Networks.net1.Aliases")
302
+	c.Assert(aliases, checker.Contains, stringid.TruncateID(id))
303
+
294 304
 	// ping to first and its network-scoped aliases
295 305
 	_, _, err := dockerCmdWithError("exec", "second", "ping", "-c", "1", "first")
296 306
 	c.Assert(err, check.IsNil)
... ...
@@ -298,6 +309,9 @@ func (s *DockerSuite) TestUserDefinedNetworkAlias(c *check.C) {
298 298
 	c.Assert(err, check.IsNil)
299 299
 	_, _, err = dockerCmdWithError("exec", "second", "ping", "-c", "1", "foo2")
300 300
 	c.Assert(err, check.IsNil)
301
+	// ping first container's short-id alias
302
+	_, _, err = dockerCmdWithError("exec", "second", "ping", "-c", "1", stringid.TruncateID(cid1))
303
+	c.Assert(err, check.IsNil)
301 304
 
302 305
 	// Restart first container
303 306
 	dockerCmd(c, "restart", "first")
... ...
@@ -310,6 +324,9 @@ func (s *DockerSuite) TestUserDefinedNetworkAlias(c *check.C) {
310 310
 	c.Assert(err, check.IsNil)
311 311
 	_, _, err = dockerCmdWithError("exec", "second", "ping", "-c", "1", "foo2")
312 312
 	c.Assert(err, check.IsNil)
313
+	// ping first container's short-id alias
314
+	_, _, err = dockerCmdWithError("exec", "second", "ping", "-c", "1", stringid.TruncateID(cid1))
315
+	c.Assert(err, check.IsNil)
313 316
 }
314 317
 
315 318
 // Issue 9677.