From 7463ff253757a53a921d54ed37f27b4544904653 Mon Sep 17 00:00:00 2001 From: Charles Lowell Date: Wed, 30 Oct 2019 09:03:08 -0700 Subject: [PATCH 1/4] default credential handles expected ImportError --- .../azure/identity/_credentials/default.py | 16 +++++++++++----- .../azure/identity/aio/_credentials/default.py | 16 +++++++++++----- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/sdk/identity/azure-identity/azure/identity/_credentials/default.py b/sdk/identity/azure-identity/azure/identity/_credentials/default.py index 4babb4a5b918..be6f96f26037 100644 --- a/sdk/identity/azure-identity/azure/identity/_credentials/default.py +++ b/sdk/identity/azure-identity/azure/identity/_credentials/default.py @@ -2,6 +2,7 @@ # Copyright (c) Microsoft Corporation. # Licensed under the MIT License. # ------------------------------------ +import logging import os from .._constants import EnvironmentVariables @@ -10,6 +11,8 @@ from .managed_identity import ManagedIdentityCredential from .user import SharedTokenCacheCredential +_LOGGER = logging.getLogger(__name__) + class DefaultAzureCredential(ChainedTokenCredential): """A default credential capable of handling most Azure SDK authentication scenarios. @@ -35,10 +38,13 @@ def __init__(self, **kwargs): # SharedTokenCacheCredential is part of the default only on supported platforms. if SharedTokenCacheCredential.supported(): - credentials.append( - SharedTokenCacheCredential( - username=os.environ.get(EnvironmentVariables.AZURE_USERNAME), authority=authority, **kwargs - ) - ) + try: + # username is only required to disambiguate, when the cache contains tokens for multiple identities + username = os.environ.get(EnvironmentVariables.AZURE_USERNAME) + shared_cache = SharedTokenCacheCredential(username=username, authority=authority, **kwargs) + credentials.append(shared_cache) + except ImportError as ex: + # transitive dependency pywin32 doesn't support 3.8 (https://github.com/mhammond/pywin32/issues/1431) + _LOGGER.info("Shared token cache is unavailable: '{}'".format(ex)) super(DefaultAzureCredential, self).__init__(*credentials) diff --git a/sdk/identity/azure-identity/azure/identity/aio/_credentials/default.py b/sdk/identity/azure-identity/azure/identity/aio/_credentials/default.py index 130d219c8e64..5237953f602f 100644 --- a/sdk/identity/azure-identity/azure/identity/aio/_credentials/default.py +++ b/sdk/identity/azure-identity/azure/identity/aio/_credentials/default.py @@ -2,6 +2,7 @@ # Copyright (c) Microsoft Corporation. # Licensed under the MIT License. # ------------------------------------ +import logging import os from ..._constants import EnvironmentVariables @@ -10,6 +11,8 @@ from .managed_identity import ManagedIdentityCredential from .user import SharedTokenCacheCredential +_LOGGER = logging.getLogger(__name__) + class DefaultAzureCredential(ChainedTokenCredential): """A default credential capable of handling most Azure SDK authentication scenarios. @@ -35,10 +38,13 @@ def __init__(self, **kwargs): # SharedTokenCacheCredential is part of the default only on supported platforms. if SharedTokenCacheCredential.supported(): - credentials.append( - SharedTokenCacheCredential( - username=os.environ.get(EnvironmentVariables.AZURE_USERNAME), authority=authority, **kwargs - ) - ) + try: + # username is only required to disambiguate, when the cache contains tokens for multiple identities + username = os.environ.get(EnvironmentVariables.AZURE_USERNAME) + shared_cache = SharedTokenCacheCredential(username=username, authority=authority, **kwargs) + credentials.append(shared_cache) + except ImportError as ex: + # transitive dependency pywin32 doesn't support 3.8 (https://github.com/mhammond/pywin32/issues/1431) + _LOGGER.info("Shared token cache is unavailable: '{}'".format(ex)) super().__init__(*credentials) From 58460c588567f44661259dd053c4d88e2b5e2ce4 Mon Sep 17 00:00:00 2001 From: Charles Lowell Date: Wed, 30 Oct 2019 09:04:24 -0700 Subject: [PATCH 2/4] update history --- sdk/identity/azure-identity/HISTORY.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sdk/identity/azure-identity/HISTORY.md b/sdk/identity/azure-identity/HISTORY.md index 7082e2096e14..dfef1a9daaab 100644 --- a/sdk/identity/azure-identity/HISTORY.md +++ b/sdk/identity/azure-identity/HISTORY.md @@ -1,6 +1,8 @@ # Release History ### 1.1.0b1 Unreleased +- Constructing `DefaultAzureCredential` no longer raises `ImportError` on Python +3.8 on Windows ([8294](https://github.com/Azure/azure-sdk-for-python/pull/8294)) ### 2019-11-05 1.0.1 From a035d7d99533f77f357877a4f2cd3bf6e26c386e Mon Sep 17 00:00:00 2001 From: Charles Lowell Date: Wed, 30 Oct 2019 10:19:26 -0700 Subject: [PATCH 3/4] use logging interpolation syntax --- .../azure-identity/azure/identity/_credentials/default.py | 2 +- .../azure-identity/azure/identity/aio/_credentials/default.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/identity/azure-identity/azure/identity/_credentials/default.py b/sdk/identity/azure-identity/azure/identity/_credentials/default.py index be6f96f26037..7288192f87db 100644 --- a/sdk/identity/azure-identity/azure/identity/_credentials/default.py +++ b/sdk/identity/azure-identity/azure/identity/_credentials/default.py @@ -45,6 +45,6 @@ def __init__(self, **kwargs): credentials.append(shared_cache) except ImportError as ex: # transitive dependency pywin32 doesn't support 3.8 (https://github.com/mhammond/pywin32/issues/1431) - _LOGGER.info("Shared token cache is unavailable: '{}'".format(ex)) + _LOGGER.info("Shared token cache is unavailable: '%s'", ex) super(DefaultAzureCredential, self).__init__(*credentials) diff --git a/sdk/identity/azure-identity/azure/identity/aio/_credentials/default.py b/sdk/identity/azure-identity/azure/identity/aio/_credentials/default.py index 5237953f602f..3be48ca959d1 100644 --- a/sdk/identity/azure-identity/azure/identity/aio/_credentials/default.py +++ b/sdk/identity/azure-identity/azure/identity/aio/_credentials/default.py @@ -45,6 +45,6 @@ def __init__(self, **kwargs): credentials.append(shared_cache) except ImportError as ex: # transitive dependency pywin32 doesn't support 3.8 (https://github.com/mhammond/pywin32/issues/1431) - _LOGGER.info("Shared token cache is unavailable: '{}'".format(ex)) + _LOGGER.info("Shared token cache is unavailable: '%s'", ex) super().__init__(*credentials) From ec18b8a1cb8219def230c5564a91c039c719cc96 Mon Sep 17 00:00:00 2001 From: Charles Lowell Date: Wed, 13 Nov 2019 14:29:16 -0800 Subject: [PATCH 4/4] handle all SharedTokenCacheCredential init exceptions --- .../azure-identity/azure/identity/_credentials/default.py | 2 +- .../azure-identity/azure/identity/aio/_credentials/default.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/identity/azure-identity/azure/identity/_credentials/default.py b/sdk/identity/azure-identity/azure/identity/_credentials/default.py index 7288192f87db..b2ee5a578a3e 100644 --- a/sdk/identity/azure-identity/azure/identity/_credentials/default.py +++ b/sdk/identity/azure-identity/azure/identity/_credentials/default.py @@ -43,7 +43,7 @@ def __init__(self, **kwargs): username = os.environ.get(EnvironmentVariables.AZURE_USERNAME) shared_cache = SharedTokenCacheCredential(username=username, authority=authority, **kwargs) credentials.append(shared_cache) - except ImportError as ex: + except Exception as ex: # pylint:disable=broad-except # transitive dependency pywin32 doesn't support 3.8 (https://github.com/mhammond/pywin32/issues/1431) _LOGGER.info("Shared token cache is unavailable: '%s'", ex) diff --git a/sdk/identity/azure-identity/azure/identity/aio/_credentials/default.py b/sdk/identity/azure-identity/azure/identity/aio/_credentials/default.py index 3be48ca959d1..9f6291df9ef9 100644 --- a/sdk/identity/azure-identity/azure/identity/aio/_credentials/default.py +++ b/sdk/identity/azure-identity/azure/identity/aio/_credentials/default.py @@ -43,7 +43,7 @@ def __init__(self, **kwargs): username = os.environ.get(EnvironmentVariables.AZURE_USERNAME) shared_cache = SharedTokenCacheCredential(username=username, authority=authority, **kwargs) credentials.append(shared_cache) - except ImportError as ex: + except Exception as ex: # pylint:disable=broad-except # transitive dependency pywin32 doesn't support 3.8 (https://github.com/mhammond/pywin32/issues/1431) _LOGGER.info("Shared token cache is unavailable: '%s'", ex)