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):