From 433e3dfe981219be9078f7cfa0b4cf81af346f1a Mon Sep 17 00:00:00 2001 From: Lei Jitang Date: Thu, 13 Oct 2016 22:15:20 -0400 Subject: [PATCH] Remove driver endpoints on network deleting Signed-off-by: Lei Jitang --- libnetwork/drivers/bridge/bridge.go | 14 ++++++++++++++ libnetwork/drivers/ipvlan/ipvlan_network.go | 10 ++++++++++ libnetwork/drivers/macvlan/macvlan_network.go | 10 ++++++++++ libnetwork/drivers/overlay/ov_network.go | 12 ++++++++++++ 4 files changed, 46 insertions(+) diff --git a/libnetwork/drivers/bridge/bridge.go b/libnetwork/drivers/bridge/bridge.go index 64492eddc2..a30140feae 100644 --- a/libnetwork/drivers/bridge/bridge.go +++ b/libnetwork/drivers/bridge/bridge.go @@ -779,6 +779,20 @@ func (d *driver) DeleteNetwork(nid string) error { config := n.config n.Unlock() + // delele endpoints belong to this network + for _, ep := range n.endpoints { + if err := n.releasePorts(ep); err != nil { + logrus.Warn(err) + } + if link, err := d.nlh.LinkByName(ep.srcName); err == nil { + d.nlh.LinkDel(link) + } + + if err := d.storeDelete(ep); err != nil { + logrus.Warnf("Failed to remove bridge endpoint %s from store: %v", ep.id[0:7], err) + } + } + d.Lock() delete(d.networks, nid) d.Unlock() diff --git a/libnetwork/drivers/ipvlan/ipvlan_network.go b/libnetwork/drivers/ipvlan/ipvlan_network.go index 7a58a382d0..801fc20a7e 100644 --- a/libnetwork/drivers/ipvlan/ipvlan_network.go +++ b/libnetwork/drivers/ipvlan/ipvlan_network.go @@ -8,6 +8,7 @@ import ( "github.com/docker/docker/pkg/stringid" "github.com/docker/libnetwork/driverapi" "github.com/docker/libnetwork/netlabel" + "github.com/docker/libnetwork/ns" "github.com/docker/libnetwork/options" "github.com/docker/libnetwork/osl" "github.com/docker/libnetwork/types" @@ -147,6 +148,15 @@ func (d *driver) DeleteNetwork(nid string) error { } } } + for _, ep := range n.endpoints { + if link, err := ns.NlHandle().LinkByName(ep.srcName); err == nil { + ns.NlHandle().LinkDel(link) + } + + if err := d.storeDelete(ep); err != nil { + logrus.Warnf("Failed to remove ipvlan endpoint %s from store: %v", ep.id[0:7], err) + } + } // delete the *network d.deleteNetwork(nid) // delete the network record from persistent cache diff --git a/libnetwork/drivers/macvlan/macvlan_network.go b/libnetwork/drivers/macvlan/macvlan_network.go index 2975596593..fcc6ccc9e1 100644 --- a/libnetwork/drivers/macvlan/macvlan_network.go +++ b/libnetwork/drivers/macvlan/macvlan_network.go @@ -8,6 +8,7 @@ import ( "github.com/docker/docker/pkg/stringid" "github.com/docker/libnetwork/driverapi" "github.com/docker/libnetwork/netlabel" + "github.com/docker/libnetwork/ns" "github.com/docker/libnetwork/options" "github.com/docker/libnetwork/osl" "github.com/docker/libnetwork/types" @@ -151,6 +152,15 @@ func (d *driver) DeleteNetwork(nid string) error { } } } + for _, ep := range n.endpoints { + if link, err := ns.NlHandle().LinkByName(ep.srcName); err == nil { + ns.NlHandle().LinkDel(link) + } + + if err := d.storeDelete(ep); err != nil { + logrus.Warnf("Failed to remove macvlan endpoint %s from store: %v", ep.id[0:7], err) + } + } // delete the *network d.deleteNetwork(nid) // delete the network record from persistent cache diff --git a/libnetwork/drivers/overlay/ov_network.go b/libnetwork/drivers/overlay/ov_network.go index b5af0f4b04..c6bc67cab5 100644 --- a/libnetwork/drivers/overlay/ov_network.go +++ b/libnetwork/drivers/overlay/ov_network.go @@ -182,6 +182,18 @@ func (d *driver) DeleteNetwork(nid string) error { return fmt.Errorf("could not find network with id %s", nid) } + for _, ep := range n.endpoints { + if ep.ifName != "" { + if link, err := ns.NlHandle().LinkByName(ep.ifName); err != nil { + ns.NlHandle().LinkDel(link) + } + } + + if err := d.deleteEndpointFromStore(ep); err != nil { + logrus.Warnf("Failed to delete overlay endpoint %s from local store: %v", ep.id[0:7], err) + } + + } d.deleteNetwork(nid) vnis, err := n.releaseVxlanID()