summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSofia Enriquez <lsofia.enriquez@gmail.com>2021-01-07 18:07:02 +0000
committerHervé Beraud <hberaud@redhat.com>2021-02-02 14:45:37 +0100
commitfcd737e2b19a4fee58db79281b336342f0f09d7b (patch)
tree8a364f253bc0a531ed7b45a1f776fff61555828a
parent57fd9dd9e0097095762c4a605055dd75074d5e89 (diff)
downloadoslo-serialization-stable/victoria.tar.gz
Fix json to_primitive when using IO OBjectsvictoria-em4.0.2stable/victoria
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 (cherry picked from commit 02037330d863ecbe2471b63bff5461dee6a3c024)
-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.