diff --git a/libnetwork/endpoint.go b/libnetwork/endpoint.go index c357b3298f..5f114483fd 100644 --- a/libnetwork/endpoint.go +++ b/libnetwork/endpoint.go @@ -8,6 +8,7 @@ import ( "path/filepath" "sync" + log "github.com/Sirupsen/logrus" "github.com/docker/docker/pkg/ioutils" "github.com/docker/libnetwork/etchosts" "github.com/docker/libnetwork/netlabel" @@ -342,8 +343,6 @@ func (ep *endpoint) Leave(containerID string, options ...EndpointOption) error { } func (ep *endpoint) Delete() error { - var err error - ep.Lock() epid := ep.id name := ep.name @@ -366,16 +365,17 @@ func (ep *endpoint) Delete() error { driver := n.driver delete(n.endpoints, epid) n.Unlock() - defer func() { - if err != nil { + + if err := driver.DeleteEndpoint(nid, epid); err != nil { + if _, ok := err.(types.ForbiddenError); ok { n.Lock() n.endpoints[epid] = ep n.Unlock() + return err } - }() - - err = driver.DeleteEndpoint(nid, epid) - return err + log.Warnf("driver error deleting endpoint %s : %v", name, err) + } + return nil } func (ep *endpoint) buildHostsFiles() error { diff --git a/libnetwork/network.go b/libnetwork/network.go index e4684b99b5..d82f16945b 100644 --- a/libnetwork/network.go +++ b/libnetwork/network.go @@ -5,6 +5,7 @@ import ( "strings" "sync" + log "github.com/Sirupsen/logrus" "github.com/docker/docker/pkg/stringid" "github.com/docker/libnetwork/datastore" "github.com/docker/libnetwork/driverapi" @@ -160,8 +161,6 @@ func (n *network) processOptions(options ...NetworkOption) { } func (n *network) Delete() error { - var err error - n.ctrlr.Lock() _, ok := n.ctrlr.networks[n.id] if !ok { @@ -179,16 +178,17 @@ func (n *network) Delete() error { delete(n.ctrlr.networks, n.id) n.ctrlr.Unlock() - defer func() { - if err != nil { + if err := n.driver.DeleteNetwork(n.id); err != nil { + // Forbidden Errors should be honored + if _, ok := err.(types.ForbiddenError); ok { n.ctrlr.Lock() n.ctrlr.networks[n.id] = n n.ctrlr.Unlock() + return err } - }() - - err = n.driver.DeleteNetwork(n.id) - return err + log.Warnf("driver error deleting network %s : %v", n.name, err) + } + return nil } func (n *network) CreateEndpoint(name string, options ...EndpointOption) (Endpoint, error) {