diff --git a/daemon/daemon.go b/daemon/daemon.go index 4e8a24eb6b419..13a54bec48c8b 100644 --- a/daemon/daemon.go +++ b/daemon/daemon.go @@ -1046,6 +1046,8 @@ func (daemon *Daemon) shutdown() error { } group.Wait() + daemon.networks.Shutdown() + return nil } diff --git a/daemon/network.go b/daemon/network.go index 568aa58aae3bc..59a46a9a907cc 100644 --- a/daemon/network.go +++ b/daemon/network.go @@ -89,7 +89,7 @@ func (daemon *Daemon) NetworkDestroy(id string) error { return fmt.Errorf("Network '%s' not found", id) } - if err := net.DestroyNetwork(); err != nil { + if err := net.Destroy(); err != nil { return err } @@ -209,6 +209,15 @@ func (reg *NetworkRegistry) Walk(f func(network *Network)) { } } +func (reg *NetworkRegistry) Shutdown() { + reg.Lock() + defer reg.Unlock() + + for _, network := range reg.networks { + network.Destroy() + } +} + func NewNetwork(networkName, driverName string, labels map[string]string) (*Network, error) { driver, okay := GetNetworkDriver(driverName) if !okay { @@ -228,7 +237,7 @@ func NewNetwork(networkName, driverName string, labels map[string]string) (*Netw return network, nil } -func (net *Network) DestroyNetwork() error { +func (net *Network) Destroy() error { driver, okay := GetNetworkDriver(net.Driver) if !okay { return fmt.Errorf("Driver '%s' not found", net.Driver) @@ -284,7 +293,6 @@ var drivers map[string]Driver func init() { drivers = make(map[string]Driver) - RegisterNetworkDriver("noop", noopDriver{}) RegisterNetworkDriver("simplebridge", simpleBridgeDriver{make(map[string]*simplebridge.Network)}) } @@ -297,22 +305,6 @@ func RegisterNetworkDriver(name string, driver Driver) { drivers[name] = driver } -// Noop network driver just does what its told to; communication is done via labels -type noopDriver struct{} - -func (n noopDriver) Create(network *Network) error { return nil } -func (n noopDriver) Destroy(network *Network) error { return nil } -func (n noopDriver) Plug(network *Network, endpoint *Endpoint) (*execdriver.NetworkInterface, error) { - return &execdriver.NetworkInterface{ - Gateway: "", - IPAddress: "10.0.0.6", - IPPrefixLen: 16, - MacAddress: "02:42:0a:03:00:01", - Bridge: "docker0", - }, nil -} -func (n noopDriver) Unplug(network *Network, endpoint *Endpoint) error { return nil } - // SimpleBridge drivers type simpleBridgeDriver struct { networks map[string]*simplebridge.Network @@ -334,8 +326,13 @@ func (s simpleBridgeDriver) Create(network *Network) error { } func (s simpleBridgeDriver) Destroy(network *Network) error { - // TODO, implement - return nil + net, found := s.networks[network.ID] + if !found { + return fmt.Errorf("Network '%s' not found", network.ID) + } + + delete(s.networks, network.ID) + return net.Destroy() } func (s simpleBridgeDriver) Plug(network *Network, endpoint *Endpoint) (*execdriver.NetworkInterface, error) { diff --git a/daemon/networkdriver/simplebridge/driver.go b/daemon/networkdriver/simplebridge/driver.go index 3a075532d303f..295d18e961369 100644 --- a/daemon/networkdriver/simplebridge/driver.go +++ b/daemon/networkdriver/simplebridge/driver.go @@ -387,6 +387,10 @@ func (n Network) Setup() error { return nil } +func (n Network) Destroy() error { + return netlink.NetworkLinkDel(n.bridgeIface) +} + func (n Network) setupIPTables() error { // Enable NAT