summaryrefslogtreecommitdiff
path: root/ironic
diff options
context:
space:
mode:
authorDmitry Tantsur <divius.inside@gmail.com>2019-03-04 13:07:54 +0100
committerDmitry Tantsur <divius.inside@gmail.com>2019-03-04 13:16:17 +0100
commit245af384ff582d586ce736aed41017ca39e0db14 (patch)
tree03cb4e8d41916aeb2035e9dd9b3a648706fcab85 /ironic
parent3f6d4c6a789b12512d6cc67cdbc93ba5fbf29848 (diff)
downloadironic-245af384ff582d586ce736aed41017ca39e0db14.tar.gz
Fix TypeError: __str__ returned non-string (type ImageRefValidationFailed)
This change contains two fixes for the same issue: * Do not pass an instance of ImageRefValidationFailed as a message to an exception constructor. * Make sure that IronicException.__str__ always returns an str, even when a non-string is passed as the first argument to __init__. Change-Id: I96edb28955e64915e9d6a481634857fd27690555 Story: #2003682 Task: #26206
Diffstat (limited to 'ironic')
-rw-r--r--ironic/common/exception.py10
-rw-r--r--ironic/drivers/modules/deploy_utils.py2
-rw-r--r--ironic/tests/unit/common/test_exception.py7
-rw-r--r--ironic/tests/unit/drivers/modules/test_deploy_utils.py7
4 files changed, 17 insertions, 9 deletions
diff --git a/ironic/common/exception.py b/ironic/common/exception.py
index e5630990c..4cdbb03dd 100644
--- a/ironic/common/exception.py
+++ b/ironic/common/exception.py
@@ -128,10 +128,12 @@ class IronicException(Exception):
def __str__(self):
"""Encode to utf-8 then wsme api can consume it as well."""
- if not six.PY3:
- return six.text_type(self.args[0]).encode('utf-8')
-
- return self.args[0]
+ value = self.__unicode__()
+ if six.PY3:
+ # On Python 3 unicode is the same as str
+ return value
+ else:
+ return value.encode('utf-8')
def __unicode__(self):
"""Return a unicode representation of the exception message."""
diff --git a/ironic/drivers/modules/deploy_utils.py b/ironic/drivers/modules/deploy_utils.py
index f8b81e9f7..30c8ae652 100644
--- a/ironic/drivers/modules/deploy_utils.py
+++ b/ironic/drivers/modules/deploy_utils.py
@@ -829,7 +829,7 @@ def validate_image_properties(ctx, deploy_info, properties):
raise exception.InvalidParameterValue(_(
"Image %s can not be found.") % image_href)
except exception.ImageRefValidationFailed as e:
- raise exception.InvalidParameterValue(e)
+ raise exception.InvalidParameterValue(err=e)
missing_props = []
for prop in properties:
diff --git a/ironic/tests/unit/common/test_exception.py b/ironic/tests/unit/common/test_exception.py
index 17a80b9fe..5e7f6bcd6 100644
--- a/ironic/tests/unit/common/test_exception.py
+++ b/ironic/tests/unit/common/test_exception.py
@@ -32,7 +32,7 @@ class TestException(exception.IronicException):
class TestIronicException(base.TestCase):
- def test___init__(self):
+ def test___str__encoding(self):
expected = b'\xc3\xa9\xe0\xaf\xb2\xe0\xbe\x84'
if six.PY3:
expected = expected.decode('utf-8')
@@ -40,6 +40,11 @@ class TestIronicException(base.TestCase):
exc = exception.IronicException(message)
self.assertEqual(expected, exc.__str__())
+ def test___str__non_string(self):
+ exc = exception.IronicException(42)
+ self.assertEqual("42", exc.__str__())
+ self.assertEqual(u"42", exc.__unicode__())
+
@mock.patch.object(exception.LOG, 'error', autospec=True)
def test___init___invalid_kwarg(self, log_mock):
self.config(fatal_exception_format_errors=False)
diff --git a/ironic/tests/unit/drivers/modules/test_deploy_utils.py b/ironic/tests/unit/drivers/modules/test_deploy_utils.py
index 4f6d82810..779605de6 100644
--- a/ironic/tests/unit/drivers/modules/test_deploy_utils.py
+++ b/ironic/tests/unit/drivers/modules/test_deploy_utils.py
@@ -1955,9 +1955,10 @@ class ValidateImagePropertiesTestCase(db_base.DbTestCase):
driver_internal_info=DRV_INTERNAL_INFO_DICT,
)
inst_info = utils.get_image_instance_info(node)
- self.assertRaises(exception.InvalidParameterValue,
- utils.validate_image_properties, self.context,
- inst_info, ['kernel', 'ramdisk'])
+ self.assertRaisesRegex(exception.InvalidParameterValue,
+ 'HTTPError',
+ utils.validate_image_properties, self.context,
+ inst_info, ['kernel', 'ramdisk'])
class ValidateParametersTestCase(db_base.DbTestCase):