[openstack-dev] [Cinder] Getting `ValueError: Field `volume_id' cannot be None`

Thang Pham thang.g.pham at gmail.com
Tue Jun 9 15:12:12 UTC 2015


It should be a field, e.g. admin_metadata, in the snapshot object under
object/snapshot.py.  Look at 'metadata' field as an example of how to
accomplish this.

Thang

On Tue, Jun 9, 2015 at 11:06 AM, Deepak Shetty <dpkshetty at gmail.com> wrote:

> Thangp,
>   I have a related Question wrt your comment in
>
> https://review.openstack.org/#/c/172808/6/cinder/api/contrib/snapshot_actions.py
>
> Do i need to add support for snapshot_admin_metadata table in
> object/snapshot.py or I need to create
> a new object since its a new table, I am not clear on this, can you let me
> know pls ?
>
> ALternatively I am fine if you want to collaborate on my patch and add
> snapshot_admin_metadata object support too ?
>
> Let me know pls
>
> thanx,
> deepak
>
> On Tue, Jun 9, 2015 at 12:12 PM, Deepak Shetty <dpkshetty at gmail.com>
> wrote:
>
>> Thang,
>>   Thanks! Its still not clear to me why my method doesn't work. FWIW, i
>> did try db.snapshot_get = mock.Mock(...) before and when that didn't work,
>> i was just trying out
>> with remotefs.db.snapshot_get with the assumption that maybe some scope
>> issue is there hence I should try using the complete path right from
>> module, but that didn't work either and i guess its still not clear why
>> a mock in one test module affects another.
>>
>> Given that mock.patch is working as evident from your patch, i will
>> continue to use it.
>>
>> Thanks for helping out.
>>
>> On Thu, Jun 4, 2015 at 9:21 PM, Thang Pham <thang.g.pham at gmail.com>
>> wrote:
>>
>>> The problem is in your test case.  There is no such methods as
>>> "remotefs.db.snapshot_get" or "remotefs.db.snapshot_admin_metadata_get".
>>> You need to use "with mock.patch('cinder.db.snapshot_get') as snapshot_get,
>>> mock.patch('cinder.db.snapshot_admin_metadata_get')
>>> as snapshot_admin_metadata_get".  These incorrect calls somehow created a
>>> side effect in the other test cases.  I updated you patch with what is
>>> correct, so you should follow it for you other tests.  Your test case needs
>>> a lot more work, I just edited it to just have it pass the unit tests.
>>>
>>> Thang
>>>
>>> On Thu, Jun 4, 2015 at 4:36 AM, Deepak Shetty <dpkshetty at gmail.com>
>>> wrote:
>>>
>>>> I was able to narrow down to the scenario where it fails only when i do:
>>>>
>>>> ./run_tests.sh -N cinder.tests.unit.test_remotefs
>>>> cinder.tests.unit.test_volume.VolumeTestCase
>>>>
>>>> and fails with:
>>>> {0}
>>>> cinder.tests.unit.test_volume.VolumeTestCase.test_can_delete_errored_snapshot
>>>> [0.507361s] ... FAILED
>>>>
>>>> Captured traceback:
>>>> ~~~~~~~~~~~~~~~~~~~
>>>>     Traceback (most recent call last):
>>>>       File "cinder/tests/unit/test_volume.py", line 3029, in
>>>> test_can_delete_errored_snapshot
>>>>         snapshot_obj = objects.Snapshot.get_by_id(self.context,
>>>> snapshot_id)
>>>>       File
>>>> "/usr/lib/python2.7/site-packages/oslo_versionedobjects/base.py", line 169,
>>>> in wrapper
>>>>         result = fn(cls, context, *args, **kwargs)
>>>>       File "cinder/objects/snapshot.py", line 130, in get_by_id
>>>>         expected_attrs=['metadata'])
>>>>       File "cinder/objects/snapshot.py", line 112, in _from_db_object
>>>>         snapshot[name] = value
>>>>       File
>>>> "/usr/lib/python2.7/site-packages/oslo_versionedobjects/base.py", line 691,
>>>> in __setitem__
>>>>         setattr(self, name, value)
>>>>       File
>>>> "/usr/lib/python2.7/site-packages/oslo_versionedobjects/base.py", line 70,
>>>> in setter
>>>>         field_value = field.coerce(self, name, value)
>>>>       File
>>>> "/usr/lib/python2.7/site-packages/oslo_versionedobjects/fields.py", line
>>>> 183, in coerce
>>>>         return self._null(obj, attr)
>>>>       File
>>>> "/usr/lib/python2.7/site-packages/oslo_versionedobjects/fields.py", line
>>>> 161, in _null
>>>>         raise ValueError(_("Field `%s' cannot be None") % attr)
>>>>     ValueError: Field `volume_id' cannot be None
>>>>
>>>> Both the testsuites run fine when i run them individually, as in the
>>>> below is success:
>>>>
>>>> ./run_tests.sh -N cinder.tests.unit.test_remotefs - no errors
>>>>
>>>> ./run_tests.sh -N cinder.tests.unit.test_volume.VolumeTestCase - no
>>>> errors
>>>>
>>>> So i modified my patch @ https://review.openstack.org/#/c/172808/
>>>> (Patch set 6) and
>>>> removed all testcase i added in test_remotefs.py except one, so that we
>>>> have lesser code to debug/deal with!
>>>>
>>>> See
>>>> https://review.openstack.org/#/c/172808/6/cinder/tests/unit/test_remotefs.py
>>>>
>>>> Now when i disable test_create_snapshot_online_success then running
>>>> both the suites work,
>>>> but when i enable test_create_snapshot_online_success then it fails as
>>>> above.
>>>>
>>>> I am unable to figure whats the connection between test_create_snapshot_online_success
>>>> in test_remotefs.py
>>>> and VolumeTestCase.test_can_delete_errored_snapshot in test_volume.py
>>>> failure
>>>>
>>>> Can someone help here ?
>>>>
>>>> thanx,
>>>> deepak
>>>>
>>>>
>>>>
>>>> On Thu, Jun 4, 2015 at 1:37 PM, Deepak Shetty <dpkshetty at gmail.com>
>>>> wrote:
>>>>
>>>>> Hi Thang,
>>>>>   Since you are working on Snapshot Objects, any idea on why the
>>>>> testcase when run all by itself, works, but when run as part of the overall
>>>>> suite, fails ?
>>>>> This seems to be related to the Snapshot Objects, hence Ccing you.
>>>>>
>>>>> On Wed, Jun 3, 2015 at 9:54 PM, Deepak Shetty <dpkshetty at gmail.com>
>>>>> wrote:
>>>>>
>>>>>> Hi All,
>>>>>>   I am hitting a strange issue when running Cinder unit tests against
>>>>>> my patch @
>>>>>> https://review.openstack.org/#/c/172808/5
>>>>>>
>>>>>> I have spent 1 day and haven't been successfull at figuring how/why
>>>>>> my patch is causing it!
>>>>>>
>>>>>> All tests failing are part of VolumeTestCase suite and from the error
>>>>>> (see below) it seems
>>>>>> the Snapshot Object is complaining that 'volume_id' field is null
>>>>>> (while it shouldn't be)
>>>>>>
>>>>>> An example error from the associated Jenkins run can be seen @
>>>>>>
>>>>>> http://logs.openstack.org/08/172808/5/check/gate-cinder-python27/0abd15e/console.html.gz#_2015-05-22_13_28_47_140
>>>>>>
>>>>>> I am seeing a total of 21 such errors.
>>>>>>
>>>>>> Its strange because, when I try to reproduce it locally in my
>>>>>> devstack env, I see the below:
>>>>>>
>>>>>> 1) When i just run: ./run_tests.sh -N cinder.tests.unit.test_volume.
>>>>>> VolumeTestCase
>>>>>> all testcases pass
>>>>>>
>>>>>> 2) When i run 1 individual testcase: ./run_tests.sh -N
>>>>>> cinder.tests.unit.test_volume.VolumeTestCase.test_delete_
>>>>>> busy_snapshot
>>>>>> that passes too
>>>>>>
>>>>>> 3) When i run : ./run_tests.sh -N
>>>>>> I see 21 tests failing and all are failing with error similar to the
>>>>>> below
>>>>>>
>>>>>> {0} cinder.tests.unit.test_volume.VolumeTestCase.test_delete_busy_snapshot
>>>>>> [0.537366s] ... FAILED
>>>>>>
>>>>>> Captured traceback:
>>>>>> ~~~~~~~~~~~~~~~~~~~
>>>>>>     Traceback (most recent call last):
>>>>>>       File "cinder/tests/unit/test_volume.py", line 3219, in
>>>>>> test_delete_busy_snapshot
>>>>>>         snapshot_obj = objects.Snapshot.get_by_id(self.context,
>>>>>> snapshot_id)
>>>>>>       File "/usr/lib/python2.7/site-packages/oslo_versionedobjects/base.py",
>>>>>> line 163, in wrapper
>>>>>>         result = fn(cls, context, *args, **kwargs)
>>>>>>       File "cinder/objects/snapshot.py", line 130, in get_by_id
>>>>>>         expected_attrs=['metadata'])
>>>>>>       File "cinder/objects/snapshot.py", line 112, in _from_db_object
>>>>>>         snapshot[name] = value
>>>>>>       File "/usr/lib/python2.7/site-packages/oslo_versionedobjects/base.py",
>>>>>> line 675, in __setitem__
>>>>>>         setattr(self, name, value)
>>>>>>       File "/usr/lib/python2.7/site-packages/oslo_versionedobjects/base.py",
>>>>>> line 70, in setter
>>>>>>         field_value = field.coerce(self, name, value)
>>>>>>       File "/usr/lib/python2.7/site-packages/oslo_versionedobjects/fields.py",
>>>>>> line 182, in coerce
>>>>>>         return self._null(obj, attr)
>>>>>>       File "/usr/lib/python2.7/site-packages/oslo_versionedobjects/fields.py",
>>>>>> line 160, in _null
>>>>>>         raise ValueError(_("Field `%s' cannot be None") % attr)
>>>>>>     ValueError: Field `volume_id' cannot be None
>>>>>>
>>>>>> Any suggestions / thoughts on why this could be happening ?
>>>>>>
>>>>>> thanx,
>>>>>> deepak
>>>>>>
>>>>>
>>>>>
>>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openstack.org/pipermail/openstack-dev/attachments/20150609/abf98aaf/attachment.html>


More information about the OpenStack-dev mailing list