summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSofia Enriquez <lsofia.enriquez@gmail.com>2021-01-07 18:07:02 +0000
committerSofia Enriquez <lsofia.enriquez@gmail.com>2021-01-18 21:54:02 +0000
commit02037330d863ecbe2471b63bff5461dee6a3c024 (patch)
tree0cc01a9980deb12145ac3fade318e37f643430e5
parent7e48ee79dcbefc2091020efe95a518299e05feff (diff)
downloadoslo-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.py3
-rw-r--r--oslo_serialization/tests/test_jsonutils.py10
-rw-r--r--releasenotes/notes/bug-1908607-fix-json-to_primitive-IO-OBjects-04faff4a1b5cf48f.yaml5
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.