Fix serializing ironic-lib exceptions

Change-Id: If1408e4b81d263c56b4bbab618dd0737db5f762e
Story: #2007889
Task: #40268
(cherry picked from commit a4855c544c)
changes/52/739552/1
Dmitry Tantsur 2 years ago
parent e69f140551
commit 74e9ed159a
  1. 12
      ironic_python_agent/encoding.py
  2. 21
      ironic_python_agent/tests/unit/test_encoding.py
  3. 6
      releasenotes/notes/lib-exc-41ee122eb4a04bc4.yaml

@ -15,6 +15,8 @@
import json
import uuid
from ironic_lib import exception as lib_exc
class Serializable(object):
"""Base class for things that can be serialized."""
@ -43,6 +45,14 @@ class SerializableComparable(Serializable):
return self.serialize() != other.serialize()
def serialize_lib_exc(exc):
"""Serialize an ironic-lib exception."""
return {'type': exc.__class__.__name__,
'code': exc.code,
'message': str(exc),
'details': ''}
class RESTJSONEncoder(json.JSONEncoder):
"""A slightly customized JSON encoder."""
def encode(self, o):
@ -68,5 +78,7 @@ class RESTJSONEncoder(json.JSONEncoder):
return o.serialize()
elif isinstance(o, uuid.UUID):
return str(o)
elif isinstance(o, lib_exc.IronicException):
return serialize_lib_exc(o)
else:
return json.JSONEncoder.default(self, o)

@ -12,6 +12,10 @@
# License for the specific language governing permissions and limitations
# under the License.
import json
from ironic_lib import exception as lib_exc
from ironic_python_agent import encoding
from ironic_python_agent.tests.unit import base
@ -59,3 +63,20 @@ class TestSerializableComparable(base.IronicAgentTest):
# Ensure __hash__ is None
obj = SerializableComparableTesting('hello', 'world')
self.assertIsNone(obj.__hash__)
class TestEncoder(base.IronicAgentTest):
encoder = encoding.RESTJSONEncoder()
def test_encoder(self):
expected = {'jack': 'hello', 'jill': 'world'}
obj = SerializableTesting('hello', 'world')
self.assertEqual(expected, json.loads(self.encoder.encode(obj)))
def test_ironic_lib(self):
obj = lib_exc.InstanceDeployFailure(reason='boom')
encoded = json.loads(self.encoder.encode(obj))
self.assertEqual(500, encoded['code'])
self.assertEqual('InstanceDeployFailure', encoded['type'])
self.assertIn('boom', encoded['message'])

@ -0,0 +1,6 @@
---
fixes:
- |
Fixes serializing exceptions originating from ironic-lib. Previously an
attempt to do so would result in a ``TypeError``, for example:
`Object of type 'InstanceDeployFailure' is not JSON serializable`.
Loading…
Cancel
Save