Browse Source

Merge "Fix serializing ironic-lib exceptions" into stable/train

tags/5.0.3^0
Zuul 4 weeks ago
committed by Gerrit Code Review
parent
commit
46759750e0
3 changed files with 39 additions and 0 deletions
  1. +12
    -0
      ironic_python_agent/encoding.py
  2. +21
    -0
      ironic_python_agent/tests/unit/test_encoding.py
  3. +6
    -0
      releasenotes/notes/lib-exc-41ee122eb4a04bc4.yaml

+ 12
- 0
ironic_python_agent/encoding.py View File

@@ -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)

+ 21
- 0
ironic_python_agent/tests/unit/test_encoding.py View File

@@ -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'])

+ 6
- 0
releasenotes/notes/lib-exc-41ee122eb4a04bc4.yaml View File

@@ -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