diff --git a/neutron_lib/api/validators/__init__.py b/neutron_lib/api/validators/__init__.py index ad7396423..0da528643 100644 --- a/neutron_lib/api/validators/__init__.py +++ b/neutron_lib/api/validators/__init__.py @@ -680,6 +680,8 @@ def validate_route_cidr(data, valid_values=None): msg = _("'%(data)s' is not a recognized CIDR," " '%(cidr)s' is recommended") % {"data": data, "cidr": net.cidr} + elif net.is_loopback(): + msg = _("'%(data)s' is not a routable CIDR") % {"data": data} else: return except Exception: diff --git a/neutron_lib/tests/unit/api/validators/test_validators.py b/neutron_lib/tests/unit/api/validators/test_validators.py index 6ab67ca04..d3afc02dd 100644 --- a/neutron_lib/tests/unit/api/validators/test_validators.py +++ b/neutron_lib/tests/unit/api/validators/test_validators.py @@ -742,6 +742,12 @@ class TestAttributeValidation(base.BaseTestCase): "cidr": "192.0.0.0/8"} self.assertEqual(error, msg) + # Invalid - loopback CIDR + cidr = "127.0.0.0/8" + msg = validators.validate_route_cidr(cidr, None) + error = _("'%(data)s' is not a routable CIDR") % {"data": cidr} + self.assertEqual(error, msg) + # Invalid - CIDR format error cidr = 'invalid' msg = validators.validate_route_cidr(cidr, None) diff --git a/releasenotes/notes/validator_check_route_loopback-bc2166b10a754c77.yaml b/releasenotes/notes/validator_check_route_loopback-bc2166b10a754c77.yaml new file mode 100644 index 000000000..78daeb2f6 --- /dev/null +++ b/releasenotes/notes/validator_check_route_loopback-bc2166b10a754c77.yaml @@ -0,0 +1,7 @@ +--- +fixes: + - | + Static route validator should verify that routed CIDR isn't a loopback. + Loopback addresses should not be routable. + Bug: `1834012 `_ +