Activity log for bug #1479041

Date Who What changed Old value New value Message
2015-07-28 16:18:50 Thang Pham bug added bug
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
2015-07-28 16:27:50 Thang Pham oslo.versionedobjects: assignee Thang Pham (thang-pham)
2015-07-28 16:58:36 Davanum Srinivas (DIMS) oslo.versionedobjects: status New Confirmed
2015-07-28 16:58:39 Davanum Srinivas (DIMS) oslo.versionedobjects: importance Undecided Medium
2015-08-13 16:49:45 Matt Riedemann oslo.versionedobjects: status Confirmed Fix Committed
2015-08-24 21:35:31 Davanum Srinivas (DIMS) oslo.versionedobjects: status Fix Committed Fix Released
2015-08-24 21:35:31 Davanum Srinivas (DIMS) oslo.versionedobjects: milestone 0.8.0