fields.from_primitive does not support subclasses of VersionedObject

Bug #1479041 reported by Thang Pham
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
oslo.versionedobjects
Fix Released
Medium
Thang Pham

Bug 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.

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

Thang Pham (thang-pham)
description: updated
Thang Pham (thang-pham)
Changed in oslo.versionedobjects:
assignee: nobody → Thang Pham (thang-pham)
Changed in oslo.versionedobjects:
status: New → Confirmed
importance: Undecided → Medium
Revision history for this message
Thang Pham (thang-pham) wrote :
Matt Riedemann (mriedem)
Changed in oslo.versionedobjects:
status: Confirmed → Fix Committed
Changed in oslo.versionedobjects:
milestone: none → 0.8.0
status: Fix Committed → Fix Released
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.