Check object's field

A nova object should have all fields as instance of fields.Field.
This patch adds a check on the metaclass to make sure of it.

This check happens only when class import so should have no
runtime performance impact.

Change-Id: I2cdf7eb097fb6907cbd048fa73138b352ab547d7
This commit is contained in:
Yunhong Jiang
2014-04-17 10:57:33 -07:00
parent 4d3ad0631c
commit 32da7aa3d9
3 changed files with 20 additions and 0 deletions

View File

@@ -1381,6 +1381,10 @@ class ObjectActionError(NovaException):
msg_fmt = _('Object action %(action)s failed because: %(reason)s')
class ObjectFieldInvalid(NovaException):
msg_fmt = _('Field %(field)s of %(objname)s is not an instance of Field')
class CoreAPIMissing(NovaException):
msg_fmt = _("Core API extensions are missing: %(missing_apis)s")

View File

@@ -56,6 +56,9 @@ def make_class_properties(cls):
if name not in cls.fields:
cls.fields[name] = field
for name, field in cls.fields.iteritems():
if not isinstance(field, fields.Field):
raise exception.ObjectFieldInvalid(
field=name, objname=cls.obj_name())
def getter(self, name=name):
attrname = get_attrname(name)

View File

@@ -138,6 +138,19 @@ class TestMetaclass(test.TestCase):
self.assertEqual(expected, Test1._obj_classes)
self.assertEqual(expected, Test2._obj_classes)
def test_field_checking(self):
def create_class(field):
class TestField(base.NovaObject):
VERSION = '1.5'
fields = {'foo': field()}
return TestField
cls = create_class(fields.IPV4AndV6AddressField)
self.assertRaises(exception.ObjectFieldInvalid,
create_class, fields.IPV4AndV6Address)
self.assertRaises(exception.ObjectFieldInvalid,
create_class, int)
class TestObjToPrimitive(test.TestCase):