Petr Horáček has uploaded a new change for review.

Change subject: network/api.py: delete network's orphans
......................................................................

network/api.py: delete network's orphans

When addNetwork in testHonorBlockingDhcp fails, it lefts devices
(in this test's case the bridge).

setupNetworks function is changed to remove these leftOvers in case
of addNetwork's ConfigNetworkError.

Change-Id: Id14d109d67c5906bc85a2fcf98dfabd61d96da13
Signed-off-by: Petr Horáček <[email protected]>
---
M tests/functional/networkTests.py
M vdsm/network/api.py
2 files changed, 46 insertions(+), 2 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/18/31018/1

diff --git a/tests/functional/networkTests.py b/tests/functional/networkTests.py
index 038dde2..48714c7 100644
--- a/tests/functional/networkTests.py
+++ b/tests/functional/networkTests.py
@@ -2115,6 +2115,7 @@
         # reporting success before knowing if dhclient succeeded. With blocking
         # it must not report success
         self.assertNotEqual(status, SUCCESS, msg)
+        self.assertBridgeDoesntExist(NETWORK_NAME)
 
     @cleanupNet
     @ValidateRunningAsRoot
diff --git a/vdsm/network/api.py b/vdsm/network/api.py
index b2cfa41..61725be 100755
--- a/vdsm/network/api.py
+++ b/vdsm/network/api.py
@@ -587,6 +587,42 @@
     return hook_dict
 
 
+def _emergencyNetworkCleanup(network, networkAttrs, configurator):
+    """Remove all leftovers after failed setupNetwork"""
+    d = dict(networkAttrs)
+    _netinfo = netinfo.NetInfo()
+
+    def _used(devName):
+        masters = _netinfo.ifaceUsers(devName)
+        masters_to_be_removed = set()
+        if 'vlan' in d:
+            masters_to_be_removed.add('%s.%s' % (devName, d['vlan']))
+        if d['bridged']:
+            masters_to_be_removed.add(network)
+        used = True if masters - masters_to_be_removed else False
+        return used
+
+    topNetDev = None
+    if 'bonding' in d:
+        if d['bonding'] in _netinfo.bondings:
+            if not _used(d['bonding']):
+                topNetDev = Bond.objectivize(d['bonding'], configurator, None,
+                                             None, None, _netinfo, True)
+    elif 'nic' in d:
+        if d['nic'] in _netinfo.nics:
+            if not _used(d['nic']):
+                topNetDev = Nic(d['nic'], configurator, _netinfo=_netinfo)
+    if 'vlan' in d:
+        vlan_name = '%s.%s' % (topNetDev.name, d['vlan'])
+        if vlan_name in _netinfo.vlans:
+            topNetDev = Vlan(topNetDev, d['vlan'], configurator)
+    if d['bridged']:
+        if network in _netinfo.bridges:
+            topNetDev = Bridge(network, configurator, port=topNetDev)
+
+    topNetDev.remove()
+
+
 def setupNetworks(networks, bondings, **options):
     """Add/Edit/Remove configuration for networks and bondings.
 
@@ -697,8 +733,15 @@
             d['force'] = force
 
             logger.debug("Adding network %r", network)
-            addNetwork(network, configurator=configurator,
-                       implicitBonding=True, _netinfo=_netinfo, **d)
+            try:
+                addNetwork(network, configurator=configurator,
+                           implicitBonding=True, _netinfo=_netinfo, **d)
+            except ConfigNetworkError:
+                logger.debug("Adding network %r failed. Running orphan-devices 
\
+                             cleanup", network)
+                _emergencyNetworkCleanup(network, networkAttrs, configurator)
+                raise
+
             _netinfo.updateDevices()  # Things like a bond mtu can change
 
         if utils.tobool(options.get('connectivityCheck', True)):


-- 
To view, visit http://gerrit.ovirt.org/31018
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Id14d109d67c5906bc85a2fcf98dfabd61d96da13
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Petr Horáček <[email protected]>
_______________________________________________
vdsm-patches mailing list
[email protected]
https://lists.fedorahosted.org/mailman/listinfo/vdsm-patches

Reply via email to