Modify the judgment method of CIDR and Add utests

The routing table could not add information, because
the original method could not identify the invalid CIDR.
This patch modify the judgement method. It will help
the router working normally.

Co-Authored-By: Allain Legacy <Allain.legacy@windriver.com>

Change-Id: I4db2e35303492aeda7e14cf9d525cc9b4a54ac36
Closes-Bug: #1805991
Story: 2004567
This commit is contained in:
longqianzhao 2018-12-08 00:23:37 +08:00
parent 26d4f09e80
commit 7da3684098
3 changed files with 57 additions and 1 deletions

View File

@ -599,7 +599,7 @@ def validate_hostroutes(data, valid_values=None):
msg = _verify_dict_keys(expected_keys, hostroute)
if msg:
return msg
msg = validate_subnet(hostroute['destination'])
msg = validate_route_cidr(hostroute['destination'])
if msg:
return msg
msg = validate_ip_address(hostroute['nexthop'])
@ -664,6 +664,30 @@ def validate_subnet(data, valid_values=None):
return msg
def validate_route_cidr(data, valid_values=None):
"""Validate data is a proper CIDR string.
:param data: The data to validate.
:param valid_values: Not used!
:returns: None if data is valid CIDR. Otherwise a human
readable message as to why data is invalid.
"""
msg = None
try:
net = netaddr.IPNetwork(validate_no_whitespace(data))
if '/' not in data or (net.network != net.ip):
msg = _("'%(data)s' is not a recognized CIDR,"
" '%(cidr)s' is recommended") % {"data": data,
"cidr": net.cidr}
else:
return
except Exception:
msg = _("'%s' is not a valid CIDR") % data
if msg:
LOG.debug(msg)
return msg
def validate_subnet_or_none(data, valid_values=None):
"""Validate data is a valid subnet address string or None.

View File

@ -723,6 +723,31 @@ class TestAttributeValidation(base.BaseTestCase):
def test_validate_subnet(self):
self._test_validate_subnet(validators.validate_subnet)
def test_validate_route_cidr(self):
# Valid - CIDR
cidr = "10.0.0.0/8"
msg = validators.validate_route_cidr(cidr, None)
self.assertIsNone(msg)
# Valid - CIDR
cidr = "192.168.1.1/32"
msg = validators.validate_route_cidr(cidr, None)
self.assertIsNone(msg)
# Invalid - CIDR
cidr = "192.168.1.1/8"
msg = validators.validate_route_cidr(cidr, None)
error = _("'%(data)s' is not a recognized CIDR,"
" '%(cidr)s' is recommended") % {"data": cidr,
"cidr": "192.0.0.0/8"}
self.assertEqual(error, msg)
# Invalid - CIDR format error
cidr = 'invalid'
msg = validators.validate_route_cidr(cidr, None)
error = "'%s' is not a valid CIDR" % cidr
self.assertEqual(error, msg)
def test_validate_subnet_or_none(self):
self._test_validate_subnet(validators.validate_subnet_or_none,
allow_none=True)

View File

@ -0,0 +1,7 @@
---
features:
- |
A new function named ``validate_route_cidr`` was introduced
which is used to validate if ``destination`` of ``routes``
and ``destination`` of ``host_routes`` is a network address
of a destination subnet or an IP address of a destination.