diff --git a/os_vif/internal/ip/linux/impl_pyroute2.py b/os_vif/internal/ip/linux/impl_pyroute2.py index da9e849c..de3fa999 100644 --- a/os_vif/internal/ip/linux/impl_pyroute2.py +++ b/os_vif/internal/ip/linux/impl_pyroute2.py @@ -41,11 +41,7 @@ class PyRoute2(ip_command.IpCommand): address=None, promisc=None, master=None): check_exit_code = check_exit_code or [] with iproute.IPRoute() as ip: - idx = ip.link_lookup(ifname=device) - if not idx: - raise exception.NetworkInterfaceNotFound(interface=device) - idx = idx[0] - + idx = self.lookup_interface(ip, device) args = {'index': idx} if state: args['state'] = state @@ -59,13 +55,24 @@ class PyRoute2(ip_command.IpCommand): if promisc is True else utils.unset_mask(flags, ifinfmsg.IFF_PROMISC)) if master: - args['master'] = ip.link_lookup(ifname=master) + args['master'] = self.lookup_interface(ip, master) if isinstance(check_exit_code, int): check_exit_code = [check_exit_code] return self._ip_link(ip, 'set', check_exit_code, **args) + def lookup_interface(self, ip, link): + # TODO(sean-k-mooney): remove try block after we raise + # the min pyroute2 version above 0.5.12 + try: + idx = ip.link_lookup(ifname=link) + except ipexc.NetlinkError: + raise exception.NetworkInterfaceNotFound(interface=link) + if not len(idx): + raise exception.NetworkInterfaceNotFound(interface=link) + return idx[0] + def add(self, device, dev_type, check_exit_code=None, peer=None, link=None, vlan_id=None, ageing=None): check_exit_code = check_exit_code or [] @@ -74,10 +81,7 @@ class PyRoute2(ip_command.IpCommand): 'kind': dev_type} if self.TYPE_VLAN == dev_type: args['vlan_id'] = vlan_id - idx = ip.link_lookup(ifname=link) - if 0 == len(idx): - raise exception.NetworkInterfaceNotFound(interface=link) - args['link'] = idx[0] + args['link'] = self.lookup_interface(ip, link) elif self.TYPE_VETH == dev_type: args['peer'] = peer elif self.TYPE_BRIDGE == dev_type: @@ -106,15 +110,14 @@ class PyRoute2(ip_command.IpCommand): def delete(self, device, check_exit_code=None): check_exit_code = check_exit_code or [] with iproute.IPRoute() as ip: - idx = ip.link_lookup(ifname=device) - if len(idx) == 0: - raise exception.NetworkInterfaceNotFound(interface=device) - idx = idx[0] - + idx = self.lookup_interface(ip, device) return self._ip_link(ip, 'del', check_exit_code, **{'index': idx}) def exists(self, device): """Return True if the device exists.""" with iproute.IPRoute() as ip: - idx = ip.link_lookup(ifname=device) - return True if idx else False + try: + self.lookup_interface(ip, device) + return True + except Exception: + return False diff --git a/os_vif/tests/unit/internal/ip/linux/test_impl_pyroute2.py b/os_vif/tests/unit/internal/ip/linux/test_impl_pyroute2.py index 2338630a..e994d81d 100644 --- a/os_vif/tests/unit/internal/ip/linux/test_impl_pyroute2.py +++ b/os_vif/tests/unit/internal/ip/linux/test_impl_pyroute2.py @@ -134,9 +134,11 @@ class TestIpCommand(base.TestCase): self.ip_link.assert_called_once_with( 'add', ifname=self.DEVICE, kind=self.TYPE_VETH, peer='peer') - self.assertRaises(ipexc.NetlinkError, self.ip.add, self.DEVICE, - self.TYPE_VLAN, peer='peer', - check_exit_code=[self.OTHER_ERROR_CODE]) + self.assertRaises( + exception.NetworkInterfaceNotFound, + self.ip.add, self.DEVICE, + self.TYPE_VLAN, peer='peer', + check_exit_code=[self.OTHER_ERROR_CODE]) def test_delete(self): with mock.patch.object(iproute.IPRoute, 'link_lookup',