From 12f04e292f3539d939ee85cd932a85dd877a2d52 Mon Sep 17 00:00:00 2001 From: Madhu Venugopal Date: Tue, 5 Apr 2016 18:17:17 -0700 Subject: [PATCH] Revert "Do not leave/delete gw endpoint twice" This reverts commit c9575647537970e29103bd8e34b78c39ac2d7207 introduced via #1064. Signed-off-by: Madhu Venugopal --- libnetwork/default_gateway.go | 23 +++++++++---------- libnetwork/endpoint.go | 23 +++++-------------- libnetwork/sandbox.go | 4 ---- libnetwork/test/integration/dnet/helpers.bash | 4 ++++ 4 files changed, 21 insertions(+), 33 deletions(-) diff --git a/libnetwork/default_gateway.go b/libnetwork/default_gateway.go index 8f91dccbcd..d8eb732701 100644 --- a/libnetwork/default_gateway.go +++ b/libnetwork/default_gateway.go @@ -65,13 +65,20 @@ func (sb *sandbox) setupDefaultGW() error { return nil } -// If present, detach and remove the endpoint connecting the sandbox to the default gw network. +// If present, removes the endpoint connecting the sandbox to the default gw network. +// Unless it is the endpoint designated to provide the external connectivity. +// If the sandbox is being deleted, removes the endpoint unconditionally. func (sb *sandbox) clearDefaultGW() error { var ep *endpoint if ep = sb.getEndpointInGWNetwork(); ep == nil { return nil } + + if ep == sb.getGatewayEndpoint() && !sb.inDelete { + return nil + } + if err := ep.sbLeave(sb, false); err != nil { return fmt.Errorf("container %s: endpoint leaving GW Network failed: %v", sb.containerID, err) } @@ -81,27 +88,20 @@ func (sb *sandbox) clearDefaultGW() error { return nil } -// Evaluate whether the sandbox needs to be attached to the default -// gateway network. func (sb *sandbox) needDefaultGW() bool { var needGW bool - if sb.inDelete { - return false - } - for _, ep := range sb.getConnectedEndpoints() { if ep.endpointInGWNetwork() { - continue + return false } if ep.getNetwork().Type() == "null" || ep.getNetwork().Type() == "host" { continue } if ep.getNetwork().Internal() { - continue + return false } - // During stale sandbox cleanup, joinInfo may be nil - if ep.joinInfo != nil && ep.joinInfo.disableGatewayService { + if ep.joinInfo.disableGatewayService { return false } // TODO v6 needs to be handled. @@ -115,7 +115,6 @@ func (sb *sandbox) needDefaultGW() bool { } needGW = true } - return needGW } diff --git a/libnetwork/endpoint.go b/libnetwork/endpoint.go index c227a3bae3..6f142d0af3 100644 --- a/libnetwork/endpoint.go +++ b/libnetwork/endpoint.go @@ -479,14 +479,7 @@ func (ep *endpoint) sbJoin(sb *sandbox, options ...EndpointOption) error { } } - if !sb.needDefaultGW() { - if err := sb.clearDefaultGW(); err != nil { - log.Warnf("Failure while disconnecting sandbox %s (%s) from gateway network: %v", - sb.ID(), sb.ContainerID(), err) - } - } - - return nil + return sb.clearDefaultGW() } func (ep *endpoint) rename(name string) error { @@ -629,7 +622,10 @@ func (ep *endpoint) sbLeave(sb *sandbox, force bool, options ...EndpointOption) } sb.deleteHostsEntries(n.getSvcRecords(ep)) - if sb.needDefaultGW() { + if !sb.inDelete && sb.needDefaultGW() { + if sb.getEPwithoutGateway() == nil { + return fmt.Errorf("endpoint without GW expected, but not found") + } return sb.setupDefaultGW() } @@ -643,14 +639,7 @@ func (ep *endpoint) sbLeave(sb *sandbox, force bool, options ...EndpointOption) } } - if !sb.needDefaultGW() { - if err := sb.clearDefaultGW(); err != nil { - log.Warnf("Failure while disconnecting sandbox %s (%s) from gateway network: %v", - sb.ID(), sb.ContainerID(), err) - } - } - - return nil + return sb.clearDefaultGW() } func (n *network) validateForceDelete(locator string) error { diff --git a/libnetwork/sandbox.go b/libnetwork/sandbox.go index 5517301bcc..18cca78dca 100644 --- a/libnetwork/sandbox.go +++ b/libnetwork/sandbox.go @@ -197,10 +197,6 @@ func (sb *sandbox) delete(force bool) error { // Detach from all endpoints retain := false for _, ep := range sb.getConnectedEndpoints() { - // gw network endpoint detach and removal are automatic - if ep.endpointInGWNetwork() { - continue - } // Retain the sanbdox if we can't obtain the network from store. if _, err := c.getNetworkFromStore(ep.getNetwork().ID()); err != nil { retain = true diff --git a/libnetwork/test/integration/dnet/helpers.bash b/libnetwork/test/integration/dnet/helpers.bash index 11196638fa..9f3d59263f 100644 --- a/libnetwork/test/integration/dnet/helpers.bash +++ b/libnetwork/test/integration/dnet/helpers.bash @@ -345,6 +345,10 @@ function test_overlay() { # Disconnect from overlay network net_disconnect ${start} container_${start} multihost + # Make sure external connectivity works + runc $(dnet_container_name ${start} $dnet_suffix) $(get_sbox_id ${start} container_${start}) \ + "ping -c 1 www.google.com" + # Connect to overlay network again net_connect ${start} container_${start} multihost