From 1de7d33a0cd92dee2a5c2edcf2b947985080dd8c Mon Sep 17 00:00:00 2001 From: zhanggang Date: Wed, 8 Aug 2018 16:29:19 +0800 Subject: [PATCH] Reject zero volume size in API According the discussion[1], set volume size to 0 makes no sense. This fix reject zero value of volume size with integer or string type. The previous commit[2] has reject negative volume size, with this fix, value like 0, '0' will be rejected and value like 001, '040' will pass. [1] https://review.openstack.org/#/c/589034/ [2] https://review.openstack.org/#/c/164460/ Signed-off-by: zhanggang Change-Id: If18a3c69a2815086cc60f9a6a24e6254cc7856df --- trove/common/apischema.py | 4 +-- trove/tests/api/mgmt/malformed_json.py | 2 +- .../instance/test_instance_controller.py | 30 +++++++++++++++++-- 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/trove/common/apischema.py b/trove/common/apischema.py index fed3bf231e..e714a6526d 100644 --- a/trove/common/apischema.py +++ b/trove/common/apischema.py @@ -50,7 +50,7 @@ configuration_positive_integer = { "type": "string", "maxLength": 40, "minLength": 1, - "pattern": "^[0-9]+$" + "pattern": "^0*[1-9]+[0-9]*$" } configuration_non_empty_string = { @@ -72,7 +72,7 @@ volume_size = { "oneOf": [ { "type": "integer", - "minimum": 0 + "minimum": 1 }, configuration_positive_integer] } diff --git a/trove/tests/api/mgmt/malformed_json.py b/trove/tests/api/mgmt/malformed_json.py index 088ec8058d..bc7e28c6b7 100644 --- a/trove/tests/api/mgmt/malformed_json.py +++ b/trove/tests/api/mgmt/malformed_json.py @@ -168,7 +168,7 @@ class MalformedJson(object): "resize['volume']['size'] %s is not valid under " "any of the given schemas" % data, "%s is not of type 'integer'" % data, - "%s does not match '^[0-9]+$'" % data]) + "%s does not match '^0*[1-9]+[0-9]*$'" % data]) @test def test_bad_change_user_password(self): diff --git a/trove/tests/unittests/instance/test_instance_controller.py b/trove/tests/unittests/instance/test_instance_controller.py index 00aabe2b71..40a7dbfc66 100644 --- a/trove/tests/unittests/instance/test_instance_controller.py +++ b/trove/tests/unittests/instance/test_instance_controller.py @@ -190,6 +190,12 @@ class TestInstanceController(trove_testtools.TestCase): validator = jsonschema.Draft4Validator(schema) self.assertTrue(validator.is_valid(body)) + def test_validate_resize_volume_string_start_with_zero(self): + body = {"resize": {"volume": {"size": "0040"}}} + schema = self.controller.get_schema('action', body) + validator = jsonschema.Draft4Validator(schema) + self.assertTrue(validator.is_valid(body)) + def test_validate_resize_volume_string_invalid_number(self): body = {"resize": {"volume": {"size": '-44.0'}}} schema = self.controller.get_schema('action', body) @@ -197,7 +203,7 @@ class TestInstanceController(trove_testtools.TestCase): self.assertFalse(validator.is_valid(body)) errors = sorted(validator.iter_errors(body), key=lambda e: e.path) self.assertThat(errors[0].context[1].message, - Equals("'-44.0' does not match '^[0-9]+$'")) + Equals("'-44.0' does not match '^0*[1-9]+[0-9]*$'")) self.assertThat(errors[0].path.pop(), Equals('size')) def test_validate_resize_volume_invalid_characters(self): @@ -209,7 +215,27 @@ class TestInstanceController(trove_testtools.TestCase): self.assertThat(errors[0].context[0].message, Equals("'x' is not of type 'integer'")) self.assertThat(errors[0].context[1].message, - Equals("'x' does not match '^[0-9]+$'")) + Equals("'x' does not match '^0*[1-9]+[0-9]*$'")) + self.assertThat(errors[0].path.pop(), Equals('size')) + + def test_validate_resize_volume_zero_number(self): + body = {"resize": {"volume": {"size": 0}}} + schema = self.controller.get_schema('action', body) + validator = jsonschema.Draft4Validator(schema) + self.assertFalse(validator.is_valid(body)) + errors = sorted(validator.iter_errors(body), key=lambda e: e.path) + self.assertThat(errors[0].context[0].message, + Equals("0 is less than the minimum of 1")) + self.assertThat(errors[0].path.pop(), Equals('size')) + + def test_validate_resize_volume_string_zero_number(self): + body = {"resize": {"volume": {"size": '0'}}} + schema = self.controller.get_schema('action', body) + validator = jsonschema.Draft4Validator(schema) + self.assertFalse(validator.is_valid(body)) + errors = sorted(validator.iter_errors(body), key=lambda e: e.path) + self.assertThat(errors[0].context[1].message, + Equals("'0' does not match '^0*[1-9]+[0-9]*$'")) self.assertThat(errors[0].path.pop(), Equals('size')) def test_validate_resize_instance(self):