Merge "Add a default table in "ip rule" command"

This commit is contained in:
Zuul 2022-08-10 07:46:11 +00:00 committed by Gerrit Code Review
commit cead8923c2
3 changed files with 32 additions and 7 deletions

View File

@ -1302,9 +1302,13 @@ def _exist_ip_rule(rules, ip, iif, table, priority, to):
return True
def add_ip_rule(namespace, ip, iif=None, table=None, priority=None, to=None):
def add_ip_rule(namespace, ip, iif=None, table=IP_RULE_TABLES['default'],
priority=None, to=None):
"""Create an IP rule in a namespace
"table" parameter cannot be an empty value (None). By default, this method
will assign "IP_RULE_TABLES['default']" value if None is passed.
:param namespace: (string) namespace name
:param ip: (string) source IP or CIDR address (IPv4, IPv6)
:param iif: (Optional) (string) input interface name
@ -1312,6 +1316,7 @@ def add_ip_rule(namespace, ip, iif=None, table=None, priority=None, to=None):
:param priority: (Optional) (string, int) rule priority
:param to: (Optional) (string) destination IP or CIDR address (IPv4, IPv6)
"""
table = table if table is not None else IP_RULE_TABLES['default']
ip_version = common_utils.get_ip_version(ip)
rules = list_ip_rules(namespace, ip_version)
if _exist_ip_rule(rules, ip, iif, table, priority, to):

View File

@ -197,6 +197,20 @@ class IpLibTestCase(IpLibTestFramework):
for expected_rule in expected_rules[ip_version]:
self.assertNotIn(expected_rule, rules)
def test_add_ip_rule_default_table(self):
attr = self.generate_device_details()
device = self.manage_device(attr)
test_cases = {
constants.IP_VERSION_4: {'ip': '1.1.1.1', 'to': '8.8.8.0/24'},
constants.IP_VERSION_6: {'ip': 'abcd::1', 'to': '1234::/64'}
}
for ip_version, rule in test_cases.items():
ip_lib.add_ip_rule(namespace=device.namespace, **rule)
rules = ip_lib.list_ip_rules(device.namespace, ip_version)
for _rule in rules:
if _rule['from'] == rule['ip'] and _rule['to'] == rule['to']:
self.assertEqual('default', _rule['table'])
def test_device_exists(self):
attr = self.generate_device_details()

View File

@ -321,13 +321,15 @@ class RuleTestCase(functional_base.BaseSudoTestCase):
ip_lenght = common_utils.get_network_length(ip_version)
ip_family = common_utils.get_socket_address_family(ip_version)
priv_ip_lib.add_ip_rule(self.namespace, src=ip_address,
src_len=ip_lenght, family=ip_family)
src_len=ip_lenght, family=ip_family,
table=ip_lib.IP_RULE_TABLES['default'])
rules = ip_lib.list_ip_rules(self.namespace, ip_version)
self._check_rules(rules, ['from'], [ip_address],
'"from" IP address %s' % ip_address)
priv_ip_lib.delete_ip_rule(self.namespace, family=ip_family,
src=ip_address, src_len=ip_lenght)
src=ip_address, src_len=ip_lenght,
table=ip_lib.IP_RULE_TABLES['default'])
rules = ip_lib.list_ip_rules(self.namespace, ip_version)
self.assertFalse(
self._check_rules(rules, ['from'], [ip_address],
@ -378,7 +380,8 @@ class RuleTestCase(functional_base.BaseSudoTestCase):
ip_family = common_utils.get_socket_address_family(ip_version)
priv_ip_lib.add_ip_rule(self.namespace, priority=priority,
src=ip_address, src_len=ip_lenght,
family=ip_family)
family=ip_family,
table=ip_lib.IP_RULE_TABLES['default'])
rules = ip_lib.list_ip_rules(self.namespace, ip_version)
self._check_rules(
rules, ['priority', 'from'], [str(priority), ip_address],
@ -387,7 +390,8 @@ class RuleTestCase(functional_base.BaseSudoTestCase):
priv_ip_lib.delete_ip_rule(self.namespace, priority=priority,
src=ip_address, src_len=ip_lenght,
family=ip_family)
family=ip_family,
table=ip_lib.IP_RULE_TABLES['default'])
rules = ip_lib.list_ip_rules(self.namespace, ip_version)
self.assertFalse(
self._check_rules(rules, ['priority', 'from'],
@ -420,14 +424,16 @@ class RuleTestCase(functional_base.BaseSudoTestCase):
def test_add_rule_exists(self):
iif = 'iif_device_1'
priv_ip_lib.create_interface(iif, self.namespace, 'dummy')
priv_ip_lib.add_ip_rule(self.namespace, iifname=iif)
priv_ip_lib.add_ip_rule(self.namespace, iifname=iif,
table=ip_lib.IP_RULE_TABLES['default'])
rules = ip_lib.list_ip_rules(self.namespace, 4)
self._check_rules(rules, ['iif'], [iif], 'iif name %s' % iif)
self.assertEqual(4, len(rules))
# pyroute2.netlink.exceptions.NetlinkError(17, 'File exists')
# exception is catch.
priv_ip_lib.add_ip_rule(self.namespace, iifname=iif)
priv_ip_lib.add_ip_rule(self.namespace, iifname=iif,
table=ip_lib.IP_RULE_TABLES['default'])
rules = ip_lib.list_ip_rules(self.namespace, 4)
self._check_rules(rules, ['iif'], [iif], 'iif name %s' % iif)
self.assertEqual(4, len(rules))