|
@@ -588,13 +588,26 @@ func (d *driver) createNetwork(config *networkConfiguration) error {
|
|
|
defer osl.InitOSContext()()
|
|
|
|
|
|
networkList := d.getNetworks()
|
|
|
- for _, nw := range networkList {
|
|
|
+ for i, nw := range networkList {
|
|
|
nw.Lock()
|
|
|
nwConfig := nw.config
|
|
|
nw.Unlock()
|
|
|
if err := nwConfig.Conflicts(config); err != nil {
|
|
|
- return types.ForbiddenErrorf("cannot create network %s (%s): conflicts with network %s (%s): %s",
|
|
|
- config.ID, config.BridgeName, nwConfig.ID, nwConfig.BridgeName, err.Error())
|
|
|
+ if config.DefaultBridge {
|
|
|
+ // We encountered and identified a stale default network
|
|
|
+ // We must delete it as libnetwork is the source of thruth
|
|
|
+ // The default network being created must be the only one
|
|
|
+ // This can happen only from docker 1.12 on ward
|
|
|
+ logrus.Infof("Removing stale default bridge network %s (%s)", nwConfig.ID, nwConfig.BridgeName)
|
|
|
+ if err := d.DeleteNetwork(nwConfig.ID); err != nil {
|
|
|
+ logrus.Warnf("Failed to remove stale default network: %s (%s): %v. Will remove from store.", nwConfig.ID, nwConfig.BridgeName, err)
|
|
|
+ d.storeDelete(nwConfig)
|
|
|
+ }
|
|
|
+ networkList = append(networkList[:i], networkList[i+1:]...)
|
|
|
+ } else {
|
|
|
+ return types.ForbiddenErrorf("cannot create network %s (%s): conflicts with network %s (%s): %s",
|
|
|
+ config.ID, config.BridgeName, nwConfig.ID, nwConfig.BridgeName, err.Error())
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -762,12 +775,6 @@ func (d *driver) DeleteNetwork(nid string) error {
|
|
|
return err
|
|
|
}
|
|
|
|
|
|
- // Cannot remove network if endpoints are still present
|
|
|
- if len(n.endpoints) != 0 {
|
|
|
- err = ActiveEndpointsError(n.id)
|
|
|
- return err
|
|
|
- }
|
|
|
-
|
|
|
// We only delete the bridge when it's not the default bridge. This is keep the backward compatible behavior.
|
|
|
if !config.DefaultBridge {
|
|
|
if err := d.nlh.LinkDel(n.bridge.Link); err != nil {
|