Fix serializing ironic-lib exceptions
Change-Id: If1408e4b81d263c56b4bbab618dd0737db5f762e Story: #2007889 Task: #40268
This commit is contained in:
parent
c1c093fc2e
commit
a4855c544c
@ -15,6 +15,8 @@
|
|||||||
import json
|
import json
|
||||||
import uuid
|
import uuid
|
||||||
|
|
||||||
|
from ironic_lib import exception as lib_exc
|
||||||
|
|
||||||
|
|
||||||
class Serializable(object):
|
class Serializable(object):
|
||||||
"""Base class for things that can be serialized."""
|
"""Base class for things that can be serialized."""
|
||||||
@ -43,6 +45,14 @@ class SerializableComparable(Serializable):
|
|||||||
return self.serialize() != other.serialize()
|
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):
|
class RESTJSONEncoder(json.JSONEncoder):
|
||||||
"""A slightly customized JSON encoder."""
|
"""A slightly customized JSON encoder."""
|
||||||
def encode(self, o):
|
def encode(self, o):
|
||||||
@ -68,5 +78,7 @@ class RESTJSONEncoder(json.JSONEncoder):
|
|||||||
return o.serialize()
|
return o.serialize()
|
||||||
elif isinstance(o, uuid.UUID):
|
elif isinstance(o, uuid.UUID):
|
||||||
return str(o)
|
return str(o)
|
||||||
|
elif isinstance(o, lib_exc.IronicException):
|
||||||
|
return serialize_lib_exc(o)
|
||||||
else:
|
else:
|
||||||
return json.JSONEncoder.default(self, o)
|
return json.JSONEncoder.default(self, o)
|
||||||
|
@ -12,6 +12,10 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
|
import json
|
||||||
|
|
||||||
|
from ironic_lib import exception as lib_exc
|
||||||
|
|
||||||
from ironic_python_agent import encoding
|
from ironic_python_agent import encoding
|
||||||
from ironic_python_agent.tests.unit import base
|
from ironic_python_agent.tests.unit import base
|
||||||
|
|
||||||
@ -59,3 +63,20 @@ class TestSerializableComparable(base.IronicAgentTest):
|
|||||||
# Ensure __hash__ is None
|
# Ensure __hash__ is None
|
||||||
obj = SerializableComparableTesting('hello', 'world')
|
obj = SerializableComparableTesting('hello', 'world')
|
||||||
self.assertIsNone(obj.__hash__)
|
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
releasenotes/notes/lib-exc-41ee122eb4a04bc4.yaml
Normal file
6
releasenotes/notes/lib-exc-41ee122eb4a04bc4.yaml
Normal 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…
Reference in New Issue
Block a user