|
@@ -658,6 +658,9 @@ func hasUserDefinedIPAddress(epConfig *networktypes.EndpointSettings) bool {
|
|
|
|
|
|
// User specified ip address is acceptable only for networks with user specified subnets.
|
|
// User specified ip address is acceptable only for networks with user specified subnets.
|
|
func validateNetworkingConfig(n libnetwork.Network, epConfig *networktypes.EndpointSettings) error {
|
|
func validateNetworkingConfig(n libnetwork.Network, epConfig *networktypes.EndpointSettings) error {
|
|
|
|
+ if n == nil || epConfig == nil {
|
|
|
|
+ return nil
|
|
|
|
+ }
|
|
if !hasUserDefinedIPAddress(epConfig) {
|
|
if !hasUserDefinedIPAddress(epConfig) {
|
|
return nil
|
|
return nil
|
|
}
|
|
}
|
|
@@ -704,7 +707,7 @@ func cleanOperationalData(es *networktypes.EndpointSettings) {
|
|
es.MacAddress = ""
|
|
es.MacAddress = ""
|
|
}
|
|
}
|
|
|
|
|
|
-func (daemon *Daemon) updateNetworkConfig(container *container.Container, idOrName string, updateSettings bool) (libnetwork.Network, error) {
|
|
|
|
|
|
+func (daemon *Daemon) updateNetworkConfig(container *container.Container, idOrName string, endpointConfig *networktypes.EndpointSettings, updateSettings bool) (libnetwork.Network, error) {
|
|
if container.HostConfig.NetworkMode.IsContainer() {
|
|
if container.HostConfig.NetworkMode.IsContainer() {
|
|
return nil, runconfig.ErrConflictSharedNetwork
|
|
return nil, runconfig.ErrConflictSharedNetwork
|
|
}
|
|
}
|
|
@@ -715,11 +718,24 @@ func (daemon *Daemon) updateNetworkConfig(container *container.Container, idOrNa
|
|
return nil, nil
|
|
return nil, nil
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if !containertypes.NetworkMode(idOrName).IsUserDefined() {
|
|
|
|
+ if hasUserDefinedIPAddress(endpointConfig) {
|
|
|
|
+ return nil, runconfig.ErrUnsupportedNetworkAndIP
|
|
|
|
+ }
|
|
|
|
+ if endpointConfig != nil && len(endpointConfig.Aliases) > 0 {
|
|
|
|
+ return nil, runconfig.ErrUnsupportedNetworkAndAlias
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
n, err := daemon.FindNetwork(idOrName)
|
|
n, err := daemon.FindNetwork(idOrName)
|
|
if err != nil {
|
|
if err != nil {
|
|
return nil, err
|
|
return nil, err
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if err := validateNetworkingConfig(n, endpointConfig); err != nil {
|
|
|
|
+ return nil, err
|
|
|
|
+ }
|
|
|
|
+
|
|
if updateSettings {
|
|
if updateSettings {
|
|
if err := daemon.updateNetworkSettings(container, n); err != nil {
|
|
if err := daemon.updateNetworkSettings(container, n); err != nil {
|
|
return nil, err
|
|
return nil, err
|
|
@@ -734,7 +750,7 @@ func (daemon *Daemon) ConnectToNetwork(container *container.Container, idOrName
|
|
if container.RemovalInProgress || container.Dead {
|
|
if container.RemovalInProgress || container.Dead {
|
|
return derr.ErrorCodeRemovalContainer.WithArgs(container.ID)
|
|
return derr.ErrorCodeRemovalContainer.WithArgs(container.ID)
|
|
}
|
|
}
|
|
- if _, err := daemon.updateNetworkConfig(container, idOrName, true); err != nil {
|
|
|
|
|
|
+ if _, err := daemon.updateNetworkConfig(container, idOrName, endpointConfig, true); err != nil {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
} else {
|
|
} else {
|
|
@@ -749,7 +765,7 @@ func (daemon *Daemon) ConnectToNetwork(container *container.Container, idOrName
|
|
}
|
|
}
|
|
|
|
|
|
func (daemon *Daemon) connectToNetwork(container *container.Container, idOrName string, endpointConfig *networktypes.EndpointSettings, updateSettings bool) (err error) {
|
|
func (daemon *Daemon) connectToNetwork(container *container.Container, idOrName string, endpointConfig *networktypes.EndpointSettings, updateSettings bool) (err error) {
|
|
- n, err := daemon.updateNetworkConfig(container, idOrName, updateSettings)
|
|
|
|
|
|
+ n, err := daemon.updateNetworkConfig(container, idOrName, endpointConfig, updateSettings)
|
|
if err != nil {
|
|
if err != nil {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
@@ -760,17 +776,6 @@ func (daemon *Daemon) connectToNetwork(container *container.Container, idOrName
|
|
controller := daemon.netController
|
|
controller := daemon.netController
|
|
|
|
|
|
if endpointConfig != nil {
|
|
if endpointConfig != nil {
|
|
- if !containertypes.NetworkMode(idOrName).IsUserDefined() && hasUserDefinedIPAddress(endpointConfig) {
|
|
|
|
- return runconfig.ErrUnsupportedNetworkAndIP
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if err := validateNetworkingConfig(n, endpointConfig); err != nil {
|
|
|
|
- return err
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if !containertypes.NetworkMode(idOrName).IsUserDefined() && len(endpointConfig.Aliases) > 0 {
|
|
|
|
- return runconfig.ErrUnsupportedNetworkAndAlias
|
|
|
|
- }
|
|
|
|
container.NetworkSettings.Networks[n.Name()] = endpointConfig
|
|
container.NetworkSettings.Networks[n.Name()] = endpointConfig
|
|
}
|
|
}
|
|
|
|
|