summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZuul <zuul@review.opendev.org>2022-06-21 08:13:41 +0000
committerGerrit Code Review <review@openstack.org>2022-06-21 08:13:41 +0000
commit1080490d945d34226b4495bd794c85ab34cf0495 (patch)
tree5ee745d3cb46be57ffab23825737062291a96297
parent6bb57080e9233b3f6b2d7c6e6578312afeadf186 (diff)
parenteec1f92bc02e8beb4ce1db9646f8b3b678fb8329 (diff)
downloadheat-1080490d945d34226b4495bd794c85ab34cf0495.tar.gz
Merge "Fix AttributeError in Python 3.8"
-rw-r--r--heat/common/pluginutils.py20
-rw-r--r--heat/tests/test_common_pluginutils.py31
2 files changed, 45 insertions, 6 deletions
diff --git a/heat/common/pluginutils.py b/heat/common/pluginutils.py
index c4da0ec06..1fc9618ee 100644
--- a/heat/common/pluginutils.py
+++ b/heat/common/pluginutils.py
@@ -18,9 +18,17 @@ LOG = logging.getLogger(__name__)
def log_fail_msg(manager, entrypoint, exception):
- LOG.warning('Encountered exception while loading %(module_name)s: '
- '"%(message)s". Not using %(name)s.',
- {'module_name': entrypoint.module,
- 'message': getattr(exception, 'message',
- str(exception)),
- 'name': entrypoint.name})
+ # importlib.metadata in Python 3.8 is quite old and the EntryPoint class
+ # does not have module. This logic is required to workaround AttributeError
+ # caused by that old implementation.
+ if hasattr(entrypoint, 'module'):
+ LOG.warning('Encountered exception while loading %(module_name)s: '
+ '"%(message)s". Not using %(name)s.',
+ {'module_name': entrypoint.module,
+ 'message': getattr(exception, 'message', str(exception)),
+ 'name': entrypoint.name})
+ else:
+ LOG.warning('Encountered exception: "%(message)s". '
+ 'Not using %(name)s.',
+ {'message': getattr(exception, 'message', str(exception)),
+ 'name': entrypoint.name})
diff --git a/heat/tests/test_common_pluginutils.py b/heat/tests/test_common_pluginutils.py
new file mode 100644
index 000000000..7a6264543
--- /dev/null
+++ b/heat/tests/test_common_pluginutils.py
@@ -0,0 +1,31 @@
+# -*- coding: utf-8 -*-
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+import importlib.metadata as importlib_metadata
+from unittest import mock
+
+from heat.common import pluginutils
+from heat.tests import common
+
+
+class TestPluginUtil(common.HeatTestCase):
+
+ def test_log_fail_msg(self):
+ ep = importlib_metadata.EntryPoint(
+ name=None, group=None,
+ value='package.module:attr [extra1, extra2]')
+
+ exc = Exception('Something went wrong')
+ pluginutils.log_fail_msg(mock.Mock(), ep, exc)
+ self.assertIn("Something went wrong", self.LOG.output)