support pyroute2 0.5.13
This change modifes os-vif add interface to account for the new behavior of link_lookup. In 0.5.13 if a link is not found link_lookup returns an empty list. In previous releases it raised ipexc.NetlinkError. Closes-bug: #1890353 Change-Id: I567afb544425c1b91d98968a0b597be718869089
This commit is contained in:
parent
989f5a7d92
commit
c8703df185
@ -41,11 +41,7 @@ class PyRoute2(ip_command.IpCommand):
|
|||||||
address=None, promisc=None, master=None):
|
address=None, promisc=None, master=None):
|
||||||
check_exit_code = check_exit_code or []
|
check_exit_code = check_exit_code or []
|
||||||
with iproute.IPRoute() as ip:
|
with iproute.IPRoute() as ip:
|
||||||
idx = ip.link_lookup(ifname=device)
|
idx = self.lookup_interface(ip, device)
|
||||||
if not idx:
|
|
||||||
raise exception.NetworkInterfaceNotFound(interface=device)
|
|
||||||
idx = idx[0]
|
|
||||||
|
|
||||||
args = {'index': idx}
|
args = {'index': idx}
|
||||||
if state:
|
if state:
|
||||||
args['state'] = state
|
args['state'] = state
|
||||||
@ -59,13 +55,24 @@ class PyRoute2(ip_command.IpCommand):
|
|||||||
if promisc is True else
|
if promisc is True else
|
||||||
utils.unset_mask(flags, ifinfmsg.IFF_PROMISC))
|
utils.unset_mask(flags, ifinfmsg.IFF_PROMISC))
|
||||||
if master:
|
if master:
|
||||||
args['master'] = ip.link_lookup(ifname=master)
|
args['master'] = self.lookup_interface(ip, master)
|
||||||
|
|
||||||
if isinstance(check_exit_code, int):
|
if isinstance(check_exit_code, int):
|
||||||
check_exit_code = [check_exit_code]
|
check_exit_code = [check_exit_code]
|
||||||
|
|
||||||
return self._ip_link(ip, 'set', check_exit_code, **args)
|
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,
|
def add(self, device, dev_type, check_exit_code=None, peer=None, link=None,
|
||||||
vlan_id=None, ageing=None):
|
vlan_id=None, ageing=None):
|
||||||
check_exit_code = check_exit_code or []
|
check_exit_code = check_exit_code or []
|
||||||
@ -74,10 +81,7 @@ class PyRoute2(ip_command.IpCommand):
|
|||||||
'kind': dev_type}
|
'kind': dev_type}
|
||||||
if self.TYPE_VLAN == dev_type:
|
if self.TYPE_VLAN == dev_type:
|
||||||
args['vlan_id'] = vlan_id
|
args['vlan_id'] = vlan_id
|
||||||
idx = ip.link_lookup(ifname=link)
|
args['link'] = self.lookup_interface(ip, link)
|
||||||
if 0 == len(idx):
|
|
||||||
raise exception.NetworkInterfaceNotFound(interface=link)
|
|
||||||
args['link'] = idx[0]
|
|
||||||
elif self.TYPE_VETH == dev_type:
|
elif self.TYPE_VETH == dev_type:
|
||||||
args['peer'] = peer
|
args['peer'] = peer
|
||||||
elif self.TYPE_BRIDGE == dev_type:
|
elif self.TYPE_BRIDGE == dev_type:
|
||||||
@ -106,15 +110,14 @@ class PyRoute2(ip_command.IpCommand):
|
|||||||
def delete(self, device, check_exit_code=None):
|
def delete(self, device, check_exit_code=None):
|
||||||
check_exit_code = check_exit_code or []
|
check_exit_code = check_exit_code or []
|
||||||
with iproute.IPRoute() as ip:
|
with iproute.IPRoute() as ip:
|
||||||
idx = ip.link_lookup(ifname=device)
|
idx = self.lookup_interface(ip, device)
|
||||||
if len(idx) == 0:
|
|
||||||
raise exception.NetworkInterfaceNotFound(interface=device)
|
|
||||||
idx = idx[0]
|
|
||||||
|
|
||||||
return self._ip_link(ip, 'del', check_exit_code, **{'index': idx})
|
return self._ip_link(ip, 'del', check_exit_code, **{'index': idx})
|
||||||
|
|
||||||
def exists(self, device):
|
def exists(self, device):
|
||||||
"""Return True if the device exists."""
|
"""Return True if the device exists."""
|
||||||
with iproute.IPRoute() as ip:
|
with iproute.IPRoute() as ip:
|
||||||
idx = ip.link_lookup(ifname=device)
|
try:
|
||||||
return True if idx else False
|
self.lookup_interface(ip, device)
|
||||||
|
return True
|
||||||
|
except Exception:
|
||||||
|
return False
|
||||||
|
@ -134,7 +134,9 @@ class TestIpCommand(base.TestCase):
|
|||||||
self.ip_link.assert_called_once_with(
|
self.ip_link.assert_called_once_with(
|
||||||
'add', ifname=self.DEVICE, kind=self.TYPE_VETH, peer='peer')
|
'add', ifname=self.DEVICE, kind=self.TYPE_VETH, peer='peer')
|
||||||
|
|
||||||
self.assertRaises(ipexc.NetlinkError, self.ip.add, self.DEVICE,
|
self.assertRaises(
|
||||||
|
exception.NetworkInterfaceNotFound,
|
||||||
|
self.ip.add, self.DEVICE,
|
||||||
self.TYPE_VLAN, peer='peer',
|
self.TYPE_VLAN, peer='peer',
|
||||||
check_exit_code=[self.OTHER_ERROR_CODE])
|
check_exit_code=[self.OTHER_ERROR_CODE])
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user