From c2ca12e8013817527f7cee487c1e9a81f0cf7843 Mon Sep 17 00:00:00 2001 From: Xiang Yan Date: Mon, 15 Mar 2021 09:36:38 -0700 Subject: [PATCH 1/8] add custom policy --- sdk/core/azure-core/CHANGELOG.md | 6 ++- .../azure-core/azure/core/_pipeline_client.py | 41 +++++++++++++++---- .../azure/core/_pipeline_client_async.py | 41 ++++++++++++++++--- sdk/core/azure-core/azure/core/_version.py | 2 +- .../tests/async_tests/test_pipeline_async.py | 40 +++++++++++++++++- sdk/core/azure-core/tests/test_pipeline.py | 41 ++++++++++++++++++- 6 files changed, 153 insertions(+), 18 deletions(-) diff --git a/sdk/core/azure-core/CHANGELOG.md b/sdk/core/azure-core/CHANGELOG.md index c4c2b5a18f44..7adaffb06ba5 100644 --- a/sdk/core/azure-core/CHANGELOG.md +++ b/sdk/core/azure-core/CHANGELOG.md @@ -1,6 +1,10 @@ # Release History -## 1.12.1 (Unreleased) +## 1.13.0 (Unreleased) + +### Features + +- Supported adding custom policies #16519 ## 1.12.0 (2021-03-08) diff --git a/sdk/core/azure-core/azure/core/_pipeline_client.py b/sdk/core/azure-core/azure/core/_pipeline_client.py index a75271d14b2a..290e332fc3ef 100644 --- a/sdk/core/azure-core/azure/core/_pipeline_client.py +++ b/sdk/core/azure-core/azure/core/_pipeline_client.py @@ -29,7 +29,12 @@ from .pipeline import Pipeline from .pipeline.transport._base import PipelineClientBase from .pipeline.policies import ( - ContentDecodePolicy, DistributedTracingPolicy, HttpLoggingPolicy, RequestIdPolicy + ContentDecodePolicy, + DistributedTracingPolicy, + HttpLoggingPolicy, + RequestIdPolicy, + HTTPPolicy, + SansIOHTTPPolicy ) from .pipeline.transport import RequestsTransport @@ -64,6 +69,10 @@ class PipelineClient(PipelineClientBase): :keyword ~azure.core.configuration.Configuration config: If omitted, the standard configuration is used. :keyword Pipeline pipeline: If omitted, a Pipeline object is created and returned. :keyword list[HTTPPolicy] policies: If omitted, the standard policies of the configuration object is used. + :keyword non_retriable_policies: If specified, the policies will be added into the policy list before RetryPolicy + :paramtype non_retriable_policies: Union[HTTPPolicy, SansIOHTTPPolicy, list[HTTPPolicy], list[SansIOHTTPPolicy]] + :keyword retriable_policies: If specified, the policies will be added into the policy list after RetryPolicy + :paramtype retriable_policies: Union[HTTPPolicy, SansIOHTTPPolicy, list[HTTPPolicy], list[SansIOHTTPPolicy]] :keyword HttpTransport transport: If omitted, RequestsTransport is used for synchronous transport. :return: A pipeline object. :rtype: ~azure.core.pipeline.Pipeline @@ -102,20 +111,34 @@ def _build_pipeline(self, config, **kwargs): # pylint: disable=no-self-use policies = kwargs.get('policies') if policies is None: # [] is a valid policy list + non_retriable_policies = kwargs.get('non_retriable_policies') + retriable_policies = kwargs.get('retriable_policies') policies = [ RequestIdPolicy(**kwargs), config.headers_policy, config.user_agent_policy, config.proxy_policy, - ContentDecodePolicy(**kwargs), - config.redirect_policy, - config.retry_policy, - config.authentication_policy, - config.custom_hook_policy, - config.logging_policy, - DistributedTracingPolicy(**kwargs), - config.http_logging_policy or HttpLoggingPolicy(**kwargs) + ContentDecodePolicy(**kwargs) ] + if non_retriable_policies: + if isinstance(non_retriable_policies, HTTPPolicy) or isinstance(non_retriable_policies, SansIOHTTPPolicy): + policies.append(non_retriable_policies) + else: + for policy in non_retriable_policies: + policies.append(policy) + policies = policies + [config.redirect_policy, + config.retry_policy, + config.authentication_policy, + config.custom_hook_policy] + if retriable_policies: + if isinstance(retriable_policies, HTTPPolicy) or isinstance(retriable_policies, SansIOHTTPPolicy): + policies.append(retriable_policies) + else: + for policy in retriable_policies: + policies.append(policy) + policies = policies + [config.logging_policy, + DistributedTracingPolicy(**kwargs), + config.http_logging_policy or HttpLoggingPolicy(**kwargs)] if not transport: transport = RequestsTransport(**kwargs) diff --git a/sdk/core/azure-core/azure/core/_pipeline_client_async.py b/sdk/core/azure-core/azure/core/_pipeline_client_async.py index 3c6917a5e401..32628159a26c 100644 --- a/sdk/core/azure-core/azure/core/_pipeline_client_async.py +++ b/sdk/core/azure-core/azure/core/_pipeline_client_async.py @@ -29,7 +29,12 @@ from .pipeline import AsyncPipeline from .pipeline.transport._base import PipelineClientBase from .pipeline.policies import ( - ContentDecodePolicy, DistributedTracingPolicy, HttpLoggingPolicy, RequestIdPolicy + ContentDecodePolicy, + DistributedTracingPolicy, + HttpLoggingPolicy, + RequestIdPolicy, + AsyncHTTPPolicy, + SansIOHTTPPolicy ) try: @@ -62,8 +67,14 @@ class AsyncPipelineClient(PipelineClientBase): :param str base_url: URL for the request. :keyword ~azure.core.configuration.Configuration config: If omitted, the standard configuration is used. :keyword Pipeline pipeline: If omitted, a Pipeline object is created and returned. - :keyword list[HTTPPolicy] policies: If omitted, the standard policies of the configuration object is used. - :keyword HttpTransport transport: If omitted, RequestsTransport is used for synchronous transport. + :keyword list[AsyncHTTPPolicy] policies: If omitted, the standard policies of the configuration object is used. + :keyword non_retriable_policies: If specified, the policies will be added into the policy list before RetryPolicy + :paramtype non_retriable_policies: Union[AsyncHTTPPolicy, SansIOHTTPPolicy, + list[AsyncHTTPPolicy], list[SansIOHTTPPolicy]] + :keyword retriable_policies: If specified, the policies will be added into the policy list after RetryPolicy + :paramtype retriable_policies: Union[AsyncHTTPPolicy, SansIOHTTPPolicy, + list[AsyncHTTPPolicy], list[SansIOHTTPPolicy]] + :keyword AsyncHttpTransport transport: If omitted, AioHttpTransport is used for synchronous transport. :return: An async pipeline object. :rtype: ~azure.core.pipeline.AsyncPipeline @@ -101,16 +112,36 @@ def _build_pipeline(self, config, **kwargs): # pylint: disable=no-self-use policies = kwargs.get('policies') if policies is None: # [] is a valid policy list + non_retriable_policies = kwargs.get('non_retriable_policies') + retriable_policies = kwargs.get('retriable_policies') policies = [ RequestIdPolicy(**kwargs), config.headers_policy, config.user_agent_policy, config.proxy_policy, - ContentDecodePolicy(**kwargs), + ContentDecodePolicy(**kwargs) + ] + if non_retriable_policies: + if isinstance(non_retriable_policies, AsyncHTTPPolicy) \ + or isinstance(non_retriable_policies, SansIOHTTPPolicy): + policies.append(non_retriable_policies) + else: + for policy in non_retriable_policies: + policies.append(policy) + policies = policies + [ config.redirect_policy, config.retry_policy, config.authentication_policy, - config.custom_hook_policy, + config.custom_hook_policy + ] + if retriable_policies: + if isinstance(retriable_policies, AsyncHTTPPolicy) \ + or isinstance(retriable_policies, SansIOHTTPPolicy): + policies.append(retriable_policies) + else: + for policy in retriable_policies: + policies.append(policy) + policies = policies + [ config.logging_policy, DistributedTracingPolicy(**kwargs), config.http_logging_policy or HttpLoggingPolicy(**kwargs) diff --git a/sdk/core/azure-core/azure/core/_version.py b/sdk/core/azure-core/azure/core/_version.py index e89e943b0813..7a5c38e4c326 100644 --- a/sdk/core/azure-core/azure/core/_version.py +++ b/sdk/core/azure-core/azure/core/_version.py @@ -9,4 +9,4 @@ # regenerated. # -------------------------------------------------------------------------- -VERSION = "1.12.1" +VERSION = "1.13.0" diff --git a/sdk/core/azure-core/tests/async_tests/test_pipeline_async.py b/sdk/core/azure-core/tests/async_tests/test_pipeline_async.py index 66ec79abe307..4e63f444af59 100644 --- a/sdk/core/azure-core/tests/async_tests/test_pipeline_async.py +++ b/sdk/core/azure-core/tests/async_tests/test_pipeline_async.py @@ -219,4 +219,42 @@ def send(*args): policies = [AsyncRetryPolicy(), NaughtyPolicy()] pipeline = AsyncPipeline(policies=policies, transport=None) with pytest.raises(AzureError): - await pipeline.run(HttpRequest('GET', url='https://foo.bar')) \ No newline at end of file + await pipeline.run(HttpRequest('GET', url='https://foo.bar')) + +@pytest.mark.asyncio +async def test_add_custom_policy(): + class BooPolicy(AsyncHTTPPolicy): + def send(*args): + raise AzureError('boo') + + class FooPolicy(AsyncHTTPPolicy): + def send(*args): + raise AzureError('boo') + + boo_policy = BooPolicy() + foo_policy = FooPolicy() + client = AsyncPipelineClient(base_url="test", non_retriable_policies=boo_policy) + policies = client._pipeline._impl_policies + assert boo_policy in policies + + client = AsyncPipelineClient(base_url="test", non_retriable_policies=[boo_policy]) + policies = client._pipeline._impl_policies + assert boo_policy in policies + + client = AsyncPipelineClient(base_url="test", retriable_policies=boo_policy) + policies = client._pipeline._impl_policies + assert boo_policy in policies + client = AsyncPipelineClient(base_url="test", retriable_policies=[boo_policy]) + policies = client._pipeline._impl_policies + assert boo_policy in policies + + client = AsyncPipelineClient(base_url="test", non_retriable_policies=boo_policy, retriable_policies=foo_policy) + policies = client._pipeline._impl_policies + assert boo_policy in policies + assert foo_policy in policies + + client = AsyncPipelineClient(base_url="test", non_retriable_policies=[boo_policy], + retriable_policies=[foo_policy]) + policies = client._pipeline._impl_policies + assert boo_policy in policies + assert foo_policy in policies diff --git a/sdk/core/azure-core/tests/test_pipeline.py b/sdk/core/azure-core/tests/test_pipeline.py index 43cf9def610b..2505f6781f56 100644 --- a/sdk/core/azure-core/tests/test_pipeline.py +++ b/sdk/core/azure-core/tests/test_pipeline.py @@ -51,7 +51,9 @@ SansIOHTTPPolicy, UserAgentPolicy, RedirectPolicy, - HttpLoggingPolicy + HttpLoggingPolicy, + HTTPPolicy, + SansIOHTTPPolicy ) from azure.core.pipeline.transport._base import PipelineClientBase from azure.core.pipeline.transport import ( @@ -332,6 +334,43 @@ def test_repr(self): request = HttpRequest("GET", "hello.com") assert repr(request) == "" + def test_add_custom_policy(self): + class BooPolicy(HTTPPolicy): + def send(*args): + raise AzureError('boo') + + class FooPolicy(HTTPPolicy): + def send(*args): + raise AzureError('boo') + + boo_policy = BooPolicy() + foo_policy = FooPolicy() + client = PipelineClient(base_url="test", non_retriable_policies=boo_policy) + policies = client._pipeline._impl_policies + assert boo_policy in policies + + client = PipelineClient(base_url="test", non_retriable_policies=[boo_policy]) + policies = client._pipeline._impl_policies + assert boo_policy in policies + + client = PipelineClient(base_url="test", retriable_policies=boo_policy) + policies = client._pipeline._impl_policies + assert boo_policy in policies + client = PipelineClient(base_url="test", retriable_policies=[boo_policy]) + policies = client._pipeline._impl_policies + assert boo_policy in policies + + client = PipelineClient(base_url="test", non_retriable_policies=boo_policy, retriable_policies=foo_policy) + policies = client._pipeline._impl_policies + assert boo_policy in policies + assert foo_policy in policies + + client = PipelineClient(base_url="test", non_retriable_policies=[boo_policy], + retriable_policies=[foo_policy]) + policies = client._pipeline._impl_policies + assert boo_policy in policies + assert foo_policy in policies + if __name__ == "__main__": unittest.main() From 4753c3021d91dea1b41455c3500ca4c982c5b8f0 Mon Sep 17 00:00:00 2001 From: Xiang Yan Date: Mon, 15 Mar 2021 11:17:05 -0700 Subject: [PATCH 2/8] updates --- sdk/core/azure-core/azure/core/_pipeline_client.py | 4 ++-- sdk/core/azure-core/azure/core/_pipeline_client_async.py | 6 ++---- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/sdk/core/azure-core/azure/core/_pipeline_client.py b/sdk/core/azure-core/azure/core/_pipeline_client.py index 290e332fc3ef..f62be4e9d50c 100644 --- a/sdk/core/azure-core/azure/core/_pipeline_client.py +++ b/sdk/core/azure-core/azure/core/_pipeline_client.py @@ -121,7 +121,7 @@ def _build_pipeline(self, config, **kwargs): # pylint: disable=no-self-use ContentDecodePolicy(**kwargs) ] if non_retriable_policies: - if isinstance(non_retriable_policies, HTTPPolicy) or isinstance(non_retriable_policies, SansIOHTTPPolicy): + if isinstance(non_retriable_policies, (HTTPPolicy, SansIOHTTPPolicy)): policies.append(non_retriable_policies) else: for policy in non_retriable_policies: @@ -131,7 +131,7 @@ def _build_pipeline(self, config, **kwargs): # pylint: disable=no-self-use config.authentication_policy, config.custom_hook_policy] if retriable_policies: - if isinstance(retriable_policies, HTTPPolicy) or isinstance(retriable_policies, SansIOHTTPPolicy): + if isinstance(retriable_policies, (HTTPPolicy, SansIOHTTPPolicy)): policies.append(retriable_policies) else: for policy in retriable_policies: diff --git a/sdk/core/azure-core/azure/core/_pipeline_client_async.py b/sdk/core/azure-core/azure/core/_pipeline_client_async.py index 32628159a26c..d5ba05d220b9 100644 --- a/sdk/core/azure-core/azure/core/_pipeline_client_async.py +++ b/sdk/core/azure-core/azure/core/_pipeline_client_async.py @@ -122,8 +122,7 @@ def _build_pipeline(self, config, **kwargs): # pylint: disable=no-self-use ContentDecodePolicy(**kwargs) ] if non_retriable_policies: - if isinstance(non_retriable_policies, AsyncHTTPPolicy) \ - or isinstance(non_retriable_policies, SansIOHTTPPolicy): + if isinstance(non_retriable_policies, (AsyncHTTPPolicy, SansIOHTTPPolicy)): policies.append(non_retriable_policies) else: for policy in non_retriable_policies: @@ -135,8 +134,7 @@ def _build_pipeline(self, config, **kwargs): # pylint: disable=no-self-use config.custom_hook_policy ] if retriable_policies: - if isinstance(retriable_policies, AsyncHTTPPolicy) \ - or isinstance(retriable_policies, SansIOHTTPPolicy): + if isinstance(retriable_policies, (AsyncHTTPPolicy, SansIOHTTPPolicy)): policies.append(retriable_policies) else: for policy in retriable_policies: From ee4677e416213d12bca816a70412508896f172b1 Mon Sep 17 00:00:00 2001 From: Xiang Yan Date: Mon, 15 Mar 2021 17:27:30 -0700 Subject: [PATCH 3/8] rename arguments --- .../azure-core/azure/core/_pipeline_client.py | 28 +++++++++---------- .../azure/core/_pipeline_client_async.py | 28 +++++++++---------- .../tests/async_tests/test_pipeline_async.py | 14 +++++----- sdk/core/azure-core/tests/test_pipeline.py | 14 +++++----- 4 files changed, 42 insertions(+), 42 deletions(-) diff --git a/sdk/core/azure-core/azure/core/_pipeline_client.py b/sdk/core/azure-core/azure/core/_pipeline_client.py index f62be4e9d50c..17530cb337bc 100644 --- a/sdk/core/azure-core/azure/core/_pipeline_client.py +++ b/sdk/core/azure-core/azure/core/_pipeline_client.py @@ -69,10 +69,10 @@ class PipelineClient(PipelineClientBase): :keyword ~azure.core.configuration.Configuration config: If omitted, the standard configuration is used. :keyword Pipeline pipeline: If omitted, a Pipeline object is created and returned. :keyword list[HTTPPolicy] policies: If omitted, the standard policies of the configuration object is used. - :keyword non_retriable_policies: If specified, the policies will be added into the policy list before RetryPolicy - :paramtype non_retriable_policies: Union[HTTPPolicy, SansIOHTTPPolicy, list[HTTPPolicy], list[SansIOHTTPPolicy]] - :keyword retriable_policies: If specified, the policies will be added into the policy list after RetryPolicy - :paramtype retriable_policies: Union[HTTPPolicy, SansIOHTTPPolicy, list[HTTPPolicy], list[SansIOHTTPPolicy]] + :keyword per_call_policies: If specified, the policies will be added into the policy list before RetryPolicy + :paramtype per_call_policies: Union[HTTPPolicy, SansIOHTTPPolicy, list[HTTPPolicy], list[SansIOHTTPPolicy]] + :keyword per_retry_policies: If specified, the policies will be added into the policy list after RetryPolicy + :paramtype per_retry_policies: Union[HTTPPolicy, SansIOHTTPPolicy, list[HTTPPolicy], list[SansIOHTTPPolicy]] :keyword HttpTransport transport: If omitted, RequestsTransport is used for synchronous transport. :return: A pipeline object. :rtype: ~azure.core.pipeline.Pipeline @@ -111,8 +111,8 @@ def _build_pipeline(self, config, **kwargs): # pylint: disable=no-self-use policies = kwargs.get('policies') if policies is None: # [] is a valid policy list - non_retriable_policies = kwargs.get('non_retriable_policies') - retriable_policies = kwargs.get('retriable_policies') + per_call_policies = kwargs.get('per_call_policies') + per_retry_policies = kwargs.get('per_retry_policies') policies = [ RequestIdPolicy(**kwargs), config.headers_policy, @@ -120,21 +120,21 @@ def _build_pipeline(self, config, **kwargs): # pylint: disable=no-self-use config.proxy_policy, ContentDecodePolicy(**kwargs) ] - if non_retriable_policies: - if isinstance(non_retriable_policies, (HTTPPolicy, SansIOHTTPPolicy)): - policies.append(non_retriable_policies) + if per_call_policies: + if isinstance(per_call_policies, (HTTPPolicy, SansIOHTTPPolicy)): + policies.append(per_call_policies) else: - for policy in non_retriable_policies: + for policy in per_call_policies: policies.append(policy) policies = policies + [config.redirect_policy, config.retry_policy, config.authentication_policy, config.custom_hook_policy] - if retriable_policies: - if isinstance(retriable_policies, (HTTPPolicy, SansIOHTTPPolicy)): - policies.append(retriable_policies) + if per_retry_policies: + if isinstance(per_retry_policies, (HTTPPolicy, SansIOHTTPPolicy)): + policies.append(per_retry_policies) else: - for policy in retriable_policies: + for policy in per_retry_policies: policies.append(policy) policies = policies + [config.logging_policy, DistributedTracingPolicy(**kwargs), diff --git a/sdk/core/azure-core/azure/core/_pipeline_client_async.py b/sdk/core/azure-core/azure/core/_pipeline_client_async.py index d5ba05d220b9..5016e92aaf52 100644 --- a/sdk/core/azure-core/azure/core/_pipeline_client_async.py +++ b/sdk/core/azure-core/azure/core/_pipeline_client_async.py @@ -68,11 +68,11 @@ class AsyncPipelineClient(PipelineClientBase): :keyword ~azure.core.configuration.Configuration config: If omitted, the standard configuration is used. :keyword Pipeline pipeline: If omitted, a Pipeline object is created and returned. :keyword list[AsyncHTTPPolicy] policies: If omitted, the standard policies of the configuration object is used. - :keyword non_retriable_policies: If specified, the policies will be added into the policy list before RetryPolicy - :paramtype non_retriable_policies: Union[AsyncHTTPPolicy, SansIOHTTPPolicy, + :keyword per_call_policies: If specified, the policies will be added into the policy list before RetryPolicy + :paramtype per_call_policies: Union[AsyncHTTPPolicy, SansIOHTTPPolicy, list[AsyncHTTPPolicy], list[SansIOHTTPPolicy]] - :keyword retriable_policies: If specified, the policies will be added into the policy list after RetryPolicy - :paramtype retriable_policies: Union[AsyncHTTPPolicy, SansIOHTTPPolicy, + :keyword per_retry_policies: If specified, the policies will be added into the policy list after RetryPolicy + :paramtype per_retry_policies: Union[AsyncHTTPPolicy, SansIOHTTPPolicy, list[AsyncHTTPPolicy], list[SansIOHTTPPolicy]] :keyword AsyncHttpTransport transport: If omitted, AioHttpTransport is used for synchronous transport. :return: An async pipeline object. @@ -112,8 +112,8 @@ def _build_pipeline(self, config, **kwargs): # pylint: disable=no-self-use policies = kwargs.get('policies') if policies is None: # [] is a valid policy list - non_retriable_policies = kwargs.get('non_retriable_policies') - retriable_policies = kwargs.get('retriable_policies') + per_call_policies = kwargs.get('per_call_policies') + per_retry_policies = kwargs.get('per_retry_policies') policies = [ RequestIdPolicy(**kwargs), config.headers_policy, @@ -121,11 +121,11 @@ def _build_pipeline(self, config, **kwargs): # pylint: disable=no-self-use config.proxy_policy, ContentDecodePolicy(**kwargs) ] - if non_retriable_policies: - if isinstance(non_retriable_policies, (AsyncHTTPPolicy, SansIOHTTPPolicy)): - policies.append(non_retriable_policies) + if per_call_policies: + if isinstance(per_call_policies, (AsyncHTTPPolicy, SansIOHTTPPolicy)): + policies.append(per_call_policies) else: - for policy in non_retriable_policies: + for policy in per_call_policies: policies.append(policy) policies = policies + [ config.redirect_policy, @@ -133,11 +133,11 @@ def _build_pipeline(self, config, **kwargs): # pylint: disable=no-self-use config.authentication_policy, config.custom_hook_policy ] - if retriable_policies: - if isinstance(retriable_policies, (AsyncHTTPPolicy, SansIOHTTPPolicy)): - policies.append(retriable_policies) + if per_retry_policies: + if isinstance(per_retry_policies, (AsyncHTTPPolicy, SansIOHTTPPolicy)): + policies.append(per_retry_policies) else: - for policy in retriable_policies: + for policy in per_retry_policies: policies.append(policy) policies = policies + [ config.logging_policy, diff --git a/sdk/core/azure-core/tests/async_tests/test_pipeline_async.py b/sdk/core/azure-core/tests/async_tests/test_pipeline_async.py index 4e63f444af59..ada3f7b1274f 100644 --- a/sdk/core/azure-core/tests/async_tests/test_pipeline_async.py +++ b/sdk/core/azure-core/tests/async_tests/test_pipeline_async.py @@ -233,28 +233,28 @@ def send(*args): boo_policy = BooPolicy() foo_policy = FooPolicy() - client = AsyncPipelineClient(base_url="test", non_retriable_policies=boo_policy) + client = AsyncPipelineClient(base_url="test", per_call_policies=boo_policy) policies = client._pipeline._impl_policies assert boo_policy in policies - client = AsyncPipelineClient(base_url="test", non_retriable_policies=[boo_policy]) + client = AsyncPipelineClient(base_url="test", per_call_policies=[boo_policy]) policies = client._pipeline._impl_policies assert boo_policy in policies - client = AsyncPipelineClient(base_url="test", retriable_policies=boo_policy) + client = AsyncPipelineClient(base_url="test", per_retry_policies=boo_policy) policies = client._pipeline._impl_policies assert boo_policy in policies - client = AsyncPipelineClient(base_url="test", retriable_policies=[boo_policy]) + client = AsyncPipelineClient(base_url="test", per_retry_policies=[boo_policy]) policies = client._pipeline._impl_policies assert boo_policy in policies - client = AsyncPipelineClient(base_url="test", non_retriable_policies=boo_policy, retriable_policies=foo_policy) + client = AsyncPipelineClient(base_url="test", per_call_policies=boo_policy, per_retry_policies=foo_policy) policies = client._pipeline._impl_policies assert boo_policy in policies assert foo_policy in policies - client = AsyncPipelineClient(base_url="test", non_retriable_policies=[boo_policy], - retriable_policies=[foo_policy]) + client = AsyncPipelineClient(base_url="test", per_call_policies=[boo_policy], + per_retry_policies=[foo_policy]) policies = client._pipeline._impl_policies assert boo_policy in policies assert foo_policy in policies diff --git a/sdk/core/azure-core/tests/test_pipeline.py b/sdk/core/azure-core/tests/test_pipeline.py index 2505f6781f56..97db1ecfd8a0 100644 --- a/sdk/core/azure-core/tests/test_pipeline.py +++ b/sdk/core/azure-core/tests/test_pipeline.py @@ -345,28 +345,28 @@ def send(*args): boo_policy = BooPolicy() foo_policy = FooPolicy() - client = PipelineClient(base_url="test", non_retriable_policies=boo_policy) + client = PipelineClient(base_url="test", per_call_policies=boo_policy) policies = client._pipeline._impl_policies assert boo_policy in policies - client = PipelineClient(base_url="test", non_retriable_policies=[boo_policy]) + client = PipelineClient(base_url="test", per_call_policies=[boo_policy]) policies = client._pipeline._impl_policies assert boo_policy in policies - client = PipelineClient(base_url="test", retriable_policies=boo_policy) + client = PipelineClient(base_url="test", per_retry_policies=boo_policy) policies = client._pipeline._impl_policies assert boo_policy in policies - client = PipelineClient(base_url="test", retriable_policies=[boo_policy]) + client = PipelineClient(base_url="test", per_retry_policies=[boo_policy]) policies = client._pipeline._impl_policies assert boo_policy in policies - client = PipelineClient(base_url="test", non_retriable_policies=boo_policy, retriable_policies=foo_policy) + client = PipelineClient(base_url="test", per_call_policies=boo_policy, per_retry_policies=foo_policy) policies = client._pipeline._impl_policies assert boo_policy in policies assert foo_policy in policies - client = PipelineClient(base_url="test", non_retriable_policies=[boo_policy], - retriable_policies=[foo_policy]) + client = PipelineClient(base_url="test", per_call_policies=[boo_policy], + per_retry_policies=[foo_policy]) policies = client._pipeline._impl_policies assert boo_policy in policies assert foo_policy in policies From bcf286fe8ebff7dc7e94d69f207cdb42fb9b9c2f Mon Sep 17 00:00:00 2001 From: Xiang Yan Date: Thu, 18 Mar 2021 16:07:16 -0700 Subject: [PATCH 4/8] udpates --- .../azure-core/azure/core/_pipeline_client.py | 26 +++++++++---------- .../azure/core/_pipeline_client_async.py | 26 +++++++++---------- 2 files changed, 24 insertions(+), 28 deletions(-) diff --git a/sdk/core/azure-core/azure/core/_pipeline_client.py b/sdk/core/azure-core/azure/core/_pipeline_client.py index 17530cb337bc..9fd58850bf8d 100644 --- a/sdk/core/azure-core/azure/core/_pipeline_client.py +++ b/sdk/core/azure-core/azure/core/_pipeline_client.py @@ -111,8 +111,8 @@ def _build_pipeline(self, config, **kwargs): # pylint: disable=no-self-use policies = kwargs.get('policies') if policies is None: # [] is a valid policy list - per_call_policies = kwargs.get('per_call_policies') - per_retry_policies = kwargs.get('per_retry_policies') + per_call_policies = kwargs.get('per_call_policies', []) + per_retry_policies = kwargs.get('per_retry_policies', []) policies = [ RequestIdPolicy(**kwargs), config.headers_policy, @@ -120,22 +120,20 @@ def _build_pipeline(self, config, **kwargs): # pylint: disable=no-self-use config.proxy_policy, ContentDecodePolicy(**kwargs) ] - if per_call_policies: - if isinstance(per_call_policies, (HTTPPolicy, SansIOHTTPPolicy)): - policies.append(per_call_policies) - else: - for policy in per_call_policies: - policies.append(policy) + if isinstance(per_call_policies, (HTTPPolicy, SansIOHTTPPolicy)): + policies.append(per_call_policies) + else: + for policy in per_call_policies: + policies.append(policy) policies = policies + [config.redirect_policy, config.retry_policy, config.authentication_policy, config.custom_hook_policy] - if per_retry_policies: - if isinstance(per_retry_policies, (HTTPPolicy, SansIOHTTPPolicy)): - policies.append(per_retry_policies) - else: - for policy in per_retry_policies: - policies.append(policy) + if isinstance(per_retry_policies, (HTTPPolicy, SansIOHTTPPolicy)): + policies.append(per_retry_policies) + else: + for policy in per_retry_policies: + policies.append(policy) policies = policies + [config.logging_policy, DistributedTracingPolicy(**kwargs), config.http_logging_policy or HttpLoggingPolicy(**kwargs)] diff --git a/sdk/core/azure-core/azure/core/_pipeline_client_async.py b/sdk/core/azure-core/azure/core/_pipeline_client_async.py index 5016e92aaf52..89d9fcbae805 100644 --- a/sdk/core/azure-core/azure/core/_pipeline_client_async.py +++ b/sdk/core/azure-core/azure/core/_pipeline_client_async.py @@ -112,8 +112,8 @@ def _build_pipeline(self, config, **kwargs): # pylint: disable=no-self-use policies = kwargs.get('policies') if policies is None: # [] is a valid policy list - per_call_policies = kwargs.get('per_call_policies') - per_retry_policies = kwargs.get('per_retry_policies') + per_call_policies = kwargs.get('per_call_policies', []) + per_retry_policies = kwargs.get('per_retry_policies', []) policies = [ RequestIdPolicy(**kwargs), config.headers_policy, @@ -121,24 +121,22 @@ def _build_pipeline(self, config, **kwargs): # pylint: disable=no-self-use config.proxy_policy, ContentDecodePolicy(**kwargs) ] - if per_call_policies: - if isinstance(per_call_policies, (AsyncHTTPPolicy, SansIOHTTPPolicy)): - policies.append(per_call_policies) - else: - for policy in per_call_policies: - policies.append(policy) + if isinstance(per_call_policies, (AsyncHTTPPolicy, SansIOHTTPPolicy)): + policies.append(per_call_policies) + else: + for policy in per_call_policies: + policies.append(policy) policies = policies + [ config.redirect_policy, config.retry_policy, config.authentication_policy, config.custom_hook_policy ] - if per_retry_policies: - if isinstance(per_retry_policies, (AsyncHTTPPolicy, SansIOHTTPPolicy)): - policies.append(per_retry_policies) - else: - for policy in per_retry_policies: - policies.append(policy) + if isinstance(per_retry_policies, (AsyncHTTPPolicy, SansIOHTTPPolicy)): + policies.append(per_retry_policies) + else: + for policy in per_retry_policies: + policies.append(policy) policies = policies + [ config.logging_policy, DistributedTracingPolicy(**kwargs), From 7fb21c01eb2bfb5390b1bbcd7f986eee5d224440 Mon Sep 17 00:00:00 2001 From: Xiang Yan Date: Mon, 22 Mar 2021 10:51:51 -0700 Subject: [PATCH 5/8] update --- .../azure-core/azure/core/_pipeline_client.py | 15 +++++++++------ .../azure/core/_pipeline_client_async.py | 15 +++++++++------ 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/sdk/core/azure-core/azure/core/_pipeline_client.py b/sdk/core/azure-core/azure/core/_pipeline_client.py index 9fd58850bf8d..7d34c999c41c 100644 --- a/sdk/core/azure-core/azure/core/_pipeline_client.py +++ b/sdk/core/azure-core/azure/core/_pipeline_client.py @@ -25,6 +25,7 @@ # -------------------------------------------------------------------------- import logging +from collections.abc import Iterable from .configuration import Configuration from .pipeline import Pipeline from .pipeline.transport._base import PipelineClientBase @@ -120,20 +121,22 @@ def _build_pipeline(self, config, **kwargs): # pylint: disable=no-self-use config.proxy_policy, ContentDecodePolicy(**kwargs) ] - if isinstance(per_call_policies, (HTTPPolicy, SansIOHTTPPolicy)): - policies.append(per_call_policies) - else: + if isinstance(per_call_policies, Iterable): for policy in per_call_policies: policies.append(policy) + else: + policies.append(per_call_policies) + policies = policies + [config.redirect_policy, config.retry_policy, config.authentication_policy, config.custom_hook_policy] - if isinstance(per_retry_policies, (HTTPPolicy, SansIOHTTPPolicy)): - policies.append(per_retry_policies) - else: + if isinstance(per_retry_policies, Iterable): for policy in per_retry_policies: policies.append(policy) + else: + policies.append(per_retry_policies) + policies = policies + [config.logging_policy, DistributedTracingPolicy(**kwargs), config.http_logging_policy or HttpLoggingPolicy(**kwargs)] diff --git a/sdk/core/azure-core/azure/core/_pipeline_client_async.py b/sdk/core/azure-core/azure/core/_pipeline_client_async.py index 89d9fcbae805..fcd125de3df6 100644 --- a/sdk/core/azure-core/azure/core/_pipeline_client_async.py +++ b/sdk/core/azure-core/azure/core/_pipeline_client_async.py @@ -25,6 +25,7 @@ # -------------------------------------------------------------------------- import logging +from collections.abc import Iterable from .configuration import Configuration from .pipeline import AsyncPipeline from .pipeline.transport._base import PipelineClientBase @@ -121,22 +122,24 @@ def _build_pipeline(self, config, **kwargs): # pylint: disable=no-self-use config.proxy_policy, ContentDecodePolicy(**kwargs) ] - if isinstance(per_call_policies, (AsyncHTTPPolicy, SansIOHTTPPolicy)): - policies.append(per_call_policies) - else: + if isinstance(per_call_policies, Iterable): for policy in per_call_policies: policies.append(policy) + else: + policies.append(per_call_policies) + policies = policies + [ config.redirect_policy, config.retry_policy, config.authentication_policy, config.custom_hook_policy ] - if isinstance(per_retry_policies, (AsyncHTTPPolicy, SansIOHTTPPolicy)): - policies.append(per_retry_policies) - else: + if isinstance(per_retry_policies, Iterable): for policy in per_retry_policies: policies.append(policy) + else: + policies.append(per_retry_policies) + policies = policies + [ config.logging_policy, DistributedTracingPolicy(**kwargs), From 2ca058562e432137416dc24dea5084e265e95861 Mon Sep 17 00:00:00 2001 From: Xiang Yan Date: Mon, 22 Mar 2021 11:11:59 -0700 Subject: [PATCH 6/8] update --- sdk/core/azure-core/azure/core/_pipeline_client.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sdk/core/azure-core/azure/core/_pipeline_client.py b/sdk/core/azure-core/azure/core/_pipeline_client.py index 7d34c999c41c..49f43cb33018 100644 --- a/sdk/core/azure-core/azure/core/_pipeline_client.py +++ b/sdk/core/azure-core/azure/core/_pipeline_client.py @@ -25,7 +25,10 @@ # -------------------------------------------------------------------------- import logging -from collections.abc import Iterable +try: + from collections.abc import Iterable +except ImportError: + from collections import Iterable from .configuration import Configuration from .pipeline import Pipeline from .pipeline.transport._base import PipelineClientBase From a30224a4490eb5ae3f539505432295041e7a1cd0 Mon Sep 17 00:00:00 2001 From: Xiang Yan Date: Mon, 22 Mar 2021 12:41:59 -0700 Subject: [PATCH 7/8] update --- sdk/core/azure-core/azure/core/_pipeline_client.py | 2 -- sdk/core/azure-core/azure/core/_pipeline_client_async.py | 2 -- 2 files changed, 4 deletions(-) diff --git a/sdk/core/azure-core/azure/core/_pipeline_client.py b/sdk/core/azure-core/azure/core/_pipeline_client.py index 49f43cb33018..8e6301347457 100644 --- a/sdk/core/azure-core/azure/core/_pipeline_client.py +++ b/sdk/core/azure-core/azure/core/_pipeline_client.py @@ -37,8 +37,6 @@ DistributedTracingPolicy, HttpLoggingPolicy, RequestIdPolicy, - HTTPPolicy, - SansIOHTTPPolicy ) from .pipeline.transport import RequestsTransport diff --git a/sdk/core/azure-core/azure/core/_pipeline_client_async.py b/sdk/core/azure-core/azure/core/_pipeline_client_async.py index fcd125de3df6..f91ae4229243 100644 --- a/sdk/core/azure-core/azure/core/_pipeline_client_async.py +++ b/sdk/core/azure-core/azure/core/_pipeline_client_async.py @@ -34,8 +34,6 @@ DistributedTracingPolicy, HttpLoggingPolicy, RequestIdPolicy, - AsyncHTTPPolicy, - SansIOHTTPPolicy ) try: From 1cba725e0bb7eebad371ff8048d445aff071a094 Mon Sep 17 00:00:00 2001 From: Xiang Yan Date: Wed, 24 Mar 2021 13:15:48 -0700 Subject: [PATCH 8/8] update tests --- .../tests/async_tests/test_pipeline_async.py | 44 +++++++++++++++---- sdk/core/azure-core/tests/test_pipeline.py | 39 +++++++++++++--- 2 files changed, 69 insertions(+), 14 deletions(-) diff --git a/sdk/core/azure-core/tests/async_tests/test_pipeline_async.py b/sdk/core/azure-core/tests/async_tests/test_pipeline_async.py index ada3f7b1274f..7fdc48057b92 100644 --- a/sdk/core/azure-core/tests/async_tests/test_pipeline_async.py +++ b/sdk/core/azure-core/tests/async_tests/test_pipeline_async.py @@ -29,6 +29,7 @@ from azure.core.pipeline.policies import ( SansIOHTTPPolicy, UserAgentPolicy, + AsyncRetryPolicy, AsyncRedirectPolicy, AsyncHTTPPolicy, AsyncRetryPolicy, @@ -231,30 +232,57 @@ class FooPolicy(AsyncHTTPPolicy): def send(*args): raise AzureError('boo') + config = Configuration() + retry_policy = AsyncRetryPolicy() + config.retry_policy = retry_policy boo_policy = BooPolicy() foo_policy = FooPolicy() - client = AsyncPipelineClient(base_url="test", per_call_policies=boo_policy) + client = AsyncPipelineClient(base_url="test", config=config, per_call_policies=boo_policy) policies = client._pipeline._impl_policies assert boo_policy in policies + pos_boo = policies.index(boo_policy) + pos_retry = policies.index(retry_policy) + assert pos_boo < pos_retry - client = AsyncPipelineClient(base_url="test", per_call_policies=[boo_policy]) + client = AsyncPipelineClient(base_url="test", config=config, per_call_policies=[boo_policy]) policies = client._pipeline._impl_policies assert boo_policy in policies + pos_boo = policies.index(boo_policy) + pos_retry = policies.index(retry_policy) + assert pos_boo < pos_retry - client = AsyncPipelineClient(base_url="test", per_retry_policies=boo_policy) + client = AsyncPipelineClient(base_url="test", config=config, per_retry_policies=boo_policy) policies = client._pipeline._impl_policies assert boo_policy in policies - client = AsyncPipelineClient(base_url="test", per_retry_policies=[boo_policy]) + pos_boo = policies.index(boo_policy) + pos_retry = policies.index(retry_policy) + assert pos_boo > pos_retry + + client = AsyncPipelineClient(base_url="test", config=config, per_retry_policies=[boo_policy]) policies = client._pipeline._impl_policies assert boo_policy in policies + pos_boo = policies.index(boo_policy) + pos_retry = policies.index(retry_policy) + assert pos_boo > pos_retry - client = AsyncPipelineClient(base_url="test", per_call_policies=boo_policy, per_retry_policies=foo_policy) + client = AsyncPipelineClient(base_url="test", config=config, per_call_policies=boo_policy, + per_retry_policies=foo_policy) policies = client._pipeline._impl_policies assert boo_policy in policies assert foo_policy in policies - - client = AsyncPipelineClient(base_url="test", per_call_policies=[boo_policy], - per_retry_policies=[foo_policy]) + pos_boo = policies.index(boo_policy) + pos_foo = policies.index(foo_policy) + pos_retry = policies.index(retry_policy) + assert pos_boo < pos_retry + assert pos_foo > pos_retry + + client = AsyncPipelineClient(base_url="test", config=config, per_call_policies=[boo_policy], + per_retry_policies=[foo_policy]) policies = client._pipeline._impl_policies assert boo_policy in policies assert foo_policy in policies + pos_boo = policies.index(boo_policy) + pos_foo = policies.index(foo_policy) + pos_retry = policies.index(retry_policy) + assert pos_boo < pos_retry + assert pos_foo > pos_retry diff --git a/sdk/core/azure-core/tests/test_pipeline.py b/sdk/core/azure-core/tests/test_pipeline.py index 97db1ecfd8a0..153775c8d992 100644 --- a/sdk/core/azure-core/tests/test_pipeline.py +++ b/sdk/core/azure-core/tests/test_pipeline.py @@ -51,6 +51,7 @@ SansIOHTTPPolicy, UserAgentPolicy, RedirectPolicy, + RetryPolicy, HttpLoggingPolicy, HTTPPolicy, SansIOHTTPPolicy @@ -343,33 +344,59 @@ class FooPolicy(HTTPPolicy): def send(*args): raise AzureError('boo') + config = Configuration() + retry_policy = RetryPolicy() + config.retry_policy = retry_policy boo_policy = BooPolicy() foo_policy = FooPolicy() - client = PipelineClient(base_url="test", per_call_policies=boo_policy) + client = PipelineClient(base_url="test", config=config, per_call_policies=boo_policy) policies = client._pipeline._impl_policies assert boo_policy in policies + pos_boo = policies.index(boo_policy) + pos_retry = policies.index(retry_policy) + assert pos_boo < pos_retry - client = PipelineClient(base_url="test", per_call_policies=[boo_policy]) + client = PipelineClient(base_url="test", config=config, per_call_policies=[boo_policy]) policies = client._pipeline._impl_policies assert boo_policy in policies + pos_boo = policies.index(boo_policy) + pos_retry = policies.index(retry_policy) + assert pos_boo < pos_retry - client = PipelineClient(base_url="test", per_retry_policies=boo_policy) + client = PipelineClient(base_url="test", config=config, per_retry_policies=boo_policy) policies = client._pipeline._impl_policies assert boo_policy in policies - client = PipelineClient(base_url="test", per_retry_policies=[boo_policy]) + pos_boo = policies.index(boo_policy) + pos_retry = policies.index(retry_policy) + assert pos_boo > pos_retry + + client = PipelineClient(base_url="test", config=config, per_retry_policies=[boo_policy]) policies = client._pipeline._impl_policies assert boo_policy in policies + pos_boo = policies.index(boo_policy) + pos_retry = policies.index(retry_policy) + assert pos_boo > pos_retry - client = PipelineClient(base_url="test", per_call_policies=boo_policy, per_retry_policies=foo_policy) + client = PipelineClient(base_url="test", config=config, per_call_policies=boo_policy, per_retry_policies=foo_policy) policies = client._pipeline._impl_policies assert boo_policy in policies assert foo_policy in policies + pos_boo = policies.index(boo_policy) + pos_foo = policies.index(foo_policy) + pos_retry = policies.index(retry_policy) + assert pos_boo < pos_retry + assert pos_foo > pos_retry - client = PipelineClient(base_url="test", per_call_policies=[boo_policy], + client = PipelineClient(base_url="test", config=config, per_call_policies=[boo_policy], per_retry_policies=[foo_policy]) policies = client._pipeline._impl_policies assert boo_policy in policies assert foo_policy in policies + pos_boo = policies.index(boo_policy) + pos_foo = policies.index(foo_policy) + pos_retry = policies.index(retry_policy) + assert pos_boo < pos_retry + assert pos_foo > pos_retry if __name__ == "__main__":