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
