revise versioned objects' exception message
this patch revise the exception message emitted by versioned objects. Change-Id: I2c063a56f748751a484b324ffd34e44abc843074
This commit is contained in:
parent
01f9db90de
commit
8583987de1
@ -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
|
||||
|
@ -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))
|
||||
|
@ -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'])
|
||||
|
@ -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'])
|
||||
|
@ -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))
|
||||
|
||||
|
||||
|
@ -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))
|
||||
|
||||
|
||||
|
@ -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')
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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):
|
||||
|
Loading…
Reference in New Issue
Block a user