From badd4d764a1ada326604f7bea3d806cb4eb3558e Mon Sep 17 00:00:00 2001 From: Drew Romanyk Date: Mon, 13 Nov 2017 21:53:14 -0600 Subject: [PATCH] Refactor subnet cidr validator & add new test Signed-off-by: Drew Romanyk --- compose/config/validation.py | 23 ++++++----------------- tests/unit/config/config_test.py | 3 ++- 2 files changed, 8 insertions(+), 18 deletions(-) diff --git a/compose/config/validation.py b/compose/config/validation.py index f97069935..0fdcb37e7 100644 --- a/compose/config/validation.py +++ b/compose/config/validation.py @@ -45,13 +45,11 @@ VALID_NAME_CHARS = '[a-zA-Z0-9\._\-]' VALID_EXPOSE_FORMAT = r'^\d+(\-\d+)?(\/[a-zA-Z]+)?$' VALID_IPV4_SEG = r'(\d{1,2}|1\d{2}|2[0-4]\d|25[0-5])' -VALID_REGEX_IPV4_CIDR = r'^(\d|[1-2]\d|3[0-2])$' VALID_IPV4_ADDR = "({IPV4_SEG}\.){{3}}{IPV4_SEG}".format(IPV4_SEG=VALID_IPV4_SEG) -VALID_REGEX_IPV4_ADDR = "^{IPV4_ADDR}$".format(IPV4_ADDR=VALID_IPV4_ADDR) +VALID_REGEX_IPV4_CIDR = "^{IPV4_ADDR}/(\d|[1-2]\d|3[0-2])$".format(IPV4_ADDR=VALID_IPV4_ADDR) VALID_IPV6_SEG = r'[0-9a-fA-F]{1,4}' -VALID_REGEX_IPV6_CIDR = r'^(\d|[1-9]\d|1[0-1]\d|12[0-8])$' -VALID_REGEX_IPV6_ADDR = "".join(""" +VALID_REGEX_IPV6_CIDR = "".join(""" ^ ( (({IPV6_SEG}:){{7}}{IPV6_SEG})| @@ -67,6 +65,7 @@ VALID_REGEX_IPV6_ADDR = "".join(""" (::(ffff(:0{{1,4}}){{0,1}}:){{0,1}}{IPV4_ADDR})| (({IPV6_SEG}:){{1,4}}:{IPV4_ADDR}) ) +/(\d|[1-9]\d|1[0-1]\d|12[0-8]) $ """.format(IPV6_SEG=VALID_IPV6_SEG, IPV4_ADDR=VALID_IPV4_ADDR).split()) @@ -93,19 +92,9 @@ def format_expose(instance): @FormatChecker.cls_checks("subnet_ip_address", raises=ValidationError) def format_subnet_ip_address(instance): if isinstance(instance, six.string_types): - if '/' not in instance: - raise ValidationError("should be of the format 'IP_ADDRESS/CIDR'") - - ip_address, cidr = instance.split('/') - - if re.match(VALID_REGEX_IPV4_ADDR, ip_address): - if not re.match(VALID_REGEX_IPV4_CIDR, cidr): - raise ValidationError("should be of the format 'IP_ADDRESS/CIDR'") - elif re.match(VALID_REGEX_IPV6_ADDR, ip_address): - if not re.match(VALID_REGEX_IPV6_CIDR, cidr): - raise ValidationError("should be of the format 'IP_ADDRESS/CIDR'") - else: - raise ValidationError("should be of the format 'IP_ADDRESS/CIDR'") + if not re.match(VALID_REGEX_IPV4_CIDR, instance) and \ + not re.match(VALID_REGEX_IPV6_CIDR, instance): + raise ValidationError("should use the CIDR format") return True diff --git a/tests/unit/config/config_test.py b/tests/unit/config/config_test.py index 1cf783c77..32ccf1cec 100644 --- a/tests/unit/config/config_test.py +++ b/tests/unit/config/config_test.py @@ -2866,6 +2866,7 @@ class SubnetTest(unittest.TestCase): "fe80:0000:0000:0000:0204:61ff:fe9d:f156/01", "fe80:0000:0000:0000:0204:61ff:fe9d:f156", "ge80:0000:0000:0000:0204:61ff:fe9d:f156/128", + "192.168.0.1/31/31", ] VALID_SUBNET_MAPPINGS = [ @@ -2902,7 +2903,7 @@ class SubnetTest(unittest.TestCase): with pytest.raises(ConfigurationError) as exc: self.check_config(invalid_subnet) - assert "should be of the format 'IP_ADDRESS/CIDR'" in exc.value.msg + assert "should use the CIDR format" in exc.value.msg def test_config_valid_subnet_format_validation(self): for valid_subnet in self.VALID_SUBNET_MAPPINGS: