Forced endpoint cleanup
docker's network disconnect api now supports `Force` option which can be used to force cleanup an endpoint from any host in the cluster. Signed-off-by: Madhu Venugopal <madhu@docker.com> Upstream-commit: b464f1d78cdfa2a4124e083b8f7b0f2353f12de3 Component: engine
This commit is contained in:
@@ -833,8 +833,17 @@ func (daemon *Daemon) connectToNetwork(container *container.Container, idOrName
|
||||
return nil
|
||||
}
|
||||
|
||||
// ForceEndpointDelete deletes an endpoing from a network forcefully
|
||||
func (daemon *Daemon) ForceEndpointDelete(name string, n libnetwork.Network) error {
|
||||
ep, err := n.EndpointByName(name)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return ep.Delete(true)
|
||||
}
|
||||
|
||||
// DisconnectFromNetwork disconnects container from network n.
|
||||
func (daemon *Daemon) DisconnectFromNetwork(container *container.Container, n libnetwork.Network) error {
|
||||
func (daemon *Daemon) DisconnectFromNetwork(container *container.Container, n libnetwork.Network, force bool) error {
|
||||
if container.HostConfig.NetworkMode.IsHost() && containertypes.NetworkMode(n.Type()).IsHost() {
|
||||
return runconfig.ErrConflictHostNetwork
|
||||
}
|
||||
@@ -848,7 +857,7 @@ func (daemon *Daemon) DisconnectFromNetwork(container *container.Container, n li
|
||||
return fmt.Errorf("container %s is not connected to the network %s", container.ID, n.Name())
|
||||
}
|
||||
} else {
|
||||
if err := disconnectFromNetwork(container, n); err != nil {
|
||||
if err := disconnectFromNetwork(container, n, false); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
@@ -864,7 +873,7 @@ func (daemon *Daemon) DisconnectFromNetwork(container *container.Container, n li
|
||||
return nil
|
||||
}
|
||||
|
||||
func disconnectFromNetwork(container *container.Container, n libnetwork.Network) error {
|
||||
func disconnectFromNetwork(container *container.Container, n libnetwork.Network, force bool) error {
|
||||
var (
|
||||
ep libnetwork.Endpoint
|
||||
sbox libnetwork.Sandbox
|
||||
@@ -886,6 +895,15 @@ func disconnectFromNetwork(container *container.Container, n libnetwork.Network)
|
||||
}
|
||||
n.WalkEndpoints(s)
|
||||
|
||||
if ep == nil && force {
|
||||
epName := strings.TrimPrefix(container.Name, "/")
|
||||
ep, err := n.EndpointByName(epName)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return ep.Delete(force)
|
||||
}
|
||||
|
||||
if ep == nil {
|
||||
return fmt.Errorf("container %s is not connected to the network", container.ID)
|
||||
}
|
||||
|
||||
@@ -32,8 +32,13 @@ func (daemon *Daemon) ConnectToNetwork(container *container.Container, idOrName
|
||||
return nil
|
||||
}
|
||||
|
||||
// ForceEndpointDelete deletes an endpoing from a network forcefully
|
||||
func (daemon *Daemon) ForceEndpointDelete(name string, n libnetwork.Network) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// DisconnectFromNetwork disconnects a container from the network.
|
||||
func (daemon *Daemon) DisconnectFromNetwork(container *container.Container, n libnetwork.Network) error {
|
||||
func (daemon *Daemon) DisconnectFromNetwork(container *container.Container, n libnetwork.Network, force bool) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
@@ -163,12 +163,15 @@ func (daemon *Daemon) ConnectContainerToNetwork(containerName, networkName strin
|
||||
|
||||
// DisconnectContainerFromNetwork disconnects the given container from
|
||||
// the given network. If either cannot be found, an err is returned.
|
||||
func (daemon *Daemon) DisconnectContainerFromNetwork(containerName string, network libnetwork.Network) error {
|
||||
func (daemon *Daemon) DisconnectContainerFromNetwork(containerName string, network libnetwork.Network, force bool) error {
|
||||
container, err := daemon.GetContainer(containerName)
|
||||
if err != nil {
|
||||
if force {
|
||||
return daemon.ForceEndpointDelete(containerName, network)
|
||||
}
|
||||
return err
|
||||
}
|
||||
return daemon.DisconnectFromNetwork(container, network)
|
||||
return daemon.DisconnectFromNetwork(container, network, force)
|
||||
}
|
||||
|
||||
// GetNetworkDriverList returns the list of plugins drivers
|
||||
|
||||
Reference in New Issue
Block a user