summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZuul <zuul@review.opendev.org>2022-08-17 06:19:26 +0000
committerGerrit Code Review <review@openstack.org>2022-08-17 06:19:26 +0000
commit85200f833297743aa673f059fed5c82aea74e9c8 (patch)
tree54435790e940089cf9e9a5f5a858de1519ff5a5c
parentead7cd61bd685ea46dd21c4ef3ea6b3fde273c10 (diff)
parentb8e27f7c47f0f4def7bbd7dc28e6c5c6aba91f9e (diff)
downloadheat-85200f833297743aa673f059fed5c82aea74e9c8.tar.gz
Merge "Fix AttributeError in Python 3.8" into stable/xena
-rw-r--r--heat/common/pluginutils.py20
-rw-r--r--heat/tests/test_common_pluginutils.py37
2 files changed, 51 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..0519725da
--- /dev/null
+++ b/heat/tests/test_common_pluginutils.py
@@ -0,0 +1,37 @@
+# -*- 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.
+
+from unittest import mock
+
+from heat.common import pluginutils
+from heat.tests import common
+
+try:
+ # For python 3.8 and later
+ import importlib.metadata as importlib_metadata
+except ImportError:
+ # For everyone else
+ import importlib_metadata
+
+
+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)