def test_get_link_id_device_not_found_do_not_raise_exception(self): device_name = 'strange_device' with mock.patch.object(priv_ip_lib, 'LOG') as mock_log: priv_ip_lib.get_link_id(device_name, None, raise_exception=False) mock_log.debug.assert_called_once_with( 'Interface %(dev)s not found in namespace %(namespace)s', {'dev': device_name, 'namespace': None})
def delete_tc_qdisc(device, parent=None, kind=None, namespace=None, raise_interface_not_found=True, raise_qdisc_not_found=True): """Delete a TC qdisc of a device""" try: index = ip_lib.get_link_id(device, namespace) args = {} if parent: args['parent'] = parent if kind: args['kind'] = kind with ip_lib.get_iproute(namespace) as ip: ip.tc('del', index=index, **args) except ip_lib.NetworkInterfaceNotFound: if raise_interface_not_found: raise except pyroute2.NetlinkError as e: # NOTE(ralonsoh): tc delete will raise a NetlinkError exception with # code (22, 'Invalid argument') if kind='ingress' and the qdisc does # not exist. This behaviour must be refactored in pyroute2. if ((e.code == errno.ENOENT or (e.code == errno.EINVAL and kind == 'ingress')) and raise_qdisc_not_found is False): # NOTE(ralonsoh): return error code for testing purposes return e.code raise except OSError as e: if e.errno == errno.ENOENT: raise ip_lib.NetworkNamespaceNotFound(netns_name=namespace) raise
def add_tc_filter_match32(device, parent, priority, class_id, keys, protocol=None, namespace=None, **kwargs): """Add TC filter, type: match u32""" # NOTE(ralonsoh): by default (protocol=None), every packet is filtered. protocol = protocol or pyroute2_protocols.ETH_P_ALL try: index = ip_lib.get_link_id(device, namespace) with ip_lib.get_iproute(namespace) as ip: ip.tc('add-filter', kind='u32', index=index, parent=parent, priority=priority, target=class_id, protocol=protocol, keys=keys, **kwargs) except OSError as e: if e.errno == errno.ENOENT: raise ip_lib.NetworkNamespaceNotFound(netns_name=namespace) raise
def list_tc_qdiscs(device, namespace=None): """List all TC qdiscs of a device""" index = ip_lib.get_link_id(device, namespace) try: with ip_lib.get_iproute(namespace) as ip: return ip_lib.make_serializable(ip.get_qdiscs(index=index)) except OSError as e: if e.errno == errno.ENOENT: raise ip_lib.NetworkNamespaceNotFound(netns_name=namespace) raise
def add_tc_qdisc(device, namespace=None, **kwargs): """Add TC qdisc""" index = ip_lib.get_link_id(device, namespace) try: with ip_lib.get_iproute(namespace) as ip: ip.tc('replace', index=index, **kwargs) except OSError as e: if e.errno == errno.ENOENT: raise ip_lib.NetworkNamespaceNotFound(netns_name=namespace) raise
def list_tc_filters(device, parent, namespace=None, **kwargs): """List TC filters""" try: index = ip_lib.get_link_id(device, namespace) with ip_lib.get_iproute(namespace) as ip: return ip_lib.make_serializable( ip.get_filters(index=index, parent=parent, **kwargs)) except OSError as e: if e.errno == errno.ENOENT: raise ip_lib.NetworkNamespaceNotFound(netns_name=namespace) raise
def add_tc_policy_class(device, parent, classid, class_type, namespace=None, **kwargs): """Add/replace TC policy class""" try: index = ip_lib.get_link_id(device, namespace) with ip_lib.get_iproute(namespace) as ip: ip.tc('replace-class', kind=class_type, index=index, handle=classid, parent=parent, **kwargs) except OSError as e: if e.errno == errno.ENOENT: raise ip_lib.NetworkNamespaceNotFound(netns_name=namespace) raise
def delete_tc_policy_class(device, parent, classid, namespace=None, **kwargs): """Delete TC policy class""" try: index = ip_lib.get_link_id(device, namespace) with ip_lib.get_iproute(namespace) as ip: ip.tc('del-class', index=index, handle=classid, parent=parent, **kwargs) except OSError as e: if e.errno == errno.ENOENT: raise ip_lib.NetworkNamespaceNotFound(netns_name=namespace) raise except pyroute2.NetlinkError as e: if e.code == errno.ENOENT: raise TrafficControlClassNotFound(classid=classid, namespace=namespace)
def add_tc_filter_policy(device, parent, priority, rate, burst, mtu, action, protocol=None, keys=None, flowid=1, namespace=None, **kwargs): """Add TC filter, type: policy filter By default (protocol=None), that means every packet is shaped. "keys" and "target" (flowid) parameters are mandatory. If the filter is applied on a classless qdisc, "target" is irrelevant and a default value can be passed. If all packets must be shaped, an empty filter ("keys") can be passed. """ keys = keys if keys else ['0x0/0x0'] protocol = protocol or pyroute2_protocols.ETH_P_ALL try: index = ip_lib.get_link_id(device, namespace) with ip_lib.get_iproute(namespace) as ip: ip.tc('add-filter', kind='u32', index=index, parent=parent, priority=priority, protocol=protocol, rate=rate, burst=burst, mtu=mtu, action=action, keys=keys, target=flowid, **kwargs) except OSError as e: if e.errno == errno.ENOENT: raise ip_lib.NetworkNamespaceNotFound(netns_name=namespace) raise
def test_get_link_id(self, mock_iproute): mock_ip = mock.Mock() mock_ip.link_lookup.return_value = ['interface_id'] mock_iproute.return_value.__enter__.return_value = mock_ip self.assertEqual('interface_id', priv_lib.get_link_id('device', 'namespace'))
def test_get_link_id_device_found(self): device_name = 'dev_' + uuidutils.generate_uuid()[:11] ip_lib.IPWrapper().add_dummy(device_name) ip_lib.IPDevice(device_name) self.addCleanup(self._remove_device, device_name) self.assertGreater(priv_ip_lib.get_link_id(device_name, None), 0)
def _add_avr_to_vrf(self, vrf, qvr): vrf_idx = privileged.get_link_id(vrf, None) privileged.set_link_attribute(qvr, None, master=vrf_idx)