From f7f91b6e863fb5e609db4f03885f10960c922d94 Mon Sep 17 00:00:00 2001 From: Charles Lowell Date: Fri, 2 Aug 2019 16:12:18 -0700 Subject: [PATCH 1/4] Policies as kwargs --- .../keyvault/keys/_shared/async_client_base.py | 16 ++++++++++++++++ .../azure/keyvault/keys/_shared/client_base.py | 16 ++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/_shared/async_client_base.py b/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/_shared/async_client_base.py index 8018b3110248..f4c2f301ff84 100644 --- a/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/_shared/async_client_base.py +++ b/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/_shared/async_client_base.py @@ -39,6 +39,22 @@ def _create_config( # https://github.com/Azure/azure-sdk-for-python/issues/6637 config.user_agent_policy = UserAgentPolicy(base_user_agent=USER_AGENT, **kwargs) + # Override config policies if found in kwargs + if "user_agent_policy" in kwargs: + config.user_agent_policy = kwargs["user_agent_policy"] + if "headers_policy" in kwargs: + config.headers_policy = kwargs["headers_policy"] + if "proxy_policy" in kwargs: + config.proxy_policy = kwargs["proxy_policy"] + if "logging_policy" in kwargs: + config.logging_policy = kwargs["logging_policy"] + if "retry_policy" in kwargs: + config.retry_policy = kwargs["retry_policy"] + if "custom_hook_policy" in kwargs: + config.custom_hook_policy = kwargs["custom_hook_policy"] + if "redirect_policy" in kwargs: + config.redirect_policy = kwargs["redirect_policy"] + return config def __init__( diff --git a/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/_shared/client_base.py b/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/_shared/client_base.py index a521c09a1585..6beb355de100 100644 --- a/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/_shared/client_base.py +++ b/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/_shared/client_base.py @@ -39,6 +39,22 @@ def _create_config(credential, api_version=None, **kwargs): # https://github.com/Azure/azure-sdk-for-python/issues/6637 config.user_agent_policy = UserAgentPolicy(base_user_agent=USER_AGENT, **kwargs) + # Override config policies if found in kwargs + if "user_agent_policy" in kwargs: + config.user_agent_policy = kwargs["user_agent_policy"] + if "headers_policy" in kwargs: + config.headers_policy = kwargs["headers_policy"] + if "proxy_policy" in kwargs: + config.proxy_policy = kwargs["proxy_policy"] + if "logging_policy" in kwargs: + config.logging_policy = kwargs["logging_policy"] + if "retry_policy" in kwargs: + config.retry_policy = kwargs["retry_policy"] + if "custom_hook_policy" in kwargs: + config.custom_hook_policy = kwargs["custom_hook_policy"] + if "redirect_policy" in kwargs: + config.redirect_policy = kwargs["redirect_policy"] + return config def __init__(self, vault_url, credential, transport=None, api_version=None, **kwargs): From 3f2e2cd8bae31b5ea3ad734559544a589ef7d58a Mon Sep 17 00:00:00 2001 From: Charles Lowell Date: Fri, 2 Aug 2019 16:12:50 -0700 Subject: [PATCH 2/4] Move user agent constant out of _shared --- .../azure/keyvault/keys/_shared/__init__.py | 6 ------ .../azure/keyvault/keys/_shared/async_client_base.py | 3 ++- .../azure/keyvault/keys/_shared/client_base.py | 2 +- .../azure/keyvault/keys/_user_agent.py | 10 ++++++++++ .../azure/keyvault/secrets/_user_agent.py | 10 ++++++++++ 5 files changed, 23 insertions(+), 8 deletions(-) create mode 100644 sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/_user_agent.py create mode 100644 sdk/keyvault/azure-keyvault-secrets/azure/keyvault/secrets/_user_agent.py diff --git a/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/_shared/__init__.py b/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/_shared/__init__.py index f4b6c6c3563a..72fb27441900 100644 --- a/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/_shared/__init__.py +++ b/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/_shared/__init__.py @@ -3,8 +3,6 @@ # Licensed under the MIT License. # ------------------------------------ from collections import namedtuple -import platform -from .._version import VERSION try: import urllib.parse as parse @@ -12,10 +10,6 @@ # pylint:disable=import-error import urlparse as parse # type: ignore -USER_AGENT = "azsdk-python-keyvault-keys/{} Python/{} ({})".format( - VERSION, platform.python_version(), platform.platform() -) - from .challenge_auth_policy import ChallengeAuthPolicy, ChallengeAuthPolicyBase from .client_base import KeyVaultClientBase from .http_challenge import HttpChallenge diff --git a/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/_shared/async_client_base.py b/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/_shared/async_client_base.py index f4c2f301ff84..84b2d367a30b 100644 --- a/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/_shared/async_client_base.py +++ b/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/_shared/async_client_base.py @@ -12,7 +12,8 @@ from msrest.serialization import Model from ._generated import KeyVaultClient -from . import AsyncChallengeAuthPolicy, USER_AGENT +from . import AsyncChallengeAuthPolicy +from .._user_agent import USER_AGENT if TYPE_CHECKING: diff --git a/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/_shared/client_base.py b/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/_shared/client_base.py index 6beb355de100..8b358c513233 100644 --- a/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/_shared/client_base.py +++ b/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/_shared/client_base.py @@ -18,7 +18,7 @@ from azure.core.pipeline.transport import HttpTransport from .challenge_auth_policy import ChallengeAuthPolicy -from . import USER_AGENT +from .._user_agent import USER_AGENT KEY_VAULT_SCOPE = "https://vault.azure.net/.default" diff --git a/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/_user_agent.py b/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/_user_agent.py new file mode 100644 index 000000000000..ad189cea275f --- /dev/null +++ b/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/_user_agent.py @@ -0,0 +1,10 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +import platform +from ._version import VERSION + +USER_AGENT = "azsdk-python-keyvault-keys/{} Python/{} ({})".format( + VERSION, platform.python_version(), platform.platform() +) diff --git a/sdk/keyvault/azure-keyvault-secrets/azure/keyvault/secrets/_user_agent.py b/sdk/keyvault/azure-keyvault-secrets/azure/keyvault/secrets/_user_agent.py new file mode 100644 index 000000000000..507849d98ba9 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-secrets/azure/keyvault/secrets/_user_agent.py @@ -0,0 +1,10 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +import platform +from ._version import VERSION + +USER_AGENT = "azsdk-python-keyvault-secrets/{} Python/{} ({})".format( + VERSION, platform.python_version(), platform.platform() +) From 0dd5e368884355106c10e5e0db9d9311e1133e50 Mon Sep 17 00:00:00 2001 From: Charles Lowell Date: Fri, 2 Aug 2019 16:22:13 -0700 Subject: [PATCH 3/4] update shared code in azure-keyvault-secrets --- .../secrets/_shared/async_client_base.py | 34 +++++++++++++----- .../keyvault/secrets/_shared/client_base.py | 35 ++++++++++++++----- 2 files changed, 52 insertions(+), 17 deletions(-) diff --git a/sdk/keyvault/azure-keyvault-secrets/azure/keyvault/secrets/_shared/async_client_base.py b/sdk/keyvault/azure-keyvault-secrets/azure/keyvault/secrets/_shared/async_client_base.py index 193e6e324c7e..84b2d367a30b 100644 --- a/sdk/keyvault/azure-keyvault-secrets/azure/keyvault/secrets/_shared/async_client_base.py +++ b/sdk/keyvault/azure-keyvault-secrets/azure/keyvault/secrets/_shared/async_client_base.py @@ -3,14 +3,17 @@ # Licensed under the MIT License. # ------------------------------------ from typing import Any, Callable, Mapping, AsyncIterator, TYPE_CHECKING + from azure.core.configuration import Configuration from azure.core.pipeline import AsyncPipeline +from azure.core.pipeline.policies import UserAgentPolicy from azure.core.pipeline.policies.distributed_tracing import DistributedTracingPolicy from azure.core.pipeline.transport import AsyncHttpTransport from msrest.serialization import Model from ._generated import KeyVaultClient from . import AsyncChallengeAuthPolicy +from .._user_agent import USER_AGENT if TYPE_CHECKING: @@ -22,14 +25,7 @@ class AsyncKeyVaultClientBase: - """ - :param credential: A credential or credential provider which can be used to authenticate to the vault, - a ValueError will be raised if the entity is not provided - :type credential: azure.authentication.Credential or azure.authentication.CredentialProvider - :param str vault_url: The url of the vault to which the client will connect, - a ValueError will be raised if the entity is not provided - :param ~azure.core.configuration.Configuration config: The configuration for the SecretClient - """ + """Base class for async Key Vault clients""" @staticmethod def _create_config( @@ -39,6 +35,27 @@ def _create_config( api_version = KeyVaultClient.DEFAULT_API_VERSION config = KeyVaultClient.get_configuration_class(api_version, aio=True)(credential, **kwargs) config.authentication_policy = AsyncChallengeAuthPolicy(credential) + + # replace the autorest-generated UserAgentPolicy and its hard-coded user agent + # https://github.com/Azure/azure-sdk-for-python/issues/6637 + config.user_agent_policy = UserAgentPolicy(base_user_agent=USER_AGENT, **kwargs) + + # Override config policies if found in kwargs + if "user_agent_policy" in kwargs: + config.user_agent_policy = kwargs["user_agent_policy"] + if "headers_policy" in kwargs: + config.headers_policy = kwargs["headers_policy"] + if "proxy_policy" in kwargs: + config.proxy_policy = kwargs["proxy_policy"] + if "logging_policy" in kwargs: + config.logging_policy = kwargs["logging_policy"] + if "retry_policy" in kwargs: + config.retry_policy = kwargs["retry_policy"] + if "custom_hook_policy" in kwargs: + config.custom_hook_policy = kwargs["custom_hook_policy"] + if "redirect_policy" in kwargs: + config.redirect_policy = kwargs["redirect_policy"] + return config def __init__( @@ -86,6 +103,7 @@ def _build_pipeline(config: Configuration, transport: AsyncHttpTransport, **kwar if transport is None: from azure.core.pipeline.transport import AioHttpTransport + transport = AioHttpTransport(**kwargs) return AsyncPipeline(transport, policies=policies) diff --git a/sdk/keyvault/azure-keyvault-secrets/azure/keyvault/secrets/_shared/client_base.py b/sdk/keyvault/azure-keyvault-secrets/azure/keyvault/secrets/_shared/client_base.py index dbde6d74f640..8b358c513233 100644 --- a/sdk/keyvault/azure-keyvault-secrets/azure/keyvault/secrets/_shared/client_base.py +++ b/sdk/keyvault/azure-keyvault-secrets/azure/keyvault/secrets/_shared/client_base.py @@ -3,9 +3,12 @@ # Licensed under the MIT License. # ------------------------------------ from typing import TYPE_CHECKING + from azure.core import Configuration from azure.core.pipeline import Pipeline +from azure.core.pipeline.policies import UserAgentPolicy from azure.core.pipeline.transport import RequestsTransport +from azure.core.pipeline.policies.distributed_tracing import DistributedTracingPolicy from ._generated import KeyVaultClient if TYPE_CHECKING: @@ -15,21 +18,14 @@ from azure.core.pipeline.transport import HttpTransport from .challenge_auth_policy import ChallengeAuthPolicy -from azure.core.pipeline.policies.distributed_tracing import DistributedTracingPolicy +from .._user_agent import USER_AGENT KEY_VAULT_SCOPE = "https://vault.azure.net/.default" class KeyVaultClientBase(object): - """ - :param credential: A credential or credential provider which can be used to authenticate to the vault, - a ValueError will be raised if the entity is not provided - :type credential: azure.core.credentials.TokenCredential - :param str vault_url: The url of the vault to which the client will connect, - a ValueError will be raised if the entity is not provided - :param ~azure.core.configuration.Configuration config: The configuration for the KeyClient - """ + """Base class for Key Vault clients""" @staticmethod def _create_config(credential, api_version=None, **kwargs): @@ -38,6 +34,27 @@ def _create_config(credential, api_version=None, **kwargs): api_version = KeyVaultClient.DEFAULT_API_VERSION config = KeyVaultClient.get_configuration_class(api_version, aio=False)(credential, **kwargs) config.authentication_policy = ChallengeAuthPolicy(credential) + + # replace the autorest-generated UserAgentPolicy and its hard-coded user agent + # https://github.com/Azure/azure-sdk-for-python/issues/6637 + config.user_agent_policy = UserAgentPolicy(base_user_agent=USER_AGENT, **kwargs) + + # Override config policies if found in kwargs + if "user_agent_policy" in kwargs: + config.user_agent_policy = kwargs["user_agent_policy"] + if "headers_policy" in kwargs: + config.headers_policy = kwargs["headers_policy"] + if "proxy_policy" in kwargs: + config.proxy_policy = kwargs["proxy_policy"] + if "logging_policy" in kwargs: + config.logging_policy = kwargs["logging_policy"] + if "retry_policy" in kwargs: + config.retry_policy = kwargs["retry_policy"] + if "custom_hook_policy" in kwargs: + config.custom_hook_policy = kwargs["custom_hook_policy"] + if "redirect_policy" in kwargs: + config.redirect_policy = kwargs["redirect_policy"] + return config def __init__(self, vault_url, credential, transport=None, api_version=None, **kwargs): From 1d95bc696411b143c90261d36e94d9f48624d7d9 Mon Sep 17 00:00:00 2001 From: Charles Lowell Date: Fri, 2 Aug 2019 16:40:41 -0700 Subject: [PATCH 4/4] TODO --- .../azure/keyvault/keys/_shared/async_client_base.py | 1 + .../azure/keyvault/keys/_shared/client_base.py | 1 + 2 files changed, 2 insertions(+) diff --git a/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/_shared/async_client_base.py b/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/_shared/async_client_base.py index 84b2d367a30b..974e96d32b3c 100644 --- a/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/_shared/async_client_base.py +++ b/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/_shared/async_client_base.py @@ -41,6 +41,7 @@ def _create_config( config.user_agent_policy = UserAgentPolicy(base_user_agent=USER_AGENT, **kwargs) # Override config policies if found in kwargs + # TODO: should be unnecessary after next regeneration (written 2019-08-02) if "user_agent_policy" in kwargs: config.user_agent_policy = kwargs["user_agent_policy"] if "headers_policy" in kwargs: diff --git a/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/_shared/client_base.py b/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/_shared/client_base.py index 8b358c513233..0cbb2c68f1b8 100644 --- a/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/_shared/client_base.py +++ b/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/_shared/client_base.py @@ -40,6 +40,7 @@ def _create_config(credential, api_version=None, **kwargs): config.user_agent_policy = UserAgentPolicy(base_user_agent=USER_AGENT, **kwargs) # Override config policies if found in kwargs + # TODO: should be unnecessary after next regeneration (written 2019-08-02) if "user_agent_policy" in kwargs: config.user_agent_policy = kwargs["user_agent_policy"] if "headers_policy" in kwargs: