summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTakashi Kajinami <tkajinam@redhat.com>2022-06-20 10:50:26 +0900
committerTakashi Kajinami <tkajinam@redhat.com>2022-08-17 06:22:20 +0000
commit9e91fa22c3cb9f93af08f7597cff2b6cc0065fda (patch)
treed6e15c40ac066e81566023b4fbf93f2adb18d43e
parentd0e2ded71374cffab41499e75efb81782bf83ffa (diff)
downloadheat-9e91fa22c3cb9f93af08f7597cff2b6cc0065fda.tar.gz
Fix AttributeError in Python 3.8
The importlib-metadata package was imported to the core Python since Python 3.8, and stevedore uses the standard library implementation instead of the 3rd party package in Python 3.8 and later. However the implementation available in Python 3.8 is quite old and especially it does not include the change which added the module attribute[1]. This change makes sure we avoid referring to that attribute if it does not exist, to avoid AttributeError in Python 3.8. [1] https://github.com/python/importlib_metadata/commit/dfc96137ac3583477c02aa97291b0896fb61f282 Backport note: This change includes an additional fix for Python < 3.8, which uses the 3rd party importlib-metadata. Story: 2010095 Task: 45650 Change-Id: Ieba5f353b0fe8a9b187bac1f6ff1b3a8f3b896b3 (cherry picked from commit eec1f92bc02e8beb4ce1db9646f8b3b678fb8329) (cherry picked from commit ecca0fcbeb96608e56005ec40fe586f498b62f66) (cherry picked from commit b8e27f7c47f0f4def7bbd7dc28e6c5c6aba91f9e)
-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)