1
0
Fork 0
mirror of https://github.com/moby/moby.git synced 2022-11-09 12:21:53 -05:00

Delete the interface on endpoint delete in overlay

- Attempt the veth delete only after both ends
  are moved into the default network namespace.
  Which is after both driver.Leave() and
  sandbox.clearNetworkResources() are called.

Signed-off-by: Alessandro Boch <aboch@docker.com>
This commit is contained in:
Alessandro Boch 2016-01-27 12:25:28 -08:00
parent 8763b5981f
commit 83f1107e59
5 changed files with 31 additions and 21 deletions

View file

@ -49,33 +49,33 @@ func (d *driver) Join(nid, eid string, sboxKey string, jinfo driverapi.JoinInfo,
sbox := n.sandbox() sbox := n.sandbox()
name1, name2, err := createVethPair() overlayIfName, containerIfName, err := createVethPair()
if err != nil { if err != nil {
return err return err
} }
ep.ifName = name2 ep.ifName = overlayIfName
// Set the container interface and its peer MTU to 1450 to allow // Set the container interface and its peer MTU to 1450 to allow
// for 50 bytes vxlan encap (inner eth header(14) + outer IP(20) + // for 50 bytes vxlan encap (inner eth header(14) + outer IP(20) +
// outer UDP(8) + vxlan header(8)) // outer UDP(8) + vxlan header(8))
veth, err := netlink.LinkByName(name1) veth, err := netlink.LinkByName(overlayIfName)
if err != nil { if err != nil {
return fmt.Errorf("cound not find link by name %s: %v", name1, err) return fmt.Errorf("cound not find link by name %s: %v", overlayIfName, err)
} }
err = netlink.LinkSetMTU(veth, vxlanVethMTU) err = netlink.LinkSetMTU(veth, vxlanVethMTU)
if err != nil { if err != nil {
return err return err
} }
if err := sbox.AddInterface(name1, "veth", if err := sbox.AddInterface(overlayIfName, "veth",
sbox.InterfaceOptions().Master(s.brName)); err != nil { sbox.InterfaceOptions().Master(s.brName)); err != nil {
return fmt.Errorf("could not add veth pair inside the network sandbox: %v", err) return fmt.Errorf("could not add veth pair inside the network sandbox: %v", err)
} }
veth, err = netlink.LinkByName(name2) veth, err = netlink.LinkByName(containerIfName)
if err != nil { if err != nil {
return fmt.Errorf("could not find link by name %s: %v", name2, err) return fmt.Errorf("could not find link by name %s: %v", containerIfName, err)
} }
err = netlink.LinkSetMTU(veth, vxlanVethMTU) err = netlink.LinkSetMTU(veth, vxlanVethMTU)
if err != nil { if err != nil {
@ -96,7 +96,7 @@ func (d *driver) Join(nid, eid string, sboxKey string, jinfo driverapi.JoinInfo,
} }
if iNames := jinfo.InterfaceName(); iNames != nil { if iNames := jinfo.InterfaceName(); iNames != nil {
err = iNames.SetNames(name2, "eth") err = iNames.SetNames(containerIfName, "eth")
if err != nil { if err != nil {
return err return err
} }
@ -136,14 +136,5 @@ func (d *driver) Leave(nid, eid string) error {
n.leaveSandbox() n.leaveSandbox()
link, err := netlink.LinkByName(ep.ifName)
if err != nil {
log.Warnf("Failed to retrieve interface link for interface removal on endpoint leave: %v", err)
return nil
}
if err := netlink.LinkDel(link); err != nil {
log.Warnf("Failed to delete interface link on endpoint leave: %v", err)
}
return nil return nil
} }

View file

@ -4,8 +4,10 @@ import (
"fmt" "fmt"
"net" "net"
log "github.com/Sirupsen/logrus"
"github.com/docker/libnetwork/driverapi" "github.com/docker/libnetwork/driverapi"
"github.com/docker/libnetwork/netutils" "github.com/docker/libnetwork/netutils"
"github.com/vishvananda/netlink"
) )
type endpointTable map[string]*endpoint type endpointTable map[string]*endpoint
@ -97,6 +99,20 @@ func (d *driver) DeleteEndpoint(nid, eid string) error {
} }
n.deleteEndpoint(eid) n.deleteEndpoint(eid)
if ep.ifName == "" {
return nil
}
link, err := netlink.LinkByName(ep.ifName)
if err != nil {
log.Debugf("Failed to retrieve interface (%s)'s link on endpoint (%s) delete: %v", ep.ifName, ep.id, err)
return nil
}
if err := netlink.LinkDel(link); err != nil {
log.Debugf("Failed to delete interface (%s)'s link on endpoint (%s) delete: %v", ep.ifName, ep.id, err)
}
return nil return nil
} }

View file

@ -160,7 +160,9 @@ func (n *network) destroySandbox() {
sbox := n.sandbox() sbox := n.sandbox()
if sbox != nil { if sbox != nil {
for _, iface := range sbox.Info().Interfaces() { for _, iface := range sbox.Info().Interfaces() {
iface.Remove() if err := iface.Remove(); err != nil {
logrus.Debugf("Remove interface %s failed: %v", iface.SrcName(), err)
}
} }
for _, s := range n.subnets { for _, s := range n.subnets {

View file

@ -8,6 +8,7 @@ import (
"sync" "sync"
"syscall" "syscall"
log "github.com/Sirupsen/logrus"
"github.com/docker/libnetwork/types" "github.com/docker/libnetwork/types"
"github.com/vishvananda/netlink" "github.com/vishvananda/netlink"
) )
@ -127,7 +128,7 @@ func (i *nwIface) Remove() error {
err = netlink.LinkSetName(iface, i.SrcName()) err = netlink.LinkSetName(iface, i.SrcName())
if err != nil { if err != nil {
fmt.Println("LinkSetName failed: ", err) log.Debugf("LinkSetName failed for interface %s: %v", i.SrcName(), err)
return err return err
} }
@ -139,7 +140,7 @@ func (i *nwIface) Remove() error {
} else if !isDefault { } else if !isDefault {
// Move the network interface to caller namespace. // Move the network interface to caller namespace.
if err := netlink.LinkSetNsFd(iface, callerFD); err != nil { if err := netlink.LinkSetNsFd(iface, callerFD); err != nil {
fmt.Println("LinkSetNsPid failed: ", err) log.Debugf("LinkSetNsPid failed for interface %s: %v", i.SrcName(), err)
return err return err
} }
} }

View file

@ -589,7 +589,7 @@ func releaseOSSboxResources(osSbox osl.Sandbox, ep *endpoint) {
// Only remove the interfaces owned by this endpoint from the sandbox. // Only remove the interfaces owned by this endpoint from the sandbox.
if ep.hasInterface(i.SrcName()) { if ep.hasInterface(i.SrcName()) {
if err := i.Remove(); err != nil { if err := i.Remove(); err != nil {
log.Debugf("Remove interface failed: %v", err) log.Debugf("Remove interface %s failed: %v", i.SrcName(), err)
} }
} }
} }