From 6940b4ff0a2823228fab834bfaca6b851c60d8d3 Mon Sep 17 00:00:00 2001 From: Doug Hellmann Date: Sun, 5 Jul 2020 13:55:10 -0400 Subject: [PATCH] use importlib.metadata to get keyring version Importing pkg_resources has a side-effect of scanning the metadata of all of the installed python modules to build an in-memory cache. That cache isn't used anywhere in keystoneclient, and it can be expensive to build. The importlib.metadata module in the 3.8 standard library (and the importlib_metadata library for earlier versions) provides the same version lookup service using a more efficient scanning implementation. Switching from pkg_resources to importlib.metadata will help application startup time, which is especially important for command line programs such as python-openstackclient. Change-Id: Ia89044ff1876eeb2793cd08ed9095ce2ffe89e09 Depends-On: Ic6db7af34c87a636bfe55bacae03c42154f4b9c7 Signed-off-by: Doug Hellmann --- keystoneclient/httpclient.py | 18 +++++++++++++----- lower-constraints.txt | 2 ++ requirements.txt | 2 ++ 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/keystoneclient/httpclient.py b/keystoneclient/httpclient.py index 8d157ce9e..83684e257 100644 --- a/keystoneclient/httpclient.py +++ b/keystoneclient/httpclient.py @@ -20,11 +20,18 @@ import logging import warnings +try: + # For Python 3.8 and later + import importlib.metadata as importlib_metadata +except ImportError: + # For everyone else + import importlib_metadata + from debtcollector import removals from debtcollector import renames from keystoneauth1 import adapter from oslo_serialization import jsonutils -import pkg_resources +import packaging.version import requests try: @@ -33,9 +40,10 @@ try: # NOTE(sdague): The conditional keyring import needs to only # trigger if it's a version of keyring that's supported in global # requirements. Update _min and _bad when that changes. - keyring_v = pkg_resources.parse_version( - pkg_resources.get_distribution("keyring").version) - keyring_min = pkg_resources.parse_version('5.5.1') + keyring_v = packaging.version.Version( + importlib_metadata.version('keyring') + ) + keyring_min = packaging.version.Version('5.5.1') # This is a list of versions, e.g., pkg_resources.parse_version('3.3') keyring_bad = [] @@ -43,7 +51,7 @@ try: import keyring else: keyring = None -except (ImportError, pkg_resources.DistributionNotFound): +except (ImportError, importlib_metadata.PackageNotFoundError): keyring = None pickle = None diff --git a/lower-constraints.txt b/lower-constraints.txt index 49c718813..facff98ca 100644 --- a/lower-constraints.txt +++ b/lower-constraints.txt @@ -16,6 +16,7 @@ future==0.16.0 gitdb==0.6.4 GitPython==1.0.1 idna==2.6 +importlib_metadata==1.7.0 iso8601==0.1.11 jsonschema==2.6.0 keyring==5.5.1 @@ -40,6 +41,7 @@ oslo.log==3.36.0 oslo.serialization==2.18.0 oslo.utils==3.33.0 oslotest==3.2.0 +packaging==20.4 paramiko==2.0.0 pbr==2.0.0 pep257==0.7.0 diff --git a/requirements.txt b/requirements.txt index 65e83de6b..d60afab70 100644 --- a/requirements.txt +++ b/requirements.txt @@ -13,3 +13,5 @@ oslo.utils>=3.33.0 # Apache-2.0 requests>=2.14.2 # Apache-2.0 six>=1.10.0 # MIT stevedore>=1.20.0 # Apache-2.0 +importlib_metadata>=1.7.0;python_version<'3.8' # Apache-2.0 +packaging>=20.4 # BSD