revise versioned objects' exception message

this patch revise the exception message emitted by versioned objects.

Change-Id: I2c063a56f748751a484b324ffd34e44abc843074
This commit is contained in:
RUIJIE YUAN 2017-01-23 15:06:45 +08:00
parent 01f9db90de
commit 8583987de1
9 changed files with 58 additions and 22 deletions

View File

@ -11,6 +11,7 @@
# under the License.
import copy
import uuid
from oslo_config import cfg
from oslo_serialization import jsonutils
@ -61,7 +62,12 @@ class NonNegativeInteger(fields.FieldType):
@staticmethod
def coerce(obj, attr, value):
v = int(value)
try:
v = int(value)
except (TypeError, ValueError):
raise ValueError(_("The value for %(attr)s must be an integer: "
"'%(value)s'.") %
{'attr': attr, 'value': value})
if v < 0:
err = _("Value must be >= 0 for field '%s'.") % attr
raise ValueError(err)
@ -74,6 +80,31 @@ class NonNegativeInteger(fields.FieldType):
}
# TODO(anyone): currently we force check the UUID format for 'marker'
# add worning message to other objects ues UUID.
class UUID(fields.UUID):
_PATTERN = (r'^[a-fA-F0-9]{8}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]'
r'{4}-?[a-fA-F0-9]{12}$')
@staticmethod
def coerce(obj, attr, value):
try:
uuid.UUID(str(value))
except Exception:
if attr == 'marker':
raise ValueError(_("The value for %(attr)s is not a valid "
"UUID: '%(value)s'.") %
{'attr': attr, 'value': value})
else:
pass
return str(value)
def get_schema(self):
return {'type': ['string'], 'pattern': self._PATTERN}
# TODO(Qiming): remove this when oslo patch is released
# i.e. global requirements bump to 1.17.0
class Object(fields.Object):
@ -277,15 +308,15 @@ class Sort(fields.String):
s_key, _sep, s_dir = s.partition(':')
err = None
if not s_key:
err = _("missing sort key for '%s'.") % attr
err = _("Missing sort key for '%s'.") % attr
raise ValueError(err)
if s_key not in self.valid_keys:
err = _("unsupported sort key '%(value)s' for '%(attr)s'."
err = _("Unsupported sort key '%(value)s' for '%(attr)s'."
) % {'attr': attr, 'value': s_key}
if s_dir and s_dir not in ('asc', 'desc'):
err = _("unsupported sort dir '%(value)s' for '%(attr)s'."
err = _("Unsupported sort dir '%(value)s' for '%(attr)s'."
) % {'attr': attr, 'value': s_dir}
if err:
@ -457,6 +488,11 @@ class NameField(fields.AutoTypedField):
AUTO_TYPE = Name()
class UUIDField(fields.AutoTypedField):
AUTO_TYPE = UUID()
class CapacityField(fields.AutoTypedField):
AUTO_TYPE = None

View File

@ -37,8 +37,9 @@ class TestActionListNegativeBadRequest(base.BaseSenlinAPITest):
'actions', {'limit': 'not-int'})
message = ex.resp_body['error']['message']
self.assertEqual("invalid literal for int() with base 10: 'not-int'",
str(message))
self.assertEqual(
"The value for limit must be an integer: 'not-int'.",
str(message))
@test.attr(type=['negative'])
@decorators.idempotent_id('d13e3011-32b5-4f9d-bb57-3532c4c46228')
@ -70,7 +71,7 @@ class TestActionListNegativeBadRequest(base.BaseSenlinAPITest):
'actions', {'sort': 'bad-sort'})
message = ex.resp_body['error']['message']
self.assertEqual("unsupported sort key 'bad-sort' for 'sort'.",
self.assertEqual("Unsupported sort key 'bad-sort' for 'sort'.",
str(message))
@test.attr(type=['negative'])
@ -82,6 +83,5 @@ class TestActionListNegativeBadRequest(base.BaseSenlinAPITest):
message = ex.resp_body['error']['message']
self.assertEqual(
"u'bad-marker' does not match '^[a-fA-F0-9]{8}-?[a-fA-F0-9]"
"{4}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{12}$'",
"The value for marker is not a valid UUID: 'bad-marker'.",
str(message))

View File

@ -51,7 +51,7 @@ class TestClusterPolicyListNegativeBadRequest(base.BaseSenlinAPITest):
{'sort': 'bad-sort'})
message = ex.resp_body['error']['message']
self.assertEqual("unsupported sort key 'bad-sort' for 'sort'.",
self.assertEqual("Unsupported sort key 'bad-sort' for 'sort'.",
str(message))
@test.attr(type=['negative'])

View File

@ -37,7 +37,7 @@ class TestClusterListNegativeBadRequest(base.BaseSenlinAPITest):
'clusters', {'limit': 'not-int'})
message = ex.resp_body['error']['message']
self.assertEqual("invalid literal for int() with base 10: 'not-int'",
self.assertEqual("The value for limit must be an integer: 'not-int'.",
str(message))
@test.attr(type=['negative'])
@ -70,7 +70,7 @@ class TestClusterListNegativeBadRequest(base.BaseSenlinAPITest):
'clusters', {'sort': 'bad-sort'})
message = ex.resp_body['error']['message']
self.assertEqual("unsupported sort key 'bad-sort' for 'sort'.",
self.assertEqual("Unsupported sort key 'bad-sort' for 'sort'.",
str(message))
@test.attr(type=['negative'])
@ -82,8 +82,7 @@ class TestClusterListNegativeBadRequest(base.BaseSenlinAPITest):
message = ex.resp_body['error']['message']
self.assertEqual(
"u'bad-marker' does not match '^[a-fA-F0-9]{8}-?[a-fA-F0-9]"
"{4}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{12}$'",
"The value for marker is not a valid UUID: 'bad-marker'.",
str(message))
@test.attr(type=['negative'])

View File

@ -63,7 +63,7 @@ class TestClusterScaleInInvalidRequest(base.BaseSenlinAPITest):
message = ex.resp_body['error']['message']
self.assertEqual(
"invalid literal for int() with base 10: 'bad-count'",
"The value for count must be an integer: 'bad-count'.",
str(message))

View File

@ -91,7 +91,7 @@ class TestClusterScaleOutInvalidRequest(base.BaseSenlinAPITest):
message = ex.resp_body['error']['message']
self.assertEqual(
"invalid literal for int() with base 10: 'bad-count'",
"The value for count must be an integer: 'bad-count'.",
str(message))

View File

@ -86,7 +86,7 @@ class ClusterPolicyTest(base.SenlinTestCase):
ex = self.assertRaises(ValueError,
orcp.ClusterPolicyListRequest,
**params)
self.assertEqual("unsupported sort key 'bad' for 'sort'.",
self.assertEqual("Unsupported sort key 'bad' for 'sort'.",
six.text_type(ex))
@mock.patch.object(co.Cluster, 'find')

View File

@ -115,7 +115,7 @@ class TestProfileList(test_base.SenlinTestCase):
'name': ['p1'],
'type': ['os.nova.server-1.0'],
'limit': 2,
'marker': 'FAKE_ID',
'marker': 'd8d7dd1e-afd8-4921-83b2-c4ce73b1cb22',
'sort': 'name:asc',
'project_safe': False
}
@ -123,7 +123,8 @@ class TestProfileList(test_base.SenlinTestCase):
self.assertEqual(['p1'], sot.name)
self.assertEqual(['os.nova.server-1.0'], sot.type)
self.assertEqual(2, sot.limit)
self.assertEqual('FAKE_ID', sot.marker)
self.assertEqual('d8d7dd1e-afd8-4921-83b2-c4ce73b1cb22',
sot.marker)
self.assertEqual('name:asc', sot.sort)
self.assertFalse(sot.project_safe)

View File

@ -569,18 +569,18 @@ class TestSort(TestField):
ex = self.assertRaises(ValueError,
self.field.coerce,
obj, 'attr', ':asc')
self.assertEqual("missing sort key for 'attr'.", six.text_type(ex))
self.assertEqual("Missing sort key for 'attr'.", six.text_type(ex))
ex = self.assertRaises(ValueError,
self.field.coerce,
obj, 'attr', 'foo:asc')
self.assertEqual("unsupported sort key 'foo' for 'attr'.",
self.assertEqual("Unsupported sort key 'foo' for 'attr'.",
six.text_type(ex))
ex = self.assertRaises(ValueError,
self.field.coerce,
obj, 'attr', 'key1:down')
self.assertEqual("unsupported sort dir 'down' for 'attr'.",
self.assertEqual("Unsupported sort dir 'down' for 'attr'.",
six.text_type(ex))
def test_get_schema(self):