Browse code

update network settings on container creating

To make docker inspect return a consistent result of networksettings
for created container and stopped container, it's bettew to update
the network settings on container creating.

Signed-off-by: Lei Jitang <leijitang@huawei.com>

Lei Jitang authored on 2015/12/13 16:33:18
Showing 4 changed files
... ...
@@ -529,6 +529,29 @@ func (daemon *Daemon) updateNetwork(container *container.Container) error {
529 529
 	return nil
530 530
 }
531 531
 
532
+// updateContainerNetworkSettings update the network settings
533
+func (daemon *Daemon) updateContainerNetworkSettings(container *container.Container) error {
534
+	mode := container.HostConfig.NetworkMode
535
+	if container.Config.NetworkDisabled || mode.IsContainer() {
536
+		return nil
537
+	}
538
+
539
+	networkName := mode.NetworkName()
540
+	if mode.IsDefault() {
541
+		networkName = daemon.netController.Config().Daemon.DefaultNetwork
542
+	}
543
+	if mode.IsUserDefined() {
544
+		n, err := daemon.FindNetwork(networkName)
545
+		if err != nil {
546
+			return err
547
+		}
548
+		networkName = n.Name()
549
+	}
550
+	container.NetworkSettings.Networks = make(map[string]*networktypes.EndpointSettings)
551
+	container.NetworkSettings.Networks[networkName] = new(networktypes.EndpointSettings)
552
+	return nil
553
+}
554
+
532 555
 func (daemon *Daemon) allocateNetwork(container *container.Container) error {
533 556
 	controller := daemon.netController
534 557
 
... ...
@@ -539,24 +562,14 @@ func (daemon *Daemon) allocateNetwork(container *container.Container) error {
539 539
 
540 540
 	updateSettings := false
541 541
 	if len(container.NetworkSettings.Networks) == 0 {
542
-		mode := container.HostConfig.NetworkMode
543
-		if container.Config.NetworkDisabled || mode.IsContainer() {
542
+		if container.Config.NetworkDisabled || container.HostConfig.NetworkMode.IsContainer() {
544 543
 			return nil
545 544
 		}
546 545
 
547
-		networkName := mode.NetworkName()
548
-		if mode.IsDefault() {
549
-			networkName = controller.Config().Daemon.DefaultNetwork
550
-		}
551
-		if mode.IsUserDefined() {
552
-			n, err := daemon.FindNetwork(networkName)
553
-			if err != nil {
554
-				return err
555
-			}
556
-			networkName = n.Name()
546
+		err := daemon.updateContainerNetworkSettings(container)
547
+		if err != nil {
548
+			return err
557 549
 		}
558
-		container.NetworkSettings.Networks = make(map[string]*networktypes.EndpointSettings)
559
-		container.NetworkSettings.Networks[networkName] = new(networktypes.EndpointSettings)
560 550
 		updateSettings = true
561 551
 	}
562 552
 
... ...
@@ -16,6 +16,11 @@ func (daemon *Daemon) setupLinkedContainers(container *container.Container) ([]s
16 16
 	return nil, nil
17 17
 }
18 18
 
19
+// updateContainerNetworkSettings update the network settings
20
+func (daemon *Daemon) updateContainerNetworkSettings(container *container.Container) error {
21
+	return nil
22
+}
23
+
19 24
 func (daemon *Daemon) initializeNetworking(container *container.Container) error {
20 25
 	return nil
21 26
 }
... ...
@@ -106,6 +106,10 @@ func (daemon *Daemon) create(params *ContainerCreateConfig) (retC *container.Con
106 106
 		return nil, err
107 107
 	}
108 108
 
109
+	if err := daemon.updateContainerNetworkSettings(container); err != nil {
110
+		return nil, err
111
+	}
112
+
109 113
 	if err := container.ToDiskLocking(); err != nil {
110 114
 		logrus.Errorf("Error saving new container to disk: %v", err)
111 115
 		return nil, err
... ...
@@ -891,3 +891,22 @@ func (s *DockerNetworkSuite) TestDockerNetworkConnectWithMac(c *check.C) {
891 891
 	c.Assert(err, checker.IsNil)
892 892
 	c.Assert(strings.TrimSpace(mac2), checker.Not(checker.Equals), strings.TrimSpace(mac1))
893 893
 }
894
+
895
+func (s *DockerNetworkSuite) TestDockerNetworkInspectCreatedContainer(c *check.C) {
896
+	dockerCmd(c, "create", "--name", "test", "busybox")
897
+	networks, err := inspectField("test", "NetworkSettings.Networks")
898
+	c.Assert(err, checker.IsNil)
899
+	c.Assert(networks, checker.Contains, "bridge", check.Commentf("Should return 'bridge' network"))
900
+}
901
+
902
+func (s *DockerNetworkSuite) TestDockerNetworkRestartWithMulipleNetworks(c *check.C) {
903
+	dockerCmd(c, "network", "create", "test")
904
+	dockerCmd(c, "run", "--name=foo", "-d", "busybox", "top")
905
+	c.Assert(waitRun("foo"), checker.IsNil)
906
+	dockerCmd(c, "network", "connect", "test", "foo")
907
+	dockerCmd(c, "restart", "foo")
908
+	networks, err := inspectField("foo", "NetworkSettings.Networks")
909
+	c.Assert(err, checker.IsNil)
910
+	c.Assert(networks, checker.Contains, "bridge", check.Commentf("Should contain 'bridge' network"))
911
+	c.Assert(networks, checker.Contains, "test", check.Commentf("Should contain 'test' netwokr"))
912
+}