2015-07-28 16:20:15 |
Thang Pham |
description |
If you subclass base.VersionedObject for a project, such as cinder, you have to have your own OBJ_PROJECT_NAMESPACE (i.e. OBJ_PROJECT_NAMESPACE = "cinder").
Lets assume you have a CinderObject (e.g. Volume) where one of the fields is a fields.ObjectField. That field is another CinderObject (e.g. VolumeType). When a call is made to VersionedObject._obj_from_primitive it attempts to call field.from_primitive, then obj_from_primitive of the versionedobject. The flow is as follows:
1. https://github.com/openstack/oslo.versionedobjects/blob/master/oslo_versionedobjects/base.py#L362-365
2. https://github.com/openstack/oslo.versionedobjects/blob/master/oslo_versionedobjects/fields.py#L506
The problem (#2 above) is it is using VersionedObject superclass and not the subclass (i.e. CinderObject in this example), such that when it comes to https://github.com/openstack/oslo.versionedobjects/blob/master/oslo_versionedobjects/base.py#L370, it raises an exception because the object namespace is "versionedobjects" and not the subclass "cinder" that you want.
The stacktrace is below:
2015-07-28 08:29:08.049 TRACE oslo_messaging.rpc.dispatcher Traceback (most recent call last):
2015-07-28 08:29:08.049 TRACE oslo_messaging.rpc.dispatcher File "/usr/local/lib/python2.7/dist-packages/oslo_messaging/rpc/dispatcher.py", line 142, in _dispatch_and_reply
2015-07-28 08:29:08.049 TRACE oslo_messaging.rpc.dispatcher executor_callback))
2015-07-28 08:29:08.049 TRACE oslo_messaging.rpc.dispatcher File "/usr/local/lib/python2.7/dist-packages/oslo_messaging/rpc/dispatcher.py", line 186, in _dispatch
2015-07-28 08:29:08.049 TRACE oslo_messaging.rpc.dispatcher executor_callback)
2015-07-28 08:29:08.049 TRACE oslo_messaging.rpc.dispatcher File "/usr/local/lib/python2.7/dist-packages/oslo_messaging/rpc/dispatcher.py", line 124, in _do_dispatch
2015-07-28 08:29:08.049 TRACE oslo_messaging.rpc.dispatcher new_args[argname] = self.serializer.deserialize_entity(ctxt, arg)
2015-07-28 08:29:08.049 TRACE oslo_messaging.rpc.dispatcher File "/opt/stack/cinder/cinder/rpc.py", line 117, in deserialize_entity
2015-07-28 08:29:08.049 TRACE oslo_messaging.rpc.dispatcher return self._base.deserialize_entity(context, entity)
2015-07-28 08:29:08.049 TRACE oslo_messaging.rpc.dispatcher File "/usr/local/lib/python2.7/dist-packages/oslo_versionedobjects/base.py", line 854, in deserialize_entity
2015-07-28 08:29:08.049 TRACE oslo_messaging.rpc.dispatcher entity = self._process_object(context, entity)
2015-07-28 08:29:08.049 TRACE oslo_messaging.rpc.dispatcher File "/usr/local/lib/python2.7/dist-packages/oslo_versionedobjects/base.py", line 803, in _process_object
2015-07-28 08:29:08.049 TRACE oslo_messaging.rpc.dispatcher objprim, context=context)
2015-07-28 08:29:08.049 TRACE oslo_messaging.rpc.dispatcher File "/opt/stack/cinder/cinder/objects/base.py", line 96, in obj_from_primitive
2015-07-28 08:29:08.049 TRACE oslo_messaging.rpc.dispatcher return objclass._obj_from_primitive(context, objver, primitive)
2015-07-28 08:29:08.049 TRACE oslo_messaging.rpc.dispatcher File "/opt/stack/cinder/cinder/objects/base.py", line 80, in _obj_from_primitive
2015-07-28 08:29:08.049 TRACE oslo_messaging.rpc.dispatcher objdata[name]))
2015-07-28 08:29:08.049 TRACE oslo_messaging.rpc.dispatcher File "/usr/local/lib/python2.7/dist-packages/oslo_versionedobjects/fields.py", line 203, in from_primitive
2015-07-28 08:29:08.049 TRACE oslo_messaging.rpc.dispatcher return self._type.from_primitive(obj, attr, value)
2015-07-28 08:29:08.049 TRACE oslo_messaging.rpc.dispatcher File "/usr/local/lib/python2.7/dist-packages/oslo_versionedobjects/fields.py", line 514, in from_primitive
2015-07-28 08:29:08.049 TRACE oslo_messaging.rpc.dispatcher return obj_base.VersionedObject.obj_from_primitive(value, obj._context)
2015-07-28 08:29:08.049 TRACE oslo_messaging.rpc.dispatcher File "/usr/local/lib/python2.7/dist-packages/oslo_versionedobjects/base.py", line 378, in obj_from_primitive
2015-07-28 08:29:08.049 TRACE oslo_messaging.rpc.dispatcher objtype='%s.%s' % (objns, objname))
2015-07-28 08:29:08.049 TRACE oslo_messaging.rpc.dispatcher UnsupportedObjectError: Unsupported object type cinder.VolumeType |
If you subclass base.VersionedObject for a project, such as cinder, you have to have your own OBJ_PROJECT_NAMESPACE (i.e. OBJ_PROJECT_NAMESPACE = "cinder").
Lets assume you have a CinderObject (e.g. Volume) where one of the fields is a fields.ObjectField. That field is another CinderObject (e.g. VolumeType). When a call is made to VersionedObject._obj_from_primitive it attempts to call field.from_primitive, then obj_from_primitive of the versionedobject. The flow is as follows:
1. https://github.com/openstack/oslo.versionedobjects/blob/master/oslo_versionedobjects/base.py#L362-365
2. https://github.com/openstack/oslo.versionedobjects/blob/master/oslo_versionedobjects/fields.py#L506
The problem (#2 above) is it is using VersionedObject superclass and not the subclass (i.e. CinderObject in this example), such that when it comes to https://github.com/openstack/oslo.versionedobjects/blob/master/oslo_versionedobjects/base.py#L370, it raises an exception because the object namespace is "versionedobjects" and not the subclass "cinder" that you want.
A solution would be to replace https://github.com/openstack/oslo.versionedobjects/blob/master/oslo_versionedobjects/fields.py#L506 with "return obj.obj_from_primitive(value, obj._context)".
The stacktrace is below:
2015-07-28 08:29:08.049 TRACE oslo_messaging.rpc.dispatcher Traceback (most recent call last):
2015-07-28 08:29:08.049 TRACE oslo_messaging.rpc.dispatcher File "/usr/local/lib/python2.7/dist-packages/oslo_messaging/rpc/dispatcher.py", line 142, in _dispatch_and_reply
2015-07-28 08:29:08.049 TRACE oslo_messaging.rpc.dispatcher executor_callback))
2015-07-28 08:29:08.049 TRACE oslo_messaging.rpc.dispatcher File "/usr/local/lib/python2.7/dist-packages/oslo_messaging/rpc/dispatcher.py", line 186, in _dispatch
2015-07-28 08:29:08.049 TRACE oslo_messaging.rpc.dispatcher executor_callback)
2015-07-28 08:29:08.049 TRACE oslo_messaging.rpc.dispatcher File "/usr/local/lib/python2.7/dist-packages/oslo_messaging/rpc/dispatcher.py", line 124, in _do_dispatch
2015-07-28 08:29:08.049 TRACE oslo_messaging.rpc.dispatcher new_args[argname] = self.serializer.deserialize_entity(ctxt, arg)
2015-07-28 08:29:08.049 TRACE oslo_messaging.rpc.dispatcher File "/opt/stack/cinder/cinder/rpc.py", line 117, in deserialize_entity
2015-07-28 08:29:08.049 TRACE oslo_messaging.rpc.dispatcher return self._base.deserialize_entity(context, entity)
2015-07-28 08:29:08.049 TRACE oslo_messaging.rpc.dispatcher File "/usr/local/lib/python2.7/dist-packages/oslo_versionedobjects/base.py", line 854, in deserialize_entity
2015-07-28 08:29:08.049 TRACE oslo_messaging.rpc.dispatcher entity = self._process_object(context, entity)
2015-07-28 08:29:08.049 TRACE oslo_messaging.rpc.dispatcher File "/usr/local/lib/python2.7/dist-packages/oslo_versionedobjects/base.py", line 803, in _process_object
2015-07-28 08:29:08.049 TRACE oslo_messaging.rpc.dispatcher objprim, context=context)
2015-07-28 08:29:08.049 TRACE oslo_messaging.rpc.dispatcher File "/opt/stack/cinder/cinder/objects/base.py", line 96, in obj_from_primitive
2015-07-28 08:29:08.049 TRACE oslo_messaging.rpc.dispatcher return objclass._obj_from_primitive(context, objver, primitive)
2015-07-28 08:29:08.049 TRACE oslo_messaging.rpc.dispatcher File "/opt/stack/cinder/cinder/objects/base.py", line 80, in _obj_from_primitive
2015-07-28 08:29:08.049 TRACE oslo_messaging.rpc.dispatcher objdata[name]))
2015-07-28 08:29:08.049 TRACE oslo_messaging.rpc.dispatcher File "/usr/local/lib/python2.7/dist-packages/oslo_versionedobjects/fields.py", line 203, in from_primitive
2015-07-28 08:29:08.049 TRACE oslo_messaging.rpc.dispatcher return self._type.from_primitive(obj, attr, value)
2015-07-28 08:29:08.049 TRACE oslo_messaging.rpc.dispatcher File "/usr/local/lib/python2.7/dist-packages/oslo_versionedobjects/fields.py", line 514, in from_primitive
2015-07-28 08:29:08.049 TRACE oslo_messaging.rpc.dispatcher return obj_base.VersionedObject.obj_from_primitive(value, obj._context)
2015-07-28 08:29:08.049 TRACE oslo_messaging.rpc.dispatcher File "/usr/local/lib/python2.7/dist-packages/oslo_versionedobjects/base.py", line 378, in obj_from_primitive
2015-07-28 08:29:08.049 TRACE oslo_messaging.rpc.dispatcher objtype='%s.%s' % (objns, objname))
2015-07-28 08:29:08.049 TRACE oslo_messaging.rpc.dispatcher UnsupportedObjectError: Unsupported object type cinder.VolumeType |
|