Browse code

Merge pull request #19527 from aboch/epc

Move Unsupp Network & IP check to the new updateNetworkConfig() func

David Calavera authored on 2016/01/23 08:54:21
Showing 3 changed files
... ...
@@ -658,6 +658,9 @@ func hasUserDefinedIPAddress(epConfig *networktypes.EndpointSettings) bool {
658 658
 
659 659
 // User specified ip address is acceptable only for networks with user specified subnets.
660 660
 func validateNetworkingConfig(n libnetwork.Network, epConfig *networktypes.EndpointSettings) error {
661
+	if n == nil || epConfig == nil {
662
+		return nil
663
+	}
661 664
 	if !hasUserDefinedIPAddress(epConfig) {
662 665
 		return nil
663 666
 	}
... ...
@@ -704,7 +707,7 @@ func cleanOperationalData(es *networktypes.EndpointSettings) {
704 704
 	es.MacAddress = ""
705 705
 }
706 706
 
707
-func (daemon *Daemon) updateNetworkConfig(container *container.Container, idOrName string, updateSettings bool) (libnetwork.Network, error) {
707
+func (daemon *Daemon) updateNetworkConfig(container *container.Container, idOrName string, endpointConfig *networktypes.EndpointSettings, updateSettings bool) (libnetwork.Network, error) {
708 708
 	if container.HostConfig.NetworkMode.IsContainer() {
709 709
 		return nil, runconfig.ErrConflictSharedNetwork
710 710
 	}
... ...
@@ -715,11 +718,24 @@ func (daemon *Daemon) updateNetworkConfig(container *container.Container, idOrNa
715 715
 		return nil, nil
716 716
 	}
717 717
 
718
+	if !containertypes.NetworkMode(idOrName).IsUserDefined() {
719
+		if hasUserDefinedIPAddress(endpointConfig) {
720
+			return nil, runconfig.ErrUnsupportedNetworkAndIP
721
+		}
722
+		if endpointConfig != nil && len(endpointConfig.Aliases) > 0 {
723
+			return nil, runconfig.ErrUnsupportedNetworkAndAlias
724
+		}
725
+	}
726
+
718 727
 	n, err := daemon.FindNetwork(idOrName)
719 728
 	if err != nil {
720 729
 		return nil, err
721 730
 	}
722 731
 
732
+	if err := validateNetworkingConfig(n, endpointConfig); err != nil {
733
+		return nil, err
734
+	}
735
+
723 736
 	if updateSettings {
724 737
 		if err := daemon.updateNetworkSettings(container, n); err != nil {
725 738
 			return nil, err
... ...
@@ -734,7 +750,7 @@ func (daemon *Daemon) ConnectToNetwork(container *container.Container, idOrName
734 734
 		if container.RemovalInProgress || container.Dead {
735 735
 			return derr.ErrorCodeRemovalContainer.WithArgs(container.ID)
736 736
 		}
737
-		if _, err := daemon.updateNetworkConfig(container, idOrName, true); err != nil {
737
+		if _, err := daemon.updateNetworkConfig(container, idOrName, endpointConfig, true); err != nil {
738 738
 			return err
739 739
 		}
740 740
 	} else {
... ...
@@ -749,7 +765,7 @@ func (daemon *Daemon) ConnectToNetwork(container *container.Container, idOrName
749 749
 }
750 750
 
751 751
 func (daemon *Daemon) connectToNetwork(container *container.Container, idOrName string, endpointConfig *networktypes.EndpointSettings, updateSettings bool) (err error) {
752
-	n, err := daemon.updateNetworkConfig(container, idOrName, updateSettings)
752
+	n, err := daemon.updateNetworkConfig(container, idOrName, endpointConfig, updateSettings)
753 753
 	if err != nil {
754 754
 		return err
755 755
 	}
... ...
@@ -760,17 +776,6 @@ func (daemon *Daemon) connectToNetwork(container *container.Container, idOrName
760 760
 	controller := daemon.netController
761 761
 
762 762
 	if endpointConfig != nil {
763
-		if !containertypes.NetworkMode(idOrName).IsUserDefined() && hasUserDefinedIPAddress(endpointConfig) {
764
-			return runconfig.ErrUnsupportedNetworkAndIP
765
-		}
766
-
767
-		if err := validateNetworkingConfig(n, endpointConfig); err != nil {
768
-			return err
769
-		}
770
-
771
-		if !containertypes.NetworkMode(idOrName).IsUserDefined() && len(endpointConfig.Aliases) > 0 {
772
-			return runconfig.ErrUnsupportedNetworkAndAlias
773
-		}
774 763
 		container.NetworkSettings.Networks[n.Name()] = endpointConfig
775 764
 	}
776 765
 
... ...
@@ -1147,7 +1147,7 @@ func (s *DockerNetworkSuite) TestDockerNetworkConnectPreferredIP(c *check.C) {
1147 1147
 
1148 1148
 func (s *DockerNetworkSuite) TestDockerNetworkUnsupportedPreferredIP(c *check.C) {
1149 1149
 	// preferred IP is not supported on predefined networks
1150
-	for _, mode := range []string{"none", "host", "bridge"} {
1150
+	for _, mode := range []string{"none", "host", "bridge", "default"} {
1151 1151
 		checkUnsupportedNetworkAndIP(c, mode)
1152 1152
 	}
1153 1153
 
... ...
@@ -1300,6 +1300,16 @@ func (s *DockerSuite) TestUserDefinedNetworkConnectDisconnectAlias(c *check.C) {
1300 1300
 	// ping to net2 scoped alias "bar" must still succeed
1301 1301
 	_, _, err = dockerCmdWithError("exec", "second", "ping", "-c", "1", "bar")
1302 1302
 	c.Assert(err, check.IsNil)
1303
+
1304
+	// verify the alias option is rejected when running on predefined network
1305
+	out, _, err := dockerCmdWithError("run", "--rm", "--name=any", "--net-alias=any", "busybox", "top")
1306
+	c.Assert(err, checker.NotNil, check.Commentf("out: %s", out))
1307
+	c.Assert(out, checker.Contains, runconfig.ErrUnsupportedNetworkAndAlias.Error())
1308
+
1309
+	// verify the alias option is rejected when connecting to predefined network
1310
+	out, _, err = dockerCmdWithError("network", "connect", "--alias=any", "bridge", "first")
1311
+	c.Assert(err, checker.NotNil, check.Commentf("out: %s", out))
1312
+	c.Assert(out, checker.Contains, runconfig.ErrUnsupportedNetworkAndAlias.Error())
1303 1313
 }
1304 1314
 
1305 1315
 func (s *DockerSuite) TestUserDefinedNetworkConnectivity(c *check.C) {
... ...
@@ -442,7 +442,7 @@ func Parse(cmd *flag.FlagSet, args []string) (*container.Config, *container.Host
442 442
 		networkingConfig.EndpointsConfig[string(hostConfig.NetworkMode)] = epConfig
443 443
 	}
444 444
 
445
-	if hostConfig.NetworkMode.IsUserDefined() && flAliases.Len() > 0 {
445
+	if flAliases.Len() > 0 {
446 446
 		epConfig := networkingConfig.EndpointsConfig[string(hostConfig.NetworkMode)]
447 447
 		if epConfig == nil {
448 448
 			epConfig = &networktypes.EndpointSettings{}