diff options
author | Sofia Enriquez <lsofia.enriquez@gmail.com> | 2021-01-07 18:07:02 +0000 |
---|---|---|
committer | Sofia Enriquez <lsofia.enriquez@gmail.com> | 2021-01-18 21:54:02 +0000 |
commit | 02037330d863ecbe2471b63bff5461dee6a3c024 (patch) | |
tree | 0cc01a9980deb12145ac3fade318e37f643430e5 | |
parent | 7e48ee79dcbefc2091020efe95a518299e05feff (diff) | |
download | oslo-serialization-02037330d863ecbe2471b63bff5461dee6a3c024.tar.gz |
Fix json to_primitive when using IO OBjects
Currently, using Cinder's backup service with RBD the
backup-create operation gets stuck when logging
('use_json=True' must be set in the config file).
The oslo.log JSONFormatter gets stuck when passing an
RBDVolumeIOWrapper from os-brick. This happens via os-brick's
utils.trace() method which passes a connector containing
{'path': RBDVolumeIOWrapper}.
The oslo.log JSONFormatter format() method calls
oslo_serialization's jsonutils.to_primitive and passes in
this RBDVolumeIOWrapper object.
Therefore the to_primitive method eventually calls
RBDVolumeIOWrapper.read(). In order to fix this the current
path avoids mapping io.IOBase objects and fallback the wrapper
RBD volume object.
Co-authored-by: Eric Harney <eharney@redhat.com>
Closes-Bug: #1908607
Change-Id: I3c416e855cb5f0dc32d14b2749ba92aba8964574
-rw-r--r-- | oslo_serialization/jsonutils.py | 3 | ||||
-rw-r--r-- | oslo_serialization/tests/test_jsonutils.py | 10 | ||||
-rw-r--r-- | releasenotes/notes/bug-1908607-fix-json-to_primitive-IO-OBjects-04faff4a1b5cf48f.yaml | 5 |
3 files changed, 17 insertions, 1 deletions
diff --git a/oslo_serialization/jsonutils.py b/oslo_serialization/jsonutils.py index 0e310b1..a2a700b 100644 --- a/oslo_serialization/jsonutils.py +++ b/oslo_serialization/jsonutils.py @@ -33,6 +33,7 @@ import codecs import datetime import functools import inspect +import io import itertools import json import uuid @@ -161,7 +162,7 @@ def to_primitive(value, convert_instances=False, convert_datetime=True, # Python 3 does not have iteritems elif hasattr(value, 'items'): return recursive(dict(value.items()), level=level + 1) - elif hasattr(value, '__iter__'): + elif hasattr(value, '__iter__') and not isinstance(value, io.IOBase): return list(map(recursive, value)) elif convert_instances and hasattr(value, '__dict__'): # Likely an instance of something. Watch for cycles. diff --git a/oslo_serialization/tests/test_jsonutils.py b/oslo_serialization/tests/test_jsonutils.py index e04b9dc..f076822 100644 --- a/oslo_serialization/tests/test_jsonutils.py +++ b/oslo_serialization/tests/test_jsonutils.py @@ -401,6 +401,16 @@ class ToPrimitiveTestCase(test_base.BaseTestCase): ret = jsonutils.to_primitive(obj, fallback=lambda _: 'fallback') self.assertEqual('fallback', ret) + def test_fallback_typeerror_IO_object(self): + # IO Objects are not callable, cause a TypeError in to_primitive() + obj = io.IOBase + + ret = jsonutils.to_primitive(obj) + self.assertEqual(str(obj), ret) + + ret = jsonutils.to_primitive(obj, fallback=lambda _: 'fallback') + self.assertEqual('fallback', ret) + def test_exception(self): self.assertIn(jsonutils.to_primitive(ValueError("an exception")), ["ValueError('an exception',)", diff --git a/releasenotes/notes/bug-1908607-fix-json-to_primitive-IO-OBjects-04faff4a1b5cf48f.yaml b/releasenotes/notes/bug-1908607-fix-json-to_primitive-IO-OBjects-04faff4a1b5cf48f.yaml new file mode 100644 index 0000000..0246ef7 --- /dev/null +++ b/releasenotes/notes/bug-1908607-fix-json-to_primitive-IO-OBjects-04faff4a1b5cf48f.yaml @@ -0,0 +1,5 @@ +--- +fixes: + - | + `Bug #1908607 <https://bugs.launchpad.net/cinder/+bug/1908607>`_: Fix + json to_primitive when using IO OBjects. |