Exemplo n.º 1
0
 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})
Exemplo n.º 2
0
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
Exemplo n.º 3
0
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
Exemplo n.º 4
0
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
Exemplo n.º 5
0
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
Exemplo n.º 6
0
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
Exemplo n.º 7
0
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
Exemplo n.º 8
0
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
Exemplo n.º 9
0
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)
Exemplo n.º 10
0
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
Exemplo n.º 11
0
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
Exemplo n.º 12
0
 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'))
Exemplo n.º 13
0
 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)
Exemplo n.º 14
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)