From 22d4eabbafbdc16b0f4faf66f966442691de7666 Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Mon, 1 Nov 2021 11:30:12 +0000 Subject: [PATCH] chore: use gapic-generator-python 0.53.4 (#243) - [ ] Regenerate this pull request now. docs: list oneofs in docstring fix(deps): require google-api-core >= 1.28.0 fix(deps): drop packaging dependency committer: busunkim96@ PiperOrigin-RevId: 406468269 Source-Link: https://github.com/googleapis/googleapis/commit/83d81b0c8fc22291a13398d6d77f02dc97a5b6f4 Source-Link: https://github.com/googleapis/googleapis-gen/commit/2ff001fbacb9e77e71d734de5f955c05fdae8526 Copy-Tag: eyJwIjoiLmdpdGh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiMmZmMDAxZmJhY2I5ZTc3ZTcxZDczNGRlNWY5NTVjMDVmZGFlODUyNiJ9 --- .../alert_policy_service/async_client.py | 34 +++--- .../services/alert_policy_service/client.py | 12 +- .../alert_policy_service/transports/base.py | 35 +----- .../transports/grpc_asyncio.py | 1 - .../services/group_service/async_client.py | 40 +++---- .../services/group_service/client.py | 14 ++- .../services/group_service/transports/base.py | 35 +----- .../group_service/transports/grpc_asyncio.py | 1 - .../services/metric_service/async_client.py | 62 +++++----- .../services/metric_service/client.py | 20 ++-- .../metric_service/transports/base.py | 35 +----- .../metric_service/transports/grpc_asyncio.py | 1 - .../async_client.py | 82 +++++++++----- .../notification_channel_service/client.py | 22 ++-- .../transports/base.py | 35 +----- .../transports/grpc_asyncio.py | 1 - .../services/query_service/async_client.py | 10 +- .../services/query_service/client.py | 4 +- .../services/query_service/transports/base.py | 35 +----- .../query_service/transports/grpc_asyncio.py | 1 - .../async_client.py | 64 ++++++----- .../service_monitoring_service/client.py | 22 ++-- .../transports/base.py | 35 +----- .../transports/grpc_asyncio.py | 1 - .../uptime_check_service/async_client.py | 40 +++---- .../services/uptime_check_service/client.py | 14 ++- .../uptime_check_service/transports/base.py | 35 +----- .../transports/grpc_asyncio.py | 1 - google/cloud/monitoring_v3/types/alert.py | 20 ++++ google/cloud/monitoring_v3/types/common.py | 12 ++ .../monitoring_v3/types/group_service.py | 10 ++ google/cloud/monitoring_v3/types/metric.py | 10 ++ google/cloud/monitoring_v3/types/service.py | 70 ++++++++++++ google/cloud/monitoring_v3/types/uptime.py | 11 ++ monitoring-v3-py.tar.gz | Bin 0 -> 180224 bytes setup.py | 3 +- testing/constraints-3.6.txt | 5 +- .../test_alert_policy_service.py | 103 ++--------------- .../gapic/monitoring_v3/test_group_service.py | 103 ++--------------- .../monitoring_v3/test_metric_service.py | 106 ++---------------- .../test_notification_channel_service.py | 105 ++--------------- .../gapic/monitoring_v3/test_query_service.py | 103 ++--------------- .../test_service_monitoring_service.py | 103 ++--------------- .../test_uptime_check_service.py | 103 ++--------------- 44 files changed, 450 insertions(+), 1109 deletions(-) create mode 100644 monitoring-v3-py.tar.gz diff --git a/google/cloud/monitoring_v3/services/alert_policy_service/async_client.py b/google/cloud/monitoring_v3/services/alert_policy_service/async_client.py index b340a2c3..ce2eacac 100644 --- a/google/cloud/monitoring_v3/services/alert_policy_service/async_client.py +++ b/google/cloud/monitoring_v3/services/alert_policy_service/async_client.py @@ -19,13 +19,15 @@ from typing import Dict, Sequence, Tuple, Type, Union import pkg_resources -import google.api_core.client_options as ClientOptions # type: ignore +from google.api_core.client_options import ClientOptions # type: ignore from google.api_core import exceptions as core_exceptions # type: ignore from google.api_core import gapic_v1 # type: ignore from google.api_core import retry as retries # type: ignore from google.auth import credentials as ga_credentials # type: ignore from google.oauth2 import service_account # type: ignore +OptionalRetry = Union[retries.Retry, object] + from google.cloud.monitoring_v3.services.alert_policy_service import pagers from google.cloud.monitoring_v3.types import alert from google.cloud.monitoring_v3.types import alert_service @@ -186,10 +188,10 @@ def __init__( async def list_alert_policies( self, - request: alert_service.ListAlertPoliciesRequest = None, + request: Union[alert_service.ListAlertPoliciesRequest, dict] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> pagers.ListAlertPoliciesAsyncPager: @@ -197,7 +199,7 @@ async def list_alert_policies( workspace. Args: - request (:class:`google.cloud.monitoring_v3.types.ListAlertPoliciesRequest`): + request (Union[google.cloud.monitoring_v3.types.ListAlertPoliciesRequest, dict]): The request object. The protocol for the `ListAlertPolicies` request. name (:class:`str`): @@ -286,17 +288,17 @@ async def list_alert_policies( async def get_alert_policy( self, - request: alert_service.GetAlertPolicyRequest = None, + request: Union[alert_service.GetAlertPolicyRequest, dict] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> alert.AlertPolicy: r"""Gets a single alerting policy. Args: - request (:class:`google.cloud.monitoring_v3.types.GetAlertPolicyRequest`): + request (Union[google.cloud.monitoring_v3.types.GetAlertPolicyRequest, dict]): The request object. The protocol for the `GetAlertPolicy` request. name (:class:`str`): @@ -373,18 +375,18 @@ async def get_alert_policy( async def create_alert_policy( self, - request: alert_service.CreateAlertPolicyRequest = None, + request: Union[alert_service.CreateAlertPolicyRequest, dict] = None, *, name: str = None, alert_policy: alert.AlertPolicy = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> alert.AlertPolicy: r"""Creates a new alerting policy. Args: - request (:class:`google.cloud.monitoring_v3.types.CreateAlertPolicyRequest`): + request (Union[google.cloud.monitoring_v3.types.CreateAlertPolicyRequest, dict]): The request object. The protocol for the `CreateAlertPolicy` request. name (:class:`str`): @@ -474,17 +476,17 @@ async def create_alert_policy( async def delete_alert_policy( self, - request: alert_service.DeleteAlertPolicyRequest = None, + request: Union[alert_service.DeleteAlertPolicyRequest, dict] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> None: r"""Deletes an alerting policy. Args: - request (:class:`google.cloud.monitoring_v3.types.DeleteAlertPolicyRequest`): + request (Union[google.cloud.monitoring_v3.types.DeleteAlertPolicyRequest, dict]): The request object. The protocol for the `DeleteAlertPolicy` request. name (:class:`str`): @@ -553,11 +555,11 @@ async def delete_alert_policy( async def update_alert_policy( self, - request: alert_service.UpdateAlertPolicyRequest = None, + request: Union[alert_service.UpdateAlertPolicyRequest, dict] = None, *, update_mask: field_mask_pb2.FieldMask = None, alert_policy: alert.AlertPolicy = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> alert.AlertPolicy: @@ -567,7 +569,7 @@ async def update_alert_policy( via ``updateMask``. Returns the updated alerting policy. Args: - request (:class:`google.cloud.monitoring_v3.types.UpdateAlertPolicyRequest`): + request (Union[google.cloud.monitoring_v3.types.UpdateAlertPolicyRequest, dict]): The request object. The protocol for the `UpdateAlertPolicy` request. update_mask (:class:`google.protobuf.field_mask_pb2.FieldMask`): diff --git a/google/cloud/monitoring_v3/services/alert_policy_service/client.py b/google/cloud/monitoring_v3/services/alert_policy_service/client.py index 72cc3785..1cacb21d 100644 --- a/google/cloud/monitoring_v3/services/alert_policy_service/client.py +++ b/google/cloud/monitoring_v3/services/alert_policy_service/client.py @@ -30,6 +30,8 @@ from google.auth.exceptions import MutualTLSChannelError # type: ignore from google.oauth2 import service_account # type: ignore +OptionalRetry = Union[retries.Retry, object] + from google.cloud.monitoring_v3.services.alert_policy_service import pagers from google.cloud.monitoring_v3.types import alert from google.cloud.monitoring_v3.types import alert_service @@ -385,7 +387,7 @@ def list_alert_policies( request: Union[alert_service.ListAlertPoliciesRequest, dict] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> pagers.ListAlertPoliciesPager: @@ -476,7 +478,7 @@ def get_alert_policy( request: Union[alert_service.GetAlertPolicyRequest, dict] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> alert.AlertPolicy: @@ -555,7 +557,7 @@ def create_alert_policy( *, name: str = None, alert_policy: alert.AlertPolicy = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> alert.AlertPolicy: @@ -655,7 +657,7 @@ def delete_alert_policy( request: Union[alert_service.DeleteAlertPolicyRequest, dict] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> None: @@ -726,7 +728,7 @@ def update_alert_policy( *, update_mask: field_mask_pb2.FieldMask = None, alert_policy: alert.AlertPolicy = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> alert.AlertPolicy: diff --git a/google/cloud/monitoring_v3/services/alert_policy_service/transports/base.py b/google/cloud/monitoring_v3/services/alert_policy_service/transports/base.py index a64044c0..ce182693 100644 --- a/google/cloud/monitoring_v3/services/alert_policy_service/transports/base.py +++ b/google/cloud/monitoring_v3/services/alert_policy_service/transports/base.py @@ -15,7 +15,6 @@ # import abc from typing import Awaitable, Callable, Dict, Optional, Sequence, Union -import packaging.version import pkg_resources import google.auth # type: ignore @@ -39,15 +38,6 @@ except pkg_resources.DistributionNotFound: DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo() -try: - # google.auth.__version__ was added in 1.26.0 - _GOOGLE_AUTH_VERSION = google.auth.__version__ -except AttributeError: - try: # try pkg_resources if it is available - _GOOGLE_AUTH_VERSION = pkg_resources.get_distribution("google-auth").version - except pkg_resources.DistributionNotFound: # pragma: NO COVER - _GOOGLE_AUTH_VERSION = None - class AlertPolicyServiceTransport(abc.ABC): """Abstract transport class for AlertPolicyService.""" @@ -101,7 +91,7 @@ def __init__( host += ":443" self._host = host - scopes_kwargs = self._get_scopes_kwargs(self._host, scopes) + scopes_kwargs = {"scopes": scopes, "default_scopes": self.AUTH_SCOPES} # Save the scopes. self._scopes = scopes @@ -134,29 +124,6 @@ def __init__( # Save the credentials. self._credentials = credentials - # TODO(busunkim): This method is in the base transport - # to avoid duplicating code across the transport classes. These functions - # should be deleted once the minimum required versions of google-auth is increased. - - # TODO: Remove this function once google-auth >= 1.25.0 is required - @classmethod - def _get_scopes_kwargs( - cls, host: str, scopes: Optional[Sequence[str]] - ) -> Dict[str, Optional[Sequence[str]]]: - """Returns scopes kwargs to pass to google-auth methods depending on the google-auth version""" - - scopes_kwargs = {} - - if _GOOGLE_AUTH_VERSION and ( - packaging.version.parse(_GOOGLE_AUTH_VERSION) - >= packaging.version.parse("1.25.0") - ): - scopes_kwargs = {"scopes": scopes, "default_scopes": cls.AUTH_SCOPES} - else: - scopes_kwargs = {"scopes": scopes or cls.AUTH_SCOPES} - - return scopes_kwargs - def _prep_wrapped_messages(self, client_info): # Precompute the wrapped methods. self._wrapped_methods = { diff --git a/google/cloud/monitoring_v3/services/alert_policy_service/transports/grpc_asyncio.py b/google/cloud/monitoring_v3/services/alert_policy_service/transports/grpc_asyncio.py index ae1a5a74..b92f3e5d 100644 --- a/google/cloud/monitoring_v3/services/alert_policy_service/transports/grpc_asyncio.py +++ b/google/cloud/monitoring_v3/services/alert_policy_service/transports/grpc_asyncio.py @@ -20,7 +20,6 @@ from google.api_core import grpc_helpers_async # type: ignore from google.auth import credentials as ga_credentials # type: ignore from google.auth.transport.grpc import SslCredentials # type: ignore -import packaging.version import grpc # type: ignore from grpc.experimental import aio # type: ignore diff --git a/google/cloud/monitoring_v3/services/group_service/async_client.py b/google/cloud/monitoring_v3/services/group_service/async_client.py index 7551c890..5d7de466 100644 --- a/google/cloud/monitoring_v3/services/group_service/async_client.py +++ b/google/cloud/monitoring_v3/services/group_service/async_client.py @@ -19,13 +19,15 @@ from typing import Dict, Sequence, Tuple, Type, Union import pkg_resources -import google.api_core.client_options as ClientOptions # type: ignore +from google.api_core.client_options import ClientOptions # type: ignore from google.api_core import exceptions as core_exceptions # type: ignore from google.api_core import gapic_v1 # type: ignore from google.api_core import retry as retries # type: ignore from google.auth import credentials as ga_credentials # type: ignore from google.oauth2 import service_account # type: ignore +OptionalRetry = Union[retries.Retry, object] + from google.api import monitored_resource_pb2 # type: ignore from google.cloud.monitoring_v3.services.group_service import pagers from google.cloud.monitoring_v3.types import group @@ -174,17 +176,17 @@ def __init__( async def list_groups( self, - request: group_service.ListGroupsRequest = None, + request: Union[group_service.ListGroupsRequest, dict] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> pagers.ListGroupsAsyncPager: r"""Lists the existing groups. Args: - request (:class:`google.cloud.monitoring_v3.types.ListGroupsRequest`): + request (Union[google.cloud.monitoring_v3.types.ListGroupsRequest, dict]): The request object. The `ListGroup` request. name (:class:`str`): Required. The @@ -266,17 +268,17 @@ async def list_groups( async def get_group( self, - request: group_service.GetGroupRequest = None, + request: Union[group_service.GetGroupRequest, dict] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> group.Group: r"""Gets a single group. Args: - request (:class:`google.cloud.monitoring_v3.types.GetGroupRequest`): + request (Union[google.cloud.monitoring_v3.types.GetGroupRequest, dict]): The request object. The `GetGroup` request. name (:class:`str`): Required. The group to retrieve. The format is: @@ -379,18 +381,18 @@ async def get_group( async def create_group( self, - request: group_service.CreateGroupRequest = None, + request: Union[group_service.CreateGroupRequest, dict] = None, *, name: str = None, group: gm_group.Group = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> gm_group.Group: r"""Creates a new group. Args: - request (:class:`google.cloud.monitoring_v3.types.CreateGroupRequest`): + request (Union[google.cloud.monitoring_v3.types.CreateGroupRequest, dict]): The request object. The `CreateGroup` request. name (:class:`str`): Required. The @@ -495,10 +497,10 @@ async def create_group( async def update_group( self, - request: group_service.UpdateGroupRequest = None, + request: Union[group_service.UpdateGroupRequest, dict] = None, *, group: gm_group.Group = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> gm_group.Group: @@ -506,7 +508,7 @@ async def update_group( except ``name``. Args: - request (:class:`google.cloud.monitoring_v3.types.UpdateGroupRequest`): + request (Union[google.cloud.monitoring_v3.types.UpdateGroupRequest, dict]): The request object. The `UpdateGroup` request. group (:class:`google.cloud.monitoring_v3.types.Group`): Required. The new definition of the group. All fields of @@ -609,17 +611,17 @@ async def update_group( async def delete_group( self, - request: group_service.DeleteGroupRequest = None, + request: Union[group_service.DeleteGroupRequest, dict] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> None: r"""Deletes an existing group. Args: - request (:class:`google.cloud.monitoring_v3.types.DeleteGroupRequest`): + request (Union[google.cloud.monitoring_v3.types.DeleteGroupRequest, dict]): The request object. The `DeleteGroup` request. The default behavior is to be able to delete a single group without any descendants. @@ -686,10 +688,10 @@ async def delete_group( async def list_group_members( self, - request: group_service.ListGroupMembersRequest = None, + request: Union[group_service.ListGroupMembersRequest, dict] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> pagers.ListGroupMembersAsyncPager: @@ -697,7 +699,7 @@ async def list_group_members( group. Args: - request (:class:`google.cloud.monitoring_v3.types.ListGroupMembersRequest`): + request (Union[google.cloud.monitoring_v3.types.ListGroupMembersRequest, dict]): The request object. The `ListGroupMembers` request. name (:class:`str`): Required. The group whose members are listed. The format diff --git a/google/cloud/monitoring_v3/services/group_service/client.py b/google/cloud/monitoring_v3/services/group_service/client.py index 095f4751..0529625c 100644 --- a/google/cloud/monitoring_v3/services/group_service/client.py +++ b/google/cloud/monitoring_v3/services/group_service/client.py @@ -30,6 +30,8 @@ from google.auth.exceptions import MutualTLSChannelError # type: ignore from google.oauth2 import service_account # type: ignore +OptionalRetry = Union[retries.Retry, object] + from google.api import monitored_resource_pb2 # type: ignore from google.cloud.monitoring_v3.services.group_service import pagers from google.cloud.monitoring_v3.types import group @@ -360,7 +362,7 @@ def list_groups( request: Union[group_service.ListGroupsRequest, dict] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> pagers.ListGroupsPager: @@ -443,7 +445,7 @@ def get_group( request: Union[group_service.GetGroupRequest, dict] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> group.Group: @@ -548,7 +550,7 @@ def create_group( *, name: str = None, group: gm_group.Group = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> gm_group.Group: @@ -663,7 +665,7 @@ def update_group( request: Union[group_service.UpdateGroupRequest, dict] = None, *, group: gm_group.Group = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> gm_group.Group: @@ -768,7 +770,7 @@ def delete_group( request: Union[group_service.DeleteGroupRequest, dict] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> None: @@ -836,7 +838,7 @@ def list_group_members( request: Union[group_service.ListGroupMembersRequest, dict] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> pagers.ListGroupMembersPager: diff --git a/google/cloud/monitoring_v3/services/group_service/transports/base.py b/google/cloud/monitoring_v3/services/group_service/transports/base.py index 41f5b47c..073ea8e7 100644 --- a/google/cloud/monitoring_v3/services/group_service/transports/base.py +++ b/google/cloud/monitoring_v3/services/group_service/transports/base.py @@ -15,7 +15,6 @@ # import abc from typing import Awaitable, Callable, Dict, Optional, Sequence, Union -import packaging.version import pkg_resources import google.auth # type: ignore @@ -40,15 +39,6 @@ except pkg_resources.DistributionNotFound: DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo() -try: - # google.auth.__version__ was added in 1.26.0 - _GOOGLE_AUTH_VERSION = google.auth.__version__ -except AttributeError: - try: # try pkg_resources if it is available - _GOOGLE_AUTH_VERSION = pkg_resources.get_distribution("google-auth").version - except pkg_resources.DistributionNotFound: # pragma: NO COVER - _GOOGLE_AUTH_VERSION = None - class GroupServiceTransport(abc.ABC): """Abstract transport class for GroupService.""" @@ -102,7 +92,7 @@ def __init__( host += ":443" self._host = host - scopes_kwargs = self._get_scopes_kwargs(self._host, scopes) + scopes_kwargs = {"scopes": scopes, "default_scopes": self.AUTH_SCOPES} # Save the scopes. self._scopes = scopes @@ -135,29 +125,6 @@ def __init__( # Save the credentials. self._credentials = credentials - # TODO(busunkim): This method is in the base transport - # to avoid duplicating code across the transport classes. These functions - # should be deleted once the minimum required versions of google-auth is increased. - - # TODO: Remove this function once google-auth >= 1.25.0 is required - @classmethod - def _get_scopes_kwargs( - cls, host: str, scopes: Optional[Sequence[str]] - ) -> Dict[str, Optional[Sequence[str]]]: - """Returns scopes kwargs to pass to google-auth methods depending on the google-auth version""" - - scopes_kwargs = {} - - if _GOOGLE_AUTH_VERSION and ( - packaging.version.parse(_GOOGLE_AUTH_VERSION) - >= packaging.version.parse("1.25.0") - ): - scopes_kwargs = {"scopes": scopes, "default_scopes": cls.AUTH_SCOPES} - else: - scopes_kwargs = {"scopes": scopes or cls.AUTH_SCOPES} - - return scopes_kwargs - def _prep_wrapped_messages(self, client_info): # Precompute the wrapped methods. self._wrapped_methods = { diff --git a/google/cloud/monitoring_v3/services/group_service/transports/grpc_asyncio.py b/google/cloud/monitoring_v3/services/group_service/transports/grpc_asyncio.py index e5d7ba98..cf4a276a 100644 --- a/google/cloud/monitoring_v3/services/group_service/transports/grpc_asyncio.py +++ b/google/cloud/monitoring_v3/services/group_service/transports/grpc_asyncio.py @@ -20,7 +20,6 @@ from google.api_core import grpc_helpers_async # type: ignore from google.auth import credentials as ga_credentials # type: ignore from google.auth.transport.grpc import SslCredentials # type: ignore -import packaging.version import grpc # type: ignore from grpc.experimental import aio # type: ignore diff --git a/google/cloud/monitoring_v3/services/metric_service/async_client.py b/google/cloud/monitoring_v3/services/metric_service/async_client.py index 38e530ae..f15683a1 100644 --- a/google/cloud/monitoring_v3/services/metric_service/async_client.py +++ b/google/cloud/monitoring_v3/services/metric_service/async_client.py @@ -19,13 +19,15 @@ from typing import Dict, Sequence, Tuple, Type, Union import pkg_resources -import google.api_core.client_options as ClientOptions # type: ignore +from google.api_core.client_options import ClientOptions # type: ignore from google.api_core import exceptions as core_exceptions # type: ignore from google.api_core import gapic_v1 # type: ignore from google.api_core import retry as retries # type: ignore from google.auth import credentials as ga_credentials # type: ignore from google.oauth2 import service_account # type: ignore +OptionalRetry = Union[retries.Retry, object] + from google.api import label_pb2 # type: ignore from google.api import launch_stage_pb2 # type: ignore from google.api import metric_pb2 # type: ignore @@ -179,10 +181,12 @@ def __init__( async def list_monitored_resource_descriptors( self, - request: metric_service.ListMonitoredResourceDescriptorsRequest = None, + request: Union[ + metric_service.ListMonitoredResourceDescriptorsRequest, dict + ] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> pagers.ListMonitoredResourceDescriptorsAsyncPager: @@ -190,7 +194,7 @@ async def list_monitored_resource_descriptors( filter. This method does not require a Workspace. Args: - request (:class:`google.cloud.monitoring_v3.types.ListMonitoredResourceDescriptorsRequest`): + request (Union[google.cloud.monitoring_v3.types.ListMonitoredResourceDescriptorsRequest, dict]): The request object. The `ListMonitoredResourceDescriptors` request. name (:class:`str`): @@ -273,10 +277,12 @@ async def list_monitored_resource_descriptors( async def get_monitored_resource_descriptor( self, - request: metric_service.GetMonitoredResourceDescriptorRequest = None, + request: Union[ + metric_service.GetMonitoredResourceDescriptorRequest, dict + ] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> monitored_resource_pb2.MonitoredResourceDescriptor: @@ -284,7 +290,7 @@ async def get_monitored_resource_descriptor( method does not require a Workspace. Args: - request (:class:`google.cloud.monitoring_v3.types.GetMonitoredResourceDescriptorRequest`): + request (Union[google.cloud.monitoring_v3.types.GetMonitoredResourceDescriptorRequest, dict]): The request object. The `GetMonitoredResourceDescriptor` request. name (:class:`str`): @@ -370,10 +376,10 @@ async def get_monitored_resource_descriptor( async def list_metric_descriptors( self, - request: metric_service.ListMetricDescriptorsRequest = None, + request: Union[metric_service.ListMetricDescriptorsRequest, dict] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> pagers.ListMetricDescriptorsAsyncPager: @@ -381,7 +387,7 @@ async def list_metric_descriptors( method does not require a Workspace. Args: - request (:class:`google.cloud.monitoring_v3.types.ListMetricDescriptorsRequest`): + request (Union[google.cloud.monitoring_v3.types.ListMetricDescriptorsRequest, dict]): The request object. The `ListMetricDescriptors` request. name (:class:`str`): Required. The @@ -463,10 +469,10 @@ async def list_metric_descriptors( async def get_metric_descriptor( self, - request: metric_service.GetMetricDescriptorRequest = None, + request: Union[metric_service.GetMetricDescriptorRequest, dict] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> metric_pb2.MetricDescriptor: @@ -474,7 +480,7 @@ async def get_metric_descriptor( require a Workspace. Args: - request (:class:`google.cloud.monitoring_v3.types.GetMetricDescriptorRequest`): + request (Union[google.cloud.monitoring_v3.types.GetMetricDescriptorRequest, dict]): The request object. The `GetMetricDescriptor` request. name (:class:`str`): Required. The metric descriptor on which to execute the @@ -553,11 +559,11 @@ async def get_metric_descriptor( async def create_metric_descriptor( self, - request: metric_service.CreateMetricDescriptorRequest = None, + request: Union[metric_service.CreateMetricDescriptorRequest, dict] = None, *, name: str = None, metric_descriptor: metric_pb2.MetricDescriptor = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> metric_pb2.MetricDescriptor: @@ -568,7 +574,7 @@ async def create_metric_descriptor( metrics `__. Args: - request (:class:`google.cloud.monitoring_v3.types.CreateMetricDescriptorRequest`): + request (Union[google.cloud.monitoring_v3.types.CreateMetricDescriptorRequest, dict]): The request object. The `CreateMetricDescriptor` request. name (:class:`str`): @@ -644,10 +650,10 @@ async def create_metric_descriptor( async def delete_metric_descriptor( self, - request: metric_service.DeleteMetricDescriptorRequest = None, + request: Union[metric_service.DeleteMetricDescriptorRequest, dict] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> None: @@ -656,7 +662,7 @@ async def delete_metric_descriptor( can be deleted. Args: - request (:class:`google.cloud.monitoring_v3.types.DeleteMetricDescriptorRequest`): + request (Union[google.cloud.monitoring_v3.types.DeleteMetricDescriptorRequest, dict]): The request object. The `DeleteMetricDescriptor` request. name (:class:`str`): @@ -726,13 +732,13 @@ async def delete_metric_descriptor( async def list_time_series( self, - request: metric_service.ListTimeSeriesRequest = None, + request: Union[metric_service.ListTimeSeriesRequest, dict] = None, *, name: str = None, filter: str = None, interval: common.TimeInterval = None, view: metric_service.ListTimeSeriesRequest.TimeSeriesView = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> pagers.ListTimeSeriesAsyncPager: @@ -740,7 +746,7 @@ async def list_time_series( does not require a Workspace. Args: - request (:class:`google.cloud.monitoring_v3.types.ListTimeSeriesRequest`): + request (Union[google.cloud.monitoring_v3.types.ListTimeSeriesRequest, dict]): The request object. The `ListTimeSeries` request. name (:class:`str`): Required. The @@ -864,11 +870,11 @@ async def list_time_series( async def create_time_series( self, - request: metric_service.CreateTimeSeriesRequest = None, + request: Union[metric_service.CreateTimeSeriesRequest, dict] = None, *, name: str = None, time_series: Sequence[gm_metric.TimeSeries] = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> None: @@ -879,7 +885,7 @@ async def create_time_series( response. Args: - request (:class:`google.cloud.monitoring_v3.types.CreateTimeSeriesRequest`): + request (Union[google.cloud.monitoring_v3.types.CreateTimeSeriesRequest, dict]): The request object. The `CreateTimeSeries` request. name (:class:`str`): Required. The @@ -954,11 +960,11 @@ async def create_time_series( async def create_service_time_series( self, - request: metric_service.CreateTimeSeriesRequest = None, + request: Union[metric_service.CreateTimeSeriesRequest, dict] = None, *, name: str = None, time_series: Sequence[gm_metric.TimeSeries] = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> None: @@ -973,7 +979,7 @@ async def create_service_time_series( instead. Args: - request (:class:`google.cloud.monitoring_v3.types.CreateTimeSeriesRequest`): + request (Union[google.cloud.monitoring_v3.types.CreateTimeSeriesRequest, dict]): The request object. The `CreateTimeSeries` request. name (:class:`str`): Required. The diff --git a/google/cloud/monitoring_v3/services/metric_service/client.py b/google/cloud/monitoring_v3/services/metric_service/client.py index db91a598..e1f9737e 100644 --- a/google/cloud/monitoring_v3/services/metric_service/client.py +++ b/google/cloud/monitoring_v3/services/metric_service/client.py @@ -30,6 +30,8 @@ from google.auth.exceptions import MutualTLSChannelError # type: ignore from google.oauth2 import service_account # type: ignore +OptionalRetry = Union[retries.Retry, object] + from google.api import label_pb2 # type: ignore from google.api import launch_stage_pb2 # type: ignore from google.api import metric_pb2 # type: ignore @@ -389,7 +391,7 @@ def list_monitored_resource_descriptors( ] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> pagers.ListMonitoredResourceDescriptorsPager: @@ -480,7 +482,7 @@ def get_monitored_resource_descriptor( ] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> monitored_resource_pb2.MonitoredResourceDescriptor: @@ -572,7 +574,7 @@ def list_metric_descriptors( request: Union[metric_service.ListMetricDescriptorsRequest, dict] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> pagers.ListMetricDescriptorsPager: @@ -656,7 +658,7 @@ def get_metric_descriptor( request: Union[metric_service.GetMetricDescriptorRequest, dict] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> metric_pb2.MetricDescriptor: @@ -738,7 +740,7 @@ def create_metric_descriptor( *, name: str = None, metric_descriptor: metric_pb2.MetricDescriptor = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> metric_pb2.MetricDescriptor: @@ -828,7 +830,7 @@ def delete_metric_descriptor( request: Union[metric_service.DeleteMetricDescriptorRequest, dict] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> None: @@ -904,7 +906,7 @@ def list_time_series( filter: str = None, interval: common.TimeInterval = None, view: metric_service.ListTimeSeriesRequest.TimeSeriesView = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> pagers.ListTimeSeriesPager: @@ -1031,7 +1033,7 @@ def create_time_series( *, name: str = None, time_series: Sequence[gm_metric.TimeSeries] = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> None: @@ -1121,7 +1123,7 @@ def create_service_time_series( *, name: str = None, time_series: Sequence[gm_metric.TimeSeries] = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> None: diff --git a/google/cloud/monitoring_v3/services/metric_service/transports/base.py b/google/cloud/monitoring_v3/services/metric_service/transports/base.py index 7bc3cd98..77efcbad 100644 --- a/google/cloud/monitoring_v3/services/metric_service/transports/base.py +++ b/google/cloud/monitoring_v3/services/metric_service/transports/base.py @@ -15,7 +15,6 @@ # import abc from typing import Awaitable, Callable, Dict, Optional, Sequence, Union -import packaging.version import pkg_resources import google.auth # type: ignore @@ -40,15 +39,6 @@ except pkg_resources.DistributionNotFound: DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo() -try: - # google.auth.__version__ was added in 1.26.0 - _GOOGLE_AUTH_VERSION = google.auth.__version__ -except AttributeError: - try: # try pkg_resources if it is available - _GOOGLE_AUTH_VERSION = pkg_resources.get_distribution("google-auth").version - except pkg_resources.DistributionNotFound: # pragma: NO COVER - _GOOGLE_AUTH_VERSION = None - class MetricServiceTransport(abc.ABC): """Abstract transport class for MetricService.""" @@ -103,7 +93,7 @@ def __init__( host += ":443" self._host = host - scopes_kwargs = self._get_scopes_kwargs(self._host, scopes) + scopes_kwargs = {"scopes": scopes, "default_scopes": self.AUTH_SCOPES} # Save the scopes. self._scopes = scopes @@ -136,29 +126,6 @@ def __init__( # Save the credentials. self._credentials = credentials - # TODO(busunkim): This method is in the base transport - # to avoid duplicating code across the transport classes. These functions - # should be deleted once the minimum required versions of google-auth is increased. - - # TODO: Remove this function once google-auth >= 1.25.0 is required - @classmethod - def _get_scopes_kwargs( - cls, host: str, scopes: Optional[Sequence[str]] - ) -> Dict[str, Optional[Sequence[str]]]: - """Returns scopes kwargs to pass to google-auth methods depending on the google-auth version""" - - scopes_kwargs = {} - - if _GOOGLE_AUTH_VERSION and ( - packaging.version.parse(_GOOGLE_AUTH_VERSION) - >= packaging.version.parse("1.25.0") - ): - scopes_kwargs = {"scopes": scopes, "default_scopes": cls.AUTH_SCOPES} - else: - scopes_kwargs = {"scopes": scopes or cls.AUTH_SCOPES} - - return scopes_kwargs - def _prep_wrapped_messages(self, client_info): # Precompute the wrapped methods. self._wrapped_methods = { diff --git a/google/cloud/monitoring_v3/services/metric_service/transports/grpc_asyncio.py b/google/cloud/monitoring_v3/services/metric_service/transports/grpc_asyncio.py index 67fa535c..32e3d890 100644 --- a/google/cloud/monitoring_v3/services/metric_service/transports/grpc_asyncio.py +++ b/google/cloud/monitoring_v3/services/metric_service/transports/grpc_asyncio.py @@ -20,7 +20,6 @@ from google.api_core import grpc_helpers_async # type: ignore from google.auth import credentials as ga_credentials # type: ignore from google.auth.transport.grpc import SslCredentials # type: ignore -import packaging.version import grpc # type: ignore from grpc.experimental import aio # type: ignore diff --git a/google/cloud/monitoring_v3/services/notification_channel_service/async_client.py b/google/cloud/monitoring_v3/services/notification_channel_service/async_client.py index ff17dd21..4b381eaf 100644 --- a/google/cloud/monitoring_v3/services/notification_channel_service/async_client.py +++ b/google/cloud/monitoring_v3/services/notification_channel_service/async_client.py @@ -19,13 +19,15 @@ from typing import Dict, Sequence, Tuple, Type, Union import pkg_resources -import google.api_core.client_options as ClientOptions # type: ignore +from google.api_core.client_options import ClientOptions # type: ignore from google.api_core import exceptions as core_exceptions # type: ignore from google.api_core import gapic_v1 # type: ignore from google.api_core import retry as retries # type: ignore from google.auth import credentials as ga_credentials # type: ignore from google.oauth2 import service_account # type: ignore +OptionalRetry = Union[retries.Retry, object] + from google.api import label_pb2 # type: ignore from google.api import launch_stage_pb2 # type: ignore from google.cloud.monitoring_v3.services.notification_channel_service import pagers @@ -190,10 +192,12 @@ def __init__( async def list_notification_channel_descriptors( self, - request: notification_service.ListNotificationChannelDescriptorsRequest = None, + request: Union[ + notification_service.ListNotificationChannelDescriptorsRequest, dict + ] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> pagers.ListNotificationChannelDescriptorsAsyncPager: @@ -202,7 +206,7 @@ async def list_notification_channel_descriptors( types to be dynamically added. Args: - request (:class:`google.cloud.monitoring_v3.types.ListNotificationChannelDescriptorsRequest`): + request (Union[google.cloud.monitoring_v3.types.ListNotificationChannelDescriptorsRequest, dict]): The request object. The `ListNotificationChannelDescriptors` request. name (:class:`str`): @@ -295,10 +299,12 @@ async def list_notification_channel_descriptors( async def get_notification_channel_descriptor( self, - request: notification_service.GetNotificationChannelDescriptorRequest = None, + request: Union[ + notification_service.GetNotificationChannelDescriptorRequest, dict + ] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> notification.NotificationChannelDescriptor: @@ -307,7 +313,7 @@ async def get_notification_channel_descriptor( notification channel of the given type. Args: - request (:class:`google.cloud.monitoring_v3.types.GetNotificationChannelDescriptorRequest`): + request (Union[google.cloud.monitoring_v3.types.GetNotificationChannelDescriptorRequest, dict]): The request object. The `GetNotificationChannelDescriptor` response. name (:class:`str`): @@ -384,10 +390,12 @@ async def get_notification_channel_descriptor( async def list_notification_channels( self, - request: notification_service.ListNotificationChannelsRequest = None, + request: Union[ + notification_service.ListNotificationChannelsRequest, dict + ] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> pagers.ListNotificationChannelsAsyncPager: @@ -395,7 +403,7 @@ async def list_notification_channels( created for the project. Args: - request (:class:`google.cloud.monitoring_v3.types.ListNotificationChannelsRequest`): + request (Union[google.cloud.monitoring_v3.types.ListNotificationChannelsRequest, dict]): The request object. The `ListNotificationChannels` request. name (:class:`str`): @@ -485,10 +493,10 @@ async def list_notification_channels( async def get_notification_channel( self, - request: notification_service.GetNotificationChannelRequest = None, + request: Union[notification_service.GetNotificationChannelRequest, dict] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> notification.NotificationChannel: @@ -501,7 +509,7 @@ async def get_notification_channel( call to the create method. Args: - request (:class:`google.cloud.monitoring_v3.types.GetNotificationChannelRequest`): + request (Union[google.cloud.monitoring_v3.types.GetNotificationChannelRequest, dict]): The request object. The `GetNotificationChannel` request. name (:class:`str`): @@ -580,11 +588,13 @@ async def get_notification_channel( async def create_notification_channel( self, - request: notification_service.CreateNotificationChannelRequest = None, + request: Union[ + notification_service.CreateNotificationChannelRequest, dict + ] = None, *, name: str = None, notification_channel: notification.NotificationChannel = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> notification.NotificationChannel: @@ -593,7 +603,7 @@ async def create_notification_channel( SMS number, or PagerDuty service. Args: - request (:class:`google.cloud.monitoring_v3.types.CreateNotificationChannelRequest`): + request (Union[google.cloud.monitoring_v3.types.CreateNotificationChannelRequest, dict]): The request object. The `CreateNotificationChannel` request. name (:class:`str`): @@ -680,11 +690,13 @@ async def create_notification_channel( async def update_notification_channel( self, - request: notification_service.UpdateNotificationChannelRequest = None, + request: Union[ + notification_service.UpdateNotificationChannelRequest, dict + ] = None, *, update_mask: field_mask_pb2.FieldMask = None, notification_channel: notification.NotificationChannel = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> notification.NotificationChannel: @@ -692,7 +704,7 @@ async def update_notification_channel( in the field mask remain unchanged. Args: - request (:class:`google.cloud.monitoring_v3.types.UpdateNotificationChannelRequest`): + request (Union[google.cloud.monitoring_v3.types.UpdateNotificationChannelRequest, dict]): The request object. The `UpdateNotificationChannel` request. update_mask (:class:`google.protobuf.field_mask_pb2.FieldMask`): @@ -770,18 +782,20 @@ async def update_notification_channel( async def delete_notification_channel( self, - request: notification_service.DeleteNotificationChannelRequest = None, + request: Union[ + notification_service.DeleteNotificationChannelRequest, dict + ] = None, *, name: str = None, force: bool = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> None: r"""Deletes a notification channel. Args: - request (:class:`google.cloud.monitoring_v3.types.DeleteNotificationChannelRequest`): + request (Union[google.cloud.monitoring_v3.types.DeleteNotificationChannelRequest, dict]): The request object. The `DeleteNotificationChannel` request. name (:class:`str`): @@ -863,10 +877,12 @@ async def delete_notification_channel( async def send_notification_channel_verification_code( self, - request: notification_service.SendNotificationChannelVerificationCodeRequest = None, + request: Union[ + notification_service.SendNotificationChannelVerificationCodeRequest, dict + ] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> None: @@ -875,7 +891,7 @@ async def send_notification_channel_verification_code( verify the channel. Args: - request (:class:`google.cloud.monitoring_v3.types.SendNotificationChannelVerificationCodeRequest`): + request (Union[google.cloud.monitoring_v3.types.SendNotificationChannelVerificationCodeRequest, dict]): The request object. The `SendNotificationChannelVerificationCode` request. name (:class:`str`): @@ -931,10 +947,12 @@ async def send_notification_channel_verification_code( async def get_notification_channel_verification_code( self, - request: notification_service.GetNotificationChannelVerificationCodeRequest = None, + request: Union[ + notification_service.GetNotificationChannelVerificationCodeRequest, dict + ] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> notification_service.GetNotificationChannelVerificationCodeResponse: @@ -968,7 +986,7 @@ async def get_notification_channel_verification_code( string that has a longer expiration time. Args: - request (:class:`google.cloud.monitoring_v3.types.GetNotificationChannelVerificationCodeRequest`): + request (Union[google.cloud.monitoring_v3.types.GetNotificationChannelVerificationCodeRequest, dict]): The request object. The `GetNotificationChannelVerificationCode` request. name (:class:`str`): @@ -1042,11 +1060,13 @@ async def get_notification_channel_verification_code( async def verify_notification_channel( self, - request: notification_service.VerifyNotificationChannelRequest = None, + request: Union[ + notification_service.VerifyNotificationChannelRequest, dict + ] = None, *, name: str = None, code: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> notification.NotificationChannel: @@ -1055,7 +1075,7 @@ async def verify_notification_channel( ``SendNotificationChannelVerificationCode``. Args: - request (:class:`google.cloud.monitoring_v3.types.VerifyNotificationChannelRequest`): + request (Union[google.cloud.monitoring_v3.types.VerifyNotificationChannelRequest, dict]): The request object. The `VerifyNotificationChannel` request. name (:class:`str`): diff --git a/google/cloud/monitoring_v3/services/notification_channel_service/client.py b/google/cloud/monitoring_v3/services/notification_channel_service/client.py index 6f933d34..cd9a1970 100644 --- a/google/cloud/monitoring_v3/services/notification_channel_service/client.py +++ b/google/cloud/monitoring_v3/services/notification_channel_service/client.py @@ -30,6 +30,8 @@ from google.auth.exceptions import MutualTLSChannelError # type: ignore from google.oauth2 import service_account # type: ignore +OptionalRetry = Union[retries.Retry, object] + from google.api import label_pb2 # type: ignore from google.api import launch_stage_pb2 # type: ignore from google.cloud.monitoring_v3.services.notification_channel_service import pagers @@ -384,7 +386,7 @@ def list_notification_channel_descriptors( ] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> pagers.ListNotificationChannelDescriptorsPager: @@ -486,7 +488,7 @@ def get_notification_channel_descriptor( ] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> notification.NotificationChannelDescriptor: @@ -574,7 +576,7 @@ def list_notification_channels( ] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> pagers.ListNotificationChannelsPager: @@ -670,7 +672,7 @@ def get_notification_channel( request: Union[notification_service.GetNotificationChannelRequest, dict] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> notification.NotificationChannel: @@ -759,7 +761,7 @@ def create_notification_channel( *, name: str = None, notification_channel: notification.NotificationChannel = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> notification.NotificationChannel: @@ -865,7 +867,7 @@ def update_notification_channel( *, update_mask: field_mask_pb2.FieldMask = None, notification_channel: notification.NotificationChannel = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> notification.NotificationChannel: @@ -961,7 +963,7 @@ def delete_notification_channel( *, name: str = None, force: bool = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> None: @@ -1050,7 +1052,7 @@ def send_notification_channel_verification_code( ] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> None: @@ -1124,7 +1126,7 @@ def get_notification_channel_verification_code( ] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> notification_service.GetNotificationChannelVerificationCodeResponse: @@ -1233,7 +1235,7 @@ def verify_notification_channel( *, name: str = None, code: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> notification.NotificationChannel: diff --git a/google/cloud/monitoring_v3/services/notification_channel_service/transports/base.py b/google/cloud/monitoring_v3/services/notification_channel_service/transports/base.py index 566fdf15..a5b7868a 100644 --- a/google/cloud/monitoring_v3/services/notification_channel_service/transports/base.py +++ b/google/cloud/monitoring_v3/services/notification_channel_service/transports/base.py @@ -15,7 +15,6 @@ # import abc from typing import Awaitable, Callable, Dict, Optional, Sequence, Union -import packaging.version import pkg_resources import google.auth # type: ignore @@ -39,15 +38,6 @@ except pkg_resources.DistributionNotFound: DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo() -try: - # google.auth.__version__ was added in 1.26.0 - _GOOGLE_AUTH_VERSION = google.auth.__version__ -except AttributeError: - try: # try pkg_resources if it is available - _GOOGLE_AUTH_VERSION = pkg_resources.get_distribution("google-auth").version - except pkg_resources.DistributionNotFound: # pragma: NO COVER - _GOOGLE_AUTH_VERSION = None - class NotificationChannelServiceTransport(abc.ABC): """Abstract transport class for NotificationChannelService.""" @@ -101,7 +91,7 @@ def __init__( host += ":443" self._host = host - scopes_kwargs = self._get_scopes_kwargs(self._host, scopes) + scopes_kwargs = {"scopes": scopes, "default_scopes": self.AUTH_SCOPES} # Save the scopes. self._scopes = scopes @@ -134,29 +124,6 @@ def __init__( # Save the credentials. self._credentials = credentials - # TODO(busunkim): This method is in the base transport - # to avoid duplicating code across the transport classes. These functions - # should be deleted once the minimum required versions of google-auth is increased. - - # TODO: Remove this function once google-auth >= 1.25.0 is required - @classmethod - def _get_scopes_kwargs( - cls, host: str, scopes: Optional[Sequence[str]] - ) -> Dict[str, Optional[Sequence[str]]]: - """Returns scopes kwargs to pass to google-auth methods depending on the google-auth version""" - - scopes_kwargs = {} - - if _GOOGLE_AUTH_VERSION and ( - packaging.version.parse(_GOOGLE_AUTH_VERSION) - >= packaging.version.parse("1.25.0") - ): - scopes_kwargs = {"scopes": scopes, "default_scopes": cls.AUTH_SCOPES} - else: - scopes_kwargs = {"scopes": scopes or cls.AUTH_SCOPES} - - return scopes_kwargs - def _prep_wrapped_messages(self, client_info): # Precompute the wrapped methods. self._wrapped_methods = { diff --git a/google/cloud/monitoring_v3/services/notification_channel_service/transports/grpc_asyncio.py b/google/cloud/monitoring_v3/services/notification_channel_service/transports/grpc_asyncio.py index fca47836..59401088 100644 --- a/google/cloud/monitoring_v3/services/notification_channel_service/transports/grpc_asyncio.py +++ b/google/cloud/monitoring_v3/services/notification_channel_service/transports/grpc_asyncio.py @@ -20,7 +20,6 @@ from google.api_core import grpc_helpers_async # type: ignore from google.auth import credentials as ga_credentials # type: ignore from google.auth.transport.grpc import SslCredentials # type: ignore -import packaging.version import grpc # type: ignore from grpc.experimental import aio # type: ignore diff --git a/google/cloud/monitoring_v3/services/query_service/async_client.py b/google/cloud/monitoring_v3/services/query_service/async_client.py index c244368b..d6f94791 100644 --- a/google/cloud/monitoring_v3/services/query_service/async_client.py +++ b/google/cloud/monitoring_v3/services/query_service/async_client.py @@ -19,13 +19,15 @@ from typing import Dict, Sequence, Tuple, Type, Union import pkg_resources -import google.api_core.client_options as ClientOptions # type: ignore +from google.api_core.client_options import ClientOptions # type: ignore from google.api_core import exceptions as core_exceptions # type: ignore from google.api_core import gapic_v1 # type: ignore from google.api_core import retry as retries # type: ignore from google.auth import credentials as ga_credentials # type: ignore from google.oauth2 import service_account # type: ignore +OptionalRetry = Union[retries.Retry, object] + from google.cloud.monitoring_v3.services.query_service import pagers from google.cloud.monitoring_v3.types import metric from google.cloud.monitoring_v3.types import metric_service @@ -161,9 +163,9 @@ def __init__( async def query_time_series( self, - request: metric_service.QueryTimeSeriesRequest = None, + request: Union[metric_service.QueryTimeSeriesRequest, dict] = None, *, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> pagers.QueryTimeSeriesAsyncPager: @@ -171,7 +173,7 @@ async def query_time_series( This method does not require a Workspace. Args: - request (:class:`google.cloud.monitoring_v3.types.QueryTimeSeriesRequest`): + request (Union[google.cloud.monitoring_v3.types.QueryTimeSeriesRequest, dict]): The request object. The `QueryTimeSeries` request. retry (google.api_core.retry.Retry): Designation of what errors, if any, should be retried. diff --git a/google/cloud/monitoring_v3/services/query_service/client.py b/google/cloud/monitoring_v3/services/query_service/client.py index c05db7f4..43f3e571 100644 --- a/google/cloud/monitoring_v3/services/query_service/client.py +++ b/google/cloud/monitoring_v3/services/query_service/client.py @@ -30,6 +30,8 @@ from google.auth.exceptions import MutualTLSChannelError # type: ignore from google.oauth2 import service_account # type: ignore +OptionalRetry = Union[retries.Retry, object] + from google.cloud.monitoring_v3.services.query_service import pagers from google.cloud.monitoring_v3.types import metric from google.cloud.monitoring_v3.types import metric_service @@ -337,7 +339,7 @@ def query_time_series( self, request: Union[metric_service.QueryTimeSeriesRequest, dict] = None, *, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> pagers.QueryTimeSeriesPager: diff --git a/google/cloud/monitoring_v3/services/query_service/transports/base.py b/google/cloud/monitoring_v3/services/query_service/transports/base.py index 74773560..cad6ad15 100644 --- a/google/cloud/monitoring_v3/services/query_service/transports/base.py +++ b/google/cloud/monitoring_v3/services/query_service/transports/base.py @@ -15,7 +15,6 @@ # import abc from typing import Awaitable, Callable, Dict, Optional, Sequence, Union -import packaging.version import pkg_resources import google.auth # type: ignore @@ -37,15 +36,6 @@ except pkg_resources.DistributionNotFound: DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo() -try: - # google.auth.__version__ was added in 1.26.0 - _GOOGLE_AUTH_VERSION = google.auth.__version__ -except AttributeError: - try: # try pkg_resources if it is available - _GOOGLE_AUTH_VERSION = pkg_resources.get_distribution("google-auth").version - except pkg_resources.DistributionNotFound: # pragma: NO COVER - _GOOGLE_AUTH_VERSION = None - class QueryServiceTransport(abc.ABC): """Abstract transport class for QueryService.""" @@ -99,7 +89,7 @@ def __init__( host += ":443" self._host = host - scopes_kwargs = self._get_scopes_kwargs(self._host, scopes) + scopes_kwargs = {"scopes": scopes, "default_scopes": self.AUTH_SCOPES} # Save the scopes. self._scopes = scopes @@ -132,29 +122,6 @@ def __init__( # Save the credentials. self._credentials = credentials - # TODO(busunkim): This method is in the base transport - # to avoid duplicating code across the transport classes. These functions - # should be deleted once the minimum required versions of google-auth is increased. - - # TODO: Remove this function once google-auth >= 1.25.0 is required - @classmethod - def _get_scopes_kwargs( - cls, host: str, scopes: Optional[Sequence[str]] - ) -> Dict[str, Optional[Sequence[str]]]: - """Returns scopes kwargs to pass to google-auth methods depending on the google-auth version""" - - scopes_kwargs = {} - - if _GOOGLE_AUTH_VERSION and ( - packaging.version.parse(_GOOGLE_AUTH_VERSION) - >= packaging.version.parse("1.25.0") - ): - scopes_kwargs = {"scopes": scopes, "default_scopes": cls.AUTH_SCOPES} - else: - scopes_kwargs = {"scopes": scopes or cls.AUTH_SCOPES} - - return scopes_kwargs - def _prep_wrapped_messages(self, client_info): # Precompute the wrapped methods. self._wrapped_methods = { diff --git a/google/cloud/monitoring_v3/services/query_service/transports/grpc_asyncio.py b/google/cloud/monitoring_v3/services/query_service/transports/grpc_asyncio.py index e6cf8540..eff806a5 100644 --- a/google/cloud/monitoring_v3/services/query_service/transports/grpc_asyncio.py +++ b/google/cloud/monitoring_v3/services/query_service/transports/grpc_asyncio.py @@ -20,7 +20,6 @@ from google.api_core import grpc_helpers_async # type: ignore from google.auth import credentials as ga_credentials # type: ignore from google.auth.transport.grpc import SslCredentials # type: ignore -import packaging.version import grpc # type: ignore from grpc.experimental import aio # type: ignore diff --git a/google/cloud/monitoring_v3/services/service_monitoring_service/async_client.py b/google/cloud/monitoring_v3/services/service_monitoring_service/async_client.py index 6eb0a034..1daf169e 100644 --- a/google/cloud/monitoring_v3/services/service_monitoring_service/async_client.py +++ b/google/cloud/monitoring_v3/services/service_monitoring_service/async_client.py @@ -19,13 +19,15 @@ from typing import Dict, Sequence, Tuple, Type, Union import pkg_resources -import google.api_core.client_options as ClientOptions # type: ignore +from google.api_core.client_options import ClientOptions # type: ignore from google.api_core import exceptions as core_exceptions # type: ignore from google.api_core import gapic_v1 # type: ignore from google.api_core import retry as retries # type: ignore from google.auth import credentials as ga_credentials # type: ignore from google.oauth2 import service_account # type: ignore +OptionalRetry = Union[retries.Retry, object] + from google.cloud.monitoring_v3.services.service_monitoring_service import pagers from google.cloud.monitoring_v3.types import service from google.cloud.monitoring_v3.types import service as gm_service @@ -182,18 +184,18 @@ def __init__( async def create_service( self, - request: service_service.CreateServiceRequest = None, + request: Union[service_service.CreateServiceRequest, dict] = None, *, parent: str = None, service: gm_service.Service = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> gm_service.Service: r"""Create a ``Service``. Args: - request (:class:`google.cloud.monitoring_v3.types.CreateServiceRequest`): + request (Union[google.cloud.monitoring_v3.types.CreateServiceRequest, dict]): The request object. The `CreateService` request. parent (:class:`str`): Required. Resource @@ -269,17 +271,17 @@ async def create_service( async def get_service( self, - request: service_service.GetServiceRequest = None, + request: Union[service_service.GetServiceRequest, dict] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> service.Service: r"""Get the named ``Service``. Args: - request (:class:`google.cloud.monitoring_v3.types.GetServiceRequest`): + request (Union[google.cloud.monitoring_v3.types.GetServiceRequest, dict]): The request object. The `GetService` request. name (:class:`str`): Required. Resource name of the ``Service``. The format @@ -356,17 +358,17 @@ async def get_service( async def list_services( self, - request: service_service.ListServicesRequest = None, + request: Union[service_service.ListServicesRequest, dict] = None, *, parent: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> pagers.ListServicesAsyncPager: r"""List ``Service``\ s for this workspace. Args: - request (:class:`google.cloud.monitoring_v3.types.ListServicesRequest`): + request (Union[google.cloud.monitoring_v3.types.ListServicesRequest, dict]): The request object. The `ListServices` request. parent (:class:`str`): Required. Resource name of the parent containing the @@ -450,17 +452,17 @@ async def list_services( async def update_service( self, - request: service_service.UpdateServiceRequest = None, + request: Union[service_service.UpdateServiceRequest, dict] = None, *, service: gm_service.Service = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> gm_service.Service: r"""Update this ``Service``. Args: - request (:class:`google.cloud.monitoring_v3.types.UpdateServiceRequest`): + request (Union[google.cloud.monitoring_v3.types.UpdateServiceRequest, dict]): The request object. The `UpdateService` request. service (:class:`google.cloud.monitoring_v3.types.Service`): Required. The ``Service`` to draw updates from. The @@ -526,17 +528,17 @@ async def update_service( async def delete_service( self, - request: service_service.DeleteServiceRequest = None, + request: Union[service_service.DeleteServiceRequest, dict] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> None: r"""Soft delete this ``Service``. Args: - request (:class:`google.cloud.monitoring_v3.types.DeleteServiceRequest`): + request (Union[google.cloud.monitoring_v3.types.DeleteServiceRequest, dict]): The request object. The `DeleteService` request. name (:class:`str`): Required. Resource name of the ``Service`` to delete. @@ -602,18 +604,18 @@ async def delete_service( async def create_service_level_objective( self, - request: service_service.CreateServiceLevelObjectiveRequest = None, + request: Union[service_service.CreateServiceLevelObjectiveRequest, dict] = None, *, parent: str = None, service_level_objective: service.ServiceLevelObjective = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> service.ServiceLevelObjective: r"""Create a ``ServiceLevelObjective`` for the given ``Service``. Args: - request (:class:`google.cloud.monitoring_v3.types.CreateServiceLevelObjectiveRequest`): + request (Union[google.cloud.monitoring_v3.types.CreateServiceLevelObjectiveRequest, dict]): The request object. The `CreateServiceLevelObjective` request. parent (:class:`str`): @@ -699,17 +701,17 @@ async def create_service_level_objective( async def get_service_level_objective( self, - request: service_service.GetServiceLevelObjectiveRequest = None, + request: Union[service_service.GetServiceLevelObjectiveRequest, dict] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> service.ServiceLevelObjective: r"""Get a ``ServiceLevelObjective`` by name. Args: - request (:class:`google.cloud.monitoring_v3.types.GetServiceLevelObjectiveRequest`): + request (Union[google.cloud.monitoring_v3.types.GetServiceLevelObjectiveRequest, dict]): The request object. The `GetServiceLevelObjective` request. name (:class:`str`): @@ -794,17 +796,17 @@ async def get_service_level_objective( async def list_service_level_objectives( self, - request: service_service.ListServiceLevelObjectivesRequest = None, + request: Union[service_service.ListServiceLevelObjectivesRequest, dict] = None, *, parent: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> pagers.ListServiceLevelObjectivesAsyncPager: r"""List the ``ServiceLevelObjective``\ s for the given ``Service``. Args: - request (:class:`google.cloud.monitoring_v3.types.ListServiceLevelObjectivesRequest`): + request (Union[google.cloud.monitoring_v3.types.ListServiceLevelObjectivesRequest, dict]): The request object. The `ListServiceLevelObjectives` request. parent (:class:`str`): @@ -888,17 +890,17 @@ async def list_service_level_objectives( async def update_service_level_objective( self, - request: service_service.UpdateServiceLevelObjectiveRequest = None, + request: Union[service_service.UpdateServiceLevelObjectiveRequest, dict] = None, *, service_level_objective: service.ServiceLevelObjective = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> service.ServiceLevelObjective: r"""Update the given ``ServiceLevelObjective``. Args: - request (:class:`google.cloud.monitoring_v3.types.UpdateServiceLevelObjectiveRequest`): + request (Union[google.cloud.monitoring_v3.types.UpdateServiceLevelObjectiveRequest, dict]): The request object. The `UpdateServiceLevelObjective` request. service_level_objective (:class:`google.cloud.monitoring_v3.types.ServiceLevelObjective`): @@ -978,17 +980,17 @@ async def update_service_level_objective( async def delete_service_level_objective( self, - request: service_service.DeleteServiceLevelObjectiveRequest = None, + request: Union[service_service.DeleteServiceLevelObjectiveRequest, dict] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> None: r"""Delete the given ``ServiceLevelObjective``. Args: - request (:class:`google.cloud.monitoring_v3.types.DeleteServiceLevelObjectiveRequest`): + request (Union[google.cloud.monitoring_v3.types.DeleteServiceLevelObjectiveRequest, dict]): The request object. The `DeleteServiceLevelObjective` request. name (:class:`str`): diff --git a/google/cloud/monitoring_v3/services/service_monitoring_service/client.py b/google/cloud/monitoring_v3/services/service_monitoring_service/client.py index bd847d42..2bfba9b0 100644 --- a/google/cloud/monitoring_v3/services/service_monitoring_service/client.py +++ b/google/cloud/monitoring_v3/services/service_monitoring_service/client.py @@ -30,6 +30,8 @@ from google.auth.exceptions import MutualTLSChannelError # type: ignore from google.oauth2 import service_account # type: ignore +OptionalRetry = Union[retries.Retry, object] + from google.cloud.monitoring_v3.services.service_monitoring_service import pagers from google.cloud.monitoring_v3.types import service from google.cloud.monitoring_v3.types import service as gm_service @@ -380,7 +382,7 @@ def create_service( *, parent: str = None, service: gm_service.Service = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> gm_service.Service: @@ -466,7 +468,7 @@ def get_service( request: Union[service_service.GetServiceRequest, dict] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> service.Service: @@ -544,7 +546,7 @@ def list_services( request: Union[service_service.ListServicesRequest, dict] = None, *, parent: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> pagers.ListServicesPager: @@ -629,7 +631,7 @@ def update_service( request: Union[service_service.UpdateServiceRequest, dict] = None, *, service: gm_service.Service = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> gm_service.Service: @@ -705,7 +707,7 @@ def delete_service( request: Union[service_service.DeleteServiceRequest, dict] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> None: @@ -773,7 +775,7 @@ def create_service_level_objective( *, parent: str = None, service_level_objective: service.ServiceLevelObjective = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> service.ServiceLevelObjective: @@ -871,7 +873,7 @@ def get_service_level_objective( request: Union[service_service.GetServiceLevelObjectiveRequest, dict] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> service.ServiceLevelObjective: @@ -959,7 +961,7 @@ def list_service_level_objectives( request: Union[service_service.ListServiceLevelObjectivesRequest, dict] = None, *, parent: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> pagers.ListServiceLevelObjectivesPager: @@ -1046,7 +1048,7 @@ def update_service_level_objective( request: Union[service_service.UpdateServiceLevelObjectiveRequest, dict] = None, *, service_level_objective: service.ServiceLevelObjective = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> service.ServiceLevelObjective: @@ -1138,7 +1140,7 @@ def delete_service_level_objective( request: Union[service_service.DeleteServiceLevelObjectiveRequest, dict] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> None: diff --git a/google/cloud/monitoring_v3/services/service_monitoring_service/transports/base.py b/google/cloud/monitoring_v3/services/service_monitoring_service/transports/base.py index 60f5d9a9..73af99b4 100644 --- a/google/cloud/monitoring_v3/services/service_monitoring_service/transports/base.py +++ b/google/cloud/monitoring_v3/services/service_monitoring_service/transports/base.py @@ -15,7 +15,6 @@ # import abc from typing import Awaitable, Callable, Dict, Optional, Sequence, Union -import packaging.version import pkg_resources import google.auth # type: ignore @@ -40,15 +39,6 @@ except pkg_resources.DistributionNotFound: DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo() -try: - # google.auth.__version__ was added in 1.26.0 - _GOOGLE_AUTH_VERSION = google.auth.__version__ -except AttributeError: - try: # try pkg_resources if it is available - _GOOGLE_AUTH_VERSION = pkg_resources.get_distribution("google-auth").version - except pkg_resources.DistributionNotFound: # pragma: NO COVER - _GOOGLE_AUTH_VERSION = None - class ServiceMonitoringServiceTransport(abc.ABC): """Abstract transport class for ServiceMonitoringService.""" @@ -102,7 +92,7 @@ def __init__( host += ":443" self._host = host - scopes_kwargs = self._get_scopes_kwargs(self._host, scopes) + scopes_kwargs = {"scopes": scopes, "default_scopes": self.AUTH_SCOPES} # Save the scopes. self._scopes = scopes @@ -135,29 +125,6 @@ def __init__( # Save the credentials. self._credentials = credentials - # TODO(busunkim): This method is in the base transport - # to avoid duplicating code across the transport classes. These functions - # should be deleted once the minimum required versions of google-auth is increased. - - # TODO: Remove this function once google-auth >= 1.25.0 is required - @classmethod - def _get_scopes_kwargs( - cls, host: str, scopes: Optional[Sequence[str]] - ) -> Dict[str, Optional[Sequence[str]]]: - """Returns scopes kwargs to pass to google-auth methods depending on the google-auth version""" - - scopes_kwargs = {} - - if _GOOGLE_AUTH_VERSION and ( - packaging.version.parse(_GOOGLE_AUTH_VERSION) - >= packaging.version.parse("1.25.0") - ): - scopes_kwargs = {"scopes": scopes, "default_scopes": cls.AUTH_SCOPES} - else: - scopes_kwargs = {"scopes": scopes or cls.AUTH_SCOPES} - - return scopes_kwargs - def _prep_wrapped_messages(self, client_info): # Precompute the wrapped methods. self._wrapped_methods = { diff --git a/google/cloud/monitoring_v3/services/service_monitoring_service/transports/grpc_asyncio.py b/google/cloud/monitoring_v3/services/service_monitoring_service/transports/grpc_asyncio.py index 0dad4f05..a94fe830 100644 --- a/google/cloud/monitoring_v3/services/service_monitoring_service/transports/grpc_asyncio.py +++ b/google/cloud/monitoring_v3/services/service_monitoring_service/transports/grpc_asyncio.py @@ -20,7 +20,6 @@ from google.api_core import grpc_helpers_async # type: ignore from google.auth import credentials as ga_credentials # type: ignore from google.auth.transport.grpc import SslCredentials # type: ignore -import packaging.version import grpc # type: ignore from grpc.experimental import aio # type: ignore diff --git a/google/cloud/monitoring_v3/services/uptime_check_service/async_client.py b/google/cloud/monitoring_v3/services/uptime_check_service/async_client.py index 8e27a15d..9e22e6b1 100644 --- a/google/cloud/monitoring_v3/services/uptime_check_service/async_client.py +++ b/google/cloud/monitoring_v3/services/uptime_check_service/async_client.py @@ -19,13 +19,15 @@ from typing import Dict, Sequence, Tuple, Type, Union import pkg_resources -import google.api_core.client_options as ClientOptions # type: ignore +from google.api_core.client_options import ClientOptions # type: ignore from google.api_core import exceptions as core_exceptions # type: ignore from google.api_core import gapic_v1 # type: ignore from google.api_core import retry as retries # type: ignore from google.auth import credentials as ga_credentials # type: ignore from google.oauth2 import service_account # type: ignore +OptionalRetry = Union[retries.Retry, object] + from google.api import monitored_resource_pb2 # type: ignore from google.cloud.monitoring_v3.services.uptime_check_service import pagers from google.cloud.monitoring_v3.types import uptime @@ -179,10 +181,10 @@ def __init__( async def list_uptime_check_configs( self, - request: uptime_service.ListUptimeCheckConfigsRequest = None, + request: Union[uptime_service.ListUptimeCheckConfigsRequest, dict] = None, *, parent: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> pagers.ListUptimeCheckConfigsAsyncPager: @@ -191,7 +193,7 @@ async def list_uptime_check_configs( configurations). Args: - request (:class:`google.cloud.monitoring_v3.types.ListUptimeCheckConfigsRequest`): + request (Union[google.cloud.monitoring_v3.types.ListUptimeCheckConfigsRequest, dict]): The request object. The protocol for the `ListUptimeCheckConfigs` request. parent (:class:`str`): @@ -275,17 +277,17 @@ async def list_uptime_check_configs( async def get_uptime_check_config( self, - request: uptime_service.GetUptimeCheckConfigRequest = None, + request: Union[uptime_service.GetUptimeCheckConfigRequest, dict] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> uptime.UptimeCheckConfig: r"""Gets a single Uptime check configuration. Args: - request (:class:`google.cloud.monitoring_v3.types.GetUptimeCheckConfigRequest`): + request (Union[google.cloud.monitoring_v3.types.GetUptimeCheckConfigRequest, dict]): The request object. The protocol for the `GetUptimeCheckConfig` request. name (:class:`str`): @@ -360,18 +362,18 @@ async def get_uptime_check_config( async def create_uptime_check_config( self, - request: uptime_service.CreateUptimeCheckConfigRequest = None, + request: Union[uptime_service.CreateUptimeCheckConfigRequest, dict] = None, *, parent: str = None, uptime_check_config: uptime.UptimeCheckConfig = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> uptime.UptimeCheckConfig: r"""Creates a new Uptime check configuration. Args: - request (:class:`google.cloud.monitoring_v3.types.CreateUptimeCheckConfigRequest`): + request (Union[google.cloud.monitoring_v3.types.CreateUptimeCheckConfigRequest, dict]): The request object. The protocol for the `CreateUptimeCheckConfig` request. parent (:class:`str`): @@ -447,10 +449,10 @@ async def create_uptime_check_config( async def update_uptime_check_config( self, - request: uptime_service.UpdateUptimeCheckConfigRequest = None, + request: Union[uptime_service.UpdateUptimeCheckConfigRequest, dict] = None, *, uptime_check_config: uptime.UptimeCheckConfig = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> uptime.UptimeCheckConfig: @@ -461,7 +463,7 @@ async def update_uptime_check_config( configuration. Args: - request (:class:`google.cloud.monitoring_v3.types.UpdateUptimeCheckConfigRequest`): + request (Union[google.cloud.monitoring_v3.types.UpdateUptimeCheckConfigRequest, dict]): The request object. The protocol for the `UpdateUptimeCheckConfig` request. uptime_check_config (:class:`google.cloud.monitoring_v3.types.UptimeCheckConfig`): @@ -536,10 +538,10 @@ async def update_uptime_check_config( async def delete_uptime_check_config( self, - request: uptime_service.DeleteUptimeCheckConfigRequest = None, + request: Union[uptime_service.DeleteUptimeCheckConfigRequest, dict] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> None: @@ -549,7 +551,7 @@ async def delete_uptime_check_config( that would be rendered invalid by the deletion. Args: - request (:class:`google.cloud.monitoring_v3.types.DeleteUptimeCheckConfigRequest`): + request (Union[google.cloud.monitoring_v3.types.DeleteUptimeCheckConfigRequest, dict]): The request object. The protocol for the `DeleteUptimeCheckConfig` request. name (:class:`str`): @@ -616,9 +618,9 @@ async def delete_uptime_check_config( async def list_uptime_check_ips( self, - request: uptime_service.ListUptimeCheckIpsRequest = None, + request: Union[uptime_service.ListUptimeCheckIpsRequest, dict] = None, *, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> pagers.ListUptimeCheckIpsAsyncPager: @@ -626,7 +628,7 @@ async def list_uptime_check_ips( from Args: - request (:class:`google.cloud.monitoring_v3.types.ListUptimeCheckIpsRequest`): + request (Union[google.cloud.monitoring_v3.types.ListUptimeCheckIpsRequest, dict]): The request object. The protocol for the `ListUptimeCheckIps` request. retry (google.api_core.retry.Retry): Designation of what errors, if any, diff --git a/google/cloud/monitoring_v3/services/uptime_check_service/client.py b/google/cloud/monitoring_v3/services/uptime_check_service/client.py index 9254ffb7..96dfd2d1 100644 --- a/google/cloud/monitoring_v3/services/uptime_check_service/client.py +++ b/google/cloud/monitoring_v3/services/uptime_check_service/client.py @@ -30,6 +30,8 @@ from google.auth.exceptions import MutualTLSChannelError # type: ignore from google.oauth2 import service_account # type: ignore +OptionalRetry = Union[retries.Retry, object] + from google.api import monitored_resource_pb2 # type: ignore from google.cloud.monitoring_v3.services.uptime_check_service import pagers from google.cloud.monitoring_v3.types import uptime @@ -365,7 +367,7 @@ def list_uptime_check_configs( request: Union[uptime_service.ListUptimeCheckConfigsRequest, dict] = None, *, parent: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> pagers.ListUptimeCheckConfigsPager: @@ -454,7 +456,7 @@ def get_uptime_check_config( request: Union[uptime_service.GetUptimeCheckConfigRequest, dict] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> uptime.UptimeCheckConfig: @@ -531,7 +533,7 @@ def create_uptime_check_config( *, parent: str = None, uptime_check_config: uptime.UptimeCheckConfig = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> uptime.UptimeCheckConfig: @@ -619,7 +621,7 @@ def update_uptime_check_config( request: Union[uptime_service.UpdateUptimeCheckConfigRequest, dict] = None, *, uptime_check_config: uptime.UptimeCheckConfig = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> uptime.UptimeCheckConfig: @@ -710,7 +712,7 @@ def delete_uptime_check_config( request: Union[uptime_service.DeleteUptimeCheckConfigRequest, dict] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> None: @@ -782,7 +784,7 @@ def list_uptime_check_ips( self, request: Union[uptime_service.ListUptimeCheckIpsRequest, dict] = None, *, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> pagers.ListUptimeCheckIpsPager: diff --git a/google/cloud/monitoring_v3/services/uptime_check_service/transports/base.py b/google/cloud/monitoring_v3/services/uptime_check_service/transports/base.py index feff8e21..7823fa50 100644 --- a/google/cloud/monitoring_v3/services/uptime_check_service/transports/base.py +++ b/google/cloud/monitoring_v3/services/uptime_check_service/transports/base.py @@ -15,7 +15,6 @@ # import abc from typing import Awaitable, Callable, Dict, Optional, Sequence, Union -import packaging.version import pkg_resources import google.auth # type: ignore @@ -39,15 +38,6 @@ except pkg_resources.DistributionNotFound: DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo() -try: - # google.auth.__version__ was added in 1.26.0 - _GOOGLE_AUTH_VERSION = google.auth.__version__ -except AttributeError: - try: # try pkg_resources if it is available - _GOOGLE_AUTH_VERSION = pkg_resources.get_distribution("google-auth").version - except pkg_resources.DistributionNotFound: # pragma: NO COVER - _GOOGLE_AUTH_VERSION = None - class UptimeCheckServiceTransport(abc.ABC): """Abstract transport class for UptimeCheckService.""" @@ -101,7 +91,7 @@ def __init__( host += ":443" self._host = host - scopes_kwargs = self._get_scopes_kwargs(self._host, scopes) + scopes_kwargs = {"scopes": scopes, "default_scopes": self.AUTH_SCOPES} # Save the scopes. self._scopes = scopes @@ -134,29 +124,6 @@ def __init__( # Save the credentials. self._credentials = credentials - # TODO(busunkim): This method is in the base transport - # to avoid duplicating code across the transport classes. These functions - # should be deleted once the minimum required versions of google-auth is increased. - - # TODO: Remove this function once google-auth >= 1.25.0 is required - @classmethod - def _get_scopes_kwargs( - cls, host: str, scopes: Optional[Sequence[str]] - ) -> Dict[str, Optional[Sequence[str]]]: - """Returns scopes kwargs to pass to google-auth methods depending on the google-auth version""" - - scopes_kwargs = {} - - if _GOOGLE_AUTH_VERSION and ( - packaging.version.parse(_GOOGLE_AUTH_VERSION) - >= packaging.version.parse("1.25.0") - ): - scopes_kwargs = {"scopes": scopes, "default_scopes": cls.AUTH_SCOPES} - else: - scopes_kwargs = {"scopes": scopes or cls.AUTH_SCOPES} - - return scopes_kwargs - def _prep_wrapped_messages(self, client_info): # Precompute the wrapped methods. self._wrapped_methods = { diff --git a/google/cloud/monitoring_v3/services/uptime_check_service/transports/grpc_asyncio.py b/google/cloud/monitoring_v3/services/uptime_check_service/transports/grpc_asyncio.py index 239437a8..fa2b0ae6 100644 --- a/google/cloud/monitoring_v3/services/uptime_check_service/transports/grpc_asyncio.py +++ b/google/cloud/monitoring_v3/services/uptime_check_service/transports/grpc_asyncio.py @@ -20,7 +20,6 @@ from google.api_core import grpc_helpers_async # type: ignore from google.auth import credentials as ga_credentials # type: ignore from google.auth.transport.grpc import SslCredentials # type: ignore -import packaging.version import grpc # type: ignore from grpc.experimental import aio # type: ignore diff --git a/google/cloud/monitoring_v3/types/alert.py b/google/cloud/monitoring_v3/types/alert.py index 0d04d385..79b4055b 100644 --- a/google/cloud/monitoring_v3/types/alert.py +++ b/google/cloud/monitoring_v3/types/alert.py @@ -157,6 +157,13 @@ class Condition(proto.Message): alerting policy should open an incident. If a condition evaluates to true, it signifies that something is wrong. + This message has `oneof`_ fields (mutually exclusive fields). + For each oneof, at most one member field can be set at the same time. + Setting any member of the oneof automatically clears all other + members. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + Attributes: name (str): Required if the condition exists. The unique resource name @@ -197,30 +204,43 @@ class Condition(proto.Message): condition_threshold (google.cloud.monitoring_v3.types.AlertPolicy.Condition.MetricThreshold): A condition that compares a time series against a threshold. + This field is a member of `oneof`_ ``condition``. condition_absent (google.cloud.monitoring_v3.types.AlertPolicy.Condition.MetricAbsence): A condition that checks that a time series continues to receive new data points. + This field is a member of `oneof`_ ``condition``. condition_matched_log (google.cloud.monitoring_v3.types.AlertPolicy.Condition.LogMatch): A condition that checks for log messages matching given constraints. If set, no other conditions can be present. + This field is a member of `oneof`_ ``condition``. condition_monitoring_query_language (google.cloud.monitoring_v3.types.AlertPolicy.Condition.MonitoringQueryLanguageCondition): A condition that uses the Monitoring Query Language to define alerts. + This field is a member of `oneof`_ ``condition``. """ class Trigger(proto.Message): r"""Specifies how many time series must fail a predicate to trigger a condition. If not specified, then a ``{count: 1}`` trigger is used. + This message has `oneof`_ fields (mutually exclusive fields). + For each oneof, at most one member field can be set at the same time. + Setting any member of the oneof automatically clears all other + members. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + Attributes: count (int): The absolute number of time series that must fail the predicate for the condition to be triggered. + This field is a member of `oneof`_ ``type``. percent (float): The percentage of time series that must fail the predicate for the condition to be triggered. + This field is a member of `oneof`_ ``type``. """ count = proto.Field(proto.INT32, number=1, oneof="type",) diff --git a/google/cloud/monitoring_v3/types/common.py b/google/cloud/monitoring_v3/types/common.py index b9fa83f0..0a7ca699 100644 --- a/google/cloud/monitoring_v3/types/common.py +++ b/google/cloud/monitoring_v3/types/common.py @@ -59,21 +59,33 @@ class ServiceTier(proto.Enum): class TypedValue(proto.Message): r"""A single strongly-typed value. + This message has `oneof`_ fields (mutually exclusive fields). + For each oneof, at most one member field can be set at the same time. + Setting any member of the oneof automatically clears all other + members. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + Attributes: bool_value (bool): A Boolean value: ``true`` or ``false``. + This field is a member of `oneof`_ ``value``. int64_value (int): A 64-bit integer. Its range is approximately ±9.2x1018. + This field is a member of `oneof`_ ``value``. double_value (float): A 64-bit double-precision floating-point number. Its magnitude is approximately ±10±300 and it has 16 significant digits of precision. + This field is a member of `oneof`_ ``value``. string_value (str): A variable-length string value. + This field is a member of `oneof`_ ``value``. distribution_value (google.api.distribution_pb2.Distribution): A distribution value. + This field is a member of `oneof`_ ``value``. """ bool_value = proto.Field(proto.BOOL, number=1, oneof="value",) diff --git a/google/cloud/monitoring_v3/types/group_service.py b/google/cloud/monitoring_v3/types/group_service.py index 12f02f09..522f80ff 100644 --- a/google/cloud/monitoring_v3/types/group_service.py +++ b/google/cloud/monitoring_v3/types/group_service.py @@ -38,6 +38,13 @@ class ListGroupsRequest(proto.Message): r"""The ``ListGroup`` request. + This message has `oneof`_ fields (mutually exclusive fields). + For each oneof, at most one member field can be set at the same time. + Setting any member of the oneof automatically clears all other + members. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + Attributes: name (str): Required. The @@ -57,6 +64,7 @@ class ListGroupsRequest(proto.Message): Returns groups whose ``parent_name`` field contains the group name. If no groups have this parent, the results are empty. + This field is a member of `oneof`_ ``filter``. ancestors_of_group (str): A group name. The format is: @@ -69,6 +77,7 @@ class ListGroupsRequest(proto.Message): immediate parent and ending with the most distant ancestor. If the specified group has no immediate parent, the results are empty. + This field is a member of `oneof`_ ``filter``. descendants_of_group (str): A group name. The format is: @@ -80,6 +89,7 @@ class ListGroupsRequest(proto.Message): superset of the results returned by the ``children_of_group`` filter, and includes children-of-children, and so forth. + This field is a member of `oneof`_ ``filter``. page_size (int): A positive number that is the maximum number of results to return. diff --git a/google/cloud/monitoring_v3/types/metric.py b/google/cloud/monitoring_v3/types/metric.py index 0f55ffd8..77be0c5b 100644 --- a/google/cloud/monitoring_v3/types/metric.py +++ b/google/cloud/monitoring_v3/types/metric.py @@ -225,13 +225,23 @@ class PointData(proto.Message): class LabelValue(proto.Message): r"""A label value. + This message has `oneof`_ fields (mutually exclusive fields). + For each oneof, at most one member field can be set at the same time. + Setting any member of the oneof automatically clears all other + members. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + Attributes: bool_value (bool): A bool label value. + This field is a member of `oneof`_ ``value``. int64_value (int): An int64 label value. + This field is a member of `oneof`_ ``value``. string_value (str): A string label value. + This field is a member of `oneof`_ ``value``. """ bool_value = proto.Field(proto.BOOL, number=1, oneof="value",) diff --git a/google/cloud/monitoring_v3/types/service.py b/google/cloud/monitoring_v3/types/service.py index 1e3a4c8b..8ec081e3 100644 --- a/google/cloud/monitoring_v3/types/service.py +++ b/google/cloud/monitoring_v3/types/service.py @@ -42,6 +42,13 @@ class Service(proto.Message): In Cloud Monitoring, a ``Service`` acts as the root resource under which operational aspects of the service are accessible. + This message has `oneof`_ fields (mutually exclusive fields). + For each oneof, at most one member field can be set at the same time. + Setting any member of the oneof automatically clears all other + members. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + Attributes: name (str): Resource name for this Service. The format is: @@ -54,20 +61,26 @@ class Service(proto.Message): Service. custom (google.cloud.monitoring_v3.types.Service.Custom): Custom service type. + This field is a member of `oneof`_ ``identifier``. app_engine (google.cloud.monitoring_v3.types.Service.AppEngine): Type used for App Engine services. + This field is a member of `oneof`_ ``identifier``. cloud_endpoints (google.cloud.monitoring_v3.types.Service.CloudEndpoints): Type used for Cloud Endpoints services. + This field is a member of `oneof`_ ``identifier``. cluster_istio (google.cloud.monitoring_v3.types.Service.ClusterIstio): Type used for Istio services that live in a Kubernetes cluster. + This field is a member of `oneof`_ ``identifier``. mesh_istio (google.cloud.monitoring_v3.types.Service.MeshIstio): Type used for Istio services scoped to an Istio mesh. + This field is a member of `oneof`_ ``identifier``. istio_canonical_service (google.cloud.monitoring_v3.types.Service.IstioCanonicalService): Type used for canonical services scoped to an Istio mesh. Metrics for Istio are `documented here `__ + This field is a member of `oneof`_ ``identifier``. telemetry (google.cloud.monitoring_v3.types.Service.Telemetry): Configuration for how to query telemetry on a Service. @@ -243,6 +256,13 @@ class ServiceLevelObjective(proto.Message): milliseconds" or "99.5% of requests in each calendar month return successfully." + This message has `oneof`_ fields (mutually exclusive fields). + For each oneof, at most one member field can be set at the same time. + Setting any member of the oneof automatically clears all other + members. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + Attributes: name (str): Resource name for this ``ServiceLevelObjective``. The format @@ -264,10 +284,12 @@ class ServiceLevelObjective(proto.Message): A rolling time period, semantically "in the past ````". Must be an integer multiple of 1 day no larger than 30 days. + This field is a member of `oneof`_ ``period``. calendar_period (google.type.calendar_period_pb2.CalendarPeriod): A calendar period, semantically "since the start of the current ````". At this time, only ``DAY``, ``WEEK``, ``FORTNIGHT``, and ``MONTH`` are supported. + This field is a member of `oneof`_ ``period``. user_labels (Sequence[google.cloud.monitoring_v3.types.ServiceLevelObjective.UserLabelsEntry]): Labels which have been used to annotate the service-level objective. Label keys must start @@ -323,13 +345,23 @@ class ServiceLevelIndicator(proto.Message): quality, such as fraction of successful queries or fast-enough queries. + This message has `oneof`_ fields (mutually exclusive fields). + For each oneof, at most one member field can be set at the same time. + Setting any member of the oneof automatically clears all other + members. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + Attributes: basic_sli (google.cloud.monitoring_v3.types.BasicSli): Basic SLI on a well-known service type. + This field is a member of `oneof`_ ``type``. request_based (google.cloud.monitoring_v3.types.RequestBasedSli): Request-based SLIs + This field is a member of `oneof`_ ``type``. windows_based (google.cloud.monitoring_v3.types.WindowsBasedSli): Windows-based SLIs + This field is a member of `oneof`_ ``type``. """ basic_sli = proto.Field(proto.MESSAGE, number=4, oneof="type", message="BasicSli",) @@ -349,6 +381,13 @@ class BasicSli(proto.Message): to construct a monitoring filter to filter that metric down to just the data relevant to this service. + This message has `oneof`_ fields (mutually exclusive fields). + For each oneof, at most one member field can be set at the same time. + Setting any member of the oneof automatically clears all other + members. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + Attributes: method (Sequence[str]): OPTIONAL: The set of RPCs to which this SLI @@ -379,10 +418,12 @@ class BasicSli(proto.Message): Good service is defined to be the count of requests made to this service that return successfully. + This field is a member of `oneof`_ ``sli_criteria``. latency (google.cloud.monitoring_v3.types.BasicSli.LatencyCriteria): Good service is defined to be the count of requests made to this service that are fast enough with respect to ``latency.threshold``. + This field is a member of `oneof`_ ``sli_criteria``. """ class AvailabilityCriteria(proto.Message): @@ -429,16 +470,25 @@ class RequestBasedSli(proto.Message): r"""Service Level Indicators for which atomic units of service are counted directly. + This message has `oneof`_ fields (mutually exclusive fields). + For each oneof, at most one member field can be set at the same time. + Setting any member of the oneof automatically clears all other + members. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + Attributes: good_total_ratio (google.cloud.monitoring_v3.types.TimeSeriesRatio): ``good_total_ratio`` is used when the ratio of ``good_service`` to ``total_service`` is computed from two ``TimeSeries``. + This field is a member of `oneof`_ ``method``. distribution_cut (google.cloud.monitoring_v3.types.DistributionCut): ``distribution_cut`` is used when ``good_service`` is a count of values aggregated in a ``Distribution`` that fall into a good range. The ``total_service`` is the total count of all values aggregated in the ``Distribution``. + This field is a member of `oneof`_ ``method``. """ good_total_ratio = proto.Field( @@ -518,20 +568,31 @@ class WindowsBasedSli(proto.Message): for determining if service was good are embedded in the ``window_criterion``. + This message has `oneof`_ fields (mutually exclusive fields). + For each oneof, at most one member field can be set at the same time. + Setting any member of the oneof automatically clears all other + members. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + Attributes: good_bad_metric_filter (str): A `monitoring filter `__ specifying a ``TimeSeries`` with ``ValueType = BOOL``. The window is good if any ``true`` values appear in the window. + This field is a member of `oneof`_ ``window_criterion``. good_total_ratio_threshold (google.cloud.monitoring_v3.types.WindowsBasedSli.PerformanceThreshold): A window is good if its ``performance`` is high enough. + This field is a member of `oneof`_ ``window_criterion``. metric_mean_in_range (google.cloud.monitoring_v3.types.WindowsBasedSli.MetricRange): A window is good if the metric's value is in a good range, averaged across returned streams. + This field is a member of `oneof`_ ``window_criterion``. metric_sum_in_range (google.cloud.monitoring_v3.types.WindowsBasedSli.MetricRange): A window is good if the metric's value is in a good range, summed across returned streams. + This field is a member of `oneof`_ ``window_criterion``. window_period (google.protobuf.duration_pb2.Duration): Duration over which window quality is evaluated. Must be an integer fraction of a day and at least ``60s``. @@ -541,11 +602,20 @@ class PerformanceThreshold(proto.Message): r"""A ``PerformanceThreshold`` is used when each window is good when that window has a sufficiently high ``performance``. + This message has `oneof`_ fields (mutually exclusive fields). + For each oneof, at most one member field can be set at the same time. + Setting any member of the oneof automatically clears all other + members. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + Attributes: performance (google.cloud.monitoring_v3.types.RequestBasedSli): ``RequestBasedSli`` to evaluate to judge window quality. + This field is a member of `oneof`_ ``type``. basic_sli_performance (google.cloud.monitoring_v3.types.BasicSli): ``BasicSli`` to evaluate to judge window quality. + This field is a member of `oneof`_ ``type``. threshold (float): If window ``performance >= threshold``, the window is counted as good. diff --git a/google/cloud/monitoring_v3/types/uptime.py b/google/cloud/monitoring_v3/types/uptime.py index c1ed613e..3ce7e87f 100644 --- a/google/cloud/monitoring_v3/types/uptime.py +++ b/google/cloud/monitoring_v3/types/uptime.py @@ -109,6 +109,13 @@ class UptimeCheckConfig(proto.Message): r"""This message configures which resources and services to monitor for availability. + This message has `oneof`_ fields (mutually exclusive fields). + For each oneof, at most one member field can be set at the same time. + Setting any member of the oneof automatically clears all other + members. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + Attributes: name (str): A unique resource name for this Uptime check configuration. @@ -137,15 +144,19 @@ class UptimeCheckConfig(proto.Message): resource types are valid for this field: ``uptime_url``, ``gce_instance``, ``gae_app``, ``aws_ec2_instance``, ``aws_elb_load_balancer`` ``k8s_service`` + This field is a member of `oneof`_ ``resource``. resource_group (google.cloud.monitoring_v3.types.UptimeCheckConfig.ResourceGroup): The group resource associated with the configuration. + This field is a member of `oneof`_ ``resource``. http_check (google.cloud.monitoring_v3.types.UptimeCheckConfig.HttpCheck): Contains information needed to make an HTTP or HTTPS check. + This field is a member of `oneof`_ ``check_request_type``. tcp_check (google.cloud.monitoring_v3.types.UptimeCheckConfig.TcpCheck): Contains information needed to make a TCP check. + This field is a member of `oneof`_ ``check_request_type``. period (google.protobuf.duration_pb2.Duration): How often, in seconds, the Uptime check is performed. Currently, the only supported values are ``60s`` (1 minute), diff --git a/monitoring-v3-py.tar.gz b/monitoring-v3-py.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..bb98aea59c7df17141fb1922115bf8d388b8f8f4 GIT binary patch literal 180224 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's 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

7hTQm}rZ+SB9nqdN>klC1#DA(meY5DGh)4 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

cp^FpAu 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

^Wz_U-Y3cC`Pp|3|I|0C}GY;xS>4Z8LtN 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 z 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.x.x # Until this issue is closed # https://github.com/googleapis/google-cloud-python/issues/10566 - "google-api-core[grpc] >= 1.26.0, <3.0.0dev", + "google-api-core[grpc] >= 1.28.0, <3.0.0dev", "proto-plus >= 1.15.0", - "packaging >= 14.3", ] extras = {"pandas": "pandas >= 0.17.1"} diff --git a/testing/constraints-3.6.txt b/testing/constraints-3.6.txt index eb314df0..9d158e8c 100644 --- a/testing/constraints-3.6.txt +++ b/testing/constraints-3.6.txt @@ -2,11 +2,8 @@ # are correct in setup.py # List all library dependencies and extras in this file. # Pin the version to the lower bound. - # e.g., if setup.py has "google-cloud-foo >= 1.14.0, < 2.0.0dev", # Then this file should have google-cloud-foo==1.14.0 -google-api-core==1.26.0 +google-api-core==1.28.0 proto-plus==1.15.0 pandas==0.23.0 -packaging==14.3 -google-auth==1.24.0 # TODO: remove when google-auth>=1.25.0 is required through google-api-core diff --git a/tests/unit/gapic/monitoring_v3/test_alert_policy_service.py b/tests/unit/gapic/monitoring_v3/test_alert_policy_service.py index 87432995..46f25336 100644 --- a/tests/unit/gapic/monitoring_v3/test_alert_policy_service.py +++ b/tests/unit/gapic/monitoring_v3/test_alert_policy_service.py @@ -15,7 +15,6 @@ # import os import mock -import packaging.version import grpc from grpc.experimental import aio @@ -40,9 +39,6 @@ ) from google.cloud.monitoring_v3.services.alert_policy_service import pagers from google.cloud.monitoring_v3.services.alert_policy_service import transports -from google.cloud.monitoring_v3.services.alert_policy_service.transports.base import ( - _GOOGLE_AUTH_VERSION, -) from google.cloud.monitoring_v3.types import alert from google.cloud.monitoring_v3.types import alert_service from google.cloud.monitoring_v3.types import common @@ -57,20 +53,6 @@ import google.auth -# TODO(busunkim): Once google-auth >= 1.25.0 is required transitively -# through google-api-core: -# - Delete the auth "less than" test cases -# - Delete these pytest markers (Make the "greater than or equal to" tests the default). -requires_google_auth_lt_1_25_0 = pytest.mark.skipif( - packaging.version.parse(_GOOGLE_AUTH_VERSION) >= packaging.version.parse("1.25.0"), - reason="This test requires google-auth < 1.25.0", -) -requires_google_auth_gte_1_25_0 = pytest.mark.skipif( - packaging.version.parse(_GOOGLE_AUTH_VERSION) < packaging.version.parse("1.25.0"), - reason="This test requires google-auth >= 1.25.0", -) - - def client_cert_source_callback(): return b"cert bytes", b"key bytes" @@ -228,7 +210,7 @@ def test_alert_policy_service_client_client_options( options = client_options.ClientOptions(api_endpoint="squid.clam.whelk") with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class(client_options=options) + client = client_class(transport=transport_name, client_options=options) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -245,7 +227,7 @@ def test_alert_policy_service_client_client_options( with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class() + client = client_class(transport=transport_name) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -262,7 +244,7 @@ def test_alert_policy_service_client_client_options( with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}): with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class() + client = client_class(transport=transport_name) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -291,7 +273,7 @@ def test_alert_policy_service_client_client_options( options = client_options.ClientOptions(quota_project_id="octopus") with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class(client_options=options) + client = client_class(transport=transport_name, client_options=options) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -360,7 +342,7 @@ def test_alert_policy_service_client_mtls_env_auto( ) with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class(client_options=options) + client = client_class(transport=transport_name, client_options=options) if use_client_cert_env == "false": expected_client_cert_source = None @@ -402,7 +384,7 @@ def test_alert_policy_service_client_mtls_env_auto( expected_client_cert_source = client_cert_source_callback patched.return_value = None - client = client_class() + client = client_class(transport=transport_name) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -424,7 +406,7 @@ def test_alert_policy_service_client_mtls_env_auto( return_value=False, ): patched.return_value = None - client = client_class() + client = client_class(transport=transport_name) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -455,7 +437,7 @@ def test_alert_policy_service_client_client_options_scopes( options = client_options.ClientOptions(scopes=["1", "2"],) with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class(client_options=options) + client = client_class(transport=transport_name, client_options=options) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -486,7 +468,7 @@ def test_alert_policy_service_client_client_options_credentials_file( options = client_options.ClientOptions(credentials_file="credentials.json") with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class(client_options=options) + client = client_class(transport=transport_name, client_options=options) patched.assert_called_once_with( credentials=None, credentials_file="credentials.json", @@ -1948,7 +1930,6 @@ def test_alert_policy_service_base_transport(): transport.close() -@requires_google_auth_gte_1_25_0 def test_alert_policy_service_base_transport_with_credentials_file(): # Instantiate the base transport with a credentials file with mock.patch.object( @@ -1973,30 +1954,6 @@ def test_alert_policy_service_base_transport_with_credentials_file(): ) -@requires_google_auth_lt_1_25_0 -def test_alert_policy_service_base_transport_with_credentials_file_old_google_auth(): - # Instantiate the base transport with a credentials file - with mock.patch.object( - google.auth, "load_credentials_from_file", autospec=True - ) as load_creds, mock.patch( - "google.cloud.monitoring_v3.services.alert_policy_service.transports.AlertPolicyServiceTransport._prep_wrapped_messages" - ) as Transport: - Transport.return_value = None - load_creds.return_value = (ga_credentials.AnonymousCredentials(), None) - transport = transports.AlertPolicyServiceTransport( - credentials_file="credentials.json", quota_project_id="octopus", - ) - load_creds.assert_called_once_with( - "credentials.json", - scopes=( - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/monitoring", - "https://www.googleapis.com/auth/monitoring.read", - ), - quota_project_id="octopus", - ) - - def test_alert_policy_service_base_transport_with_adc(): # Test the default credentials are used if credentials and credentials_file are None. with mock.patch.object(google.auth, "default", autospec=True) as adc, mock.patch( @@ -2008,7 +1965,6 @@ def test_alert_policy_service_base_transport_with_adc(): adc.assert_called_once() -@requires_google_auth_gte_1_25_0 def test_alert_policy_service_auth_adc(): # If no credentials are provided, we should use ADC credentials. with mock.patch.object(google.auth, "default", autospec=True) as adc: @@ -2025,22 +1981,6 @@ def test_alert_policy_service_auth_adc(): ) -@requires_google_auth_lt_1_25_0 -def test_alert_policy_service_auth_adc_old_google_auth(): - # If no credentials are provided, we should use ADC credentials. - with mock.patch.object(google.auth, "default", autospec=True) as adc: - adc.return_value = (ga_credentials.AnonymousCredentials(), None) - AlertPolicyServiceClient() - adc.assert_called_once_with( - scopes=( - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/monitoring", - "https://www.googleapis.com/auth/monitoring.read", - ), - quota_project_id=None, - ) - - @pytest.mark.parametrize( "transport_class", [ @@ -2048,7 +1988,6 @@ def test_alert_policy_service_auth_adc_old_google_auth(): transports.AlertPolicyServiceGrpcAsyncIOTransport, ], ) -@requires_google_auth_gte_1_25_0 def test_alert_policy_service_transport_auth_adc(transport_class): # If credentials and host are not provided, the transport class should use # ADC credentials. @@ -2066,30 +2005,6 @@ def test_alert_policy_service_transport_auth_adc(transport_class): ) -@pytest.mark.parametrize( - "transport_class", - [ - transports.AlertPolicyServiceGrpcTransport, - transports.AlertPolicyServiceGrpcAsyncIOTransport, - ], -) -@requires_google_auth_lt_1_25_0 -def test_alert_policy_service_transport_auth_adc_old_google_auth(transport_class): - # If credentials and host are not provided, the transport class should use - # ADC credentials. - with mock.patch.object(google.auth, "default", autospec=True) as adc: - adc.return_value = (ga_credentials.AnonymousCredentials(), None) - transport_class(quota_project_id="octopus") - adc.assert_called_once_with( - scopes=( - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/monitoring", - "https://www.googleapis.com/auth/monitoring.read", - ), - quota_project_id="octopus", - ) - - @pytest.mark.parametrize( "transport_class,grpc_helpers", [ diff --git a/tests/unit/gapic/monitoring_v3/test_group_service.py b/tests/unit/gapic/monitoring_v3/test_group_service.py index 944ed6fc..5ea2b55e 100644 --- a/tests/unit/gapic/monitoring_v3/test_group_service.py +++ b/tests/unit/gapic/monitoring_v3/test_group_service.py @@ -15,7 +15,6 @@ # import os import mock -import packaging.version import grpc from grpc.experimental import aio @@ -37,9 +36,6 @@ from google.cloud.monitoring_v3.services.group_service import GroupServiceClient from google.cloud.monitoring_v3.services.group_service import pagers from google.cloud.monitoring_v3.services.group_service import transports -from google.cloud.monitoring_v3.services.group_service.transports.base import ( - _GOOGLE_AUTH_VERSION, -) from google.cloud.monitoring_v3.types import common from google.cloud.monitoring_v3.types import group from google.cloud.monitoring_v3.types import group as gm_group @@ -49,20 +45,6 @@ import google.auth -# TODO(busunkim): Once google-auth >= 1.25.0 is required transitively -# through google-api-core: -# - Delete the auth "less than" test cases -# - Delete these pytest markers (Make the "greater than or equal to" tests the default). -requires_google_auth_lt_1_25_0 = pytest.mark.skipif( - packaging.version.parse(_GOOGLE_AUTH_VERSION) >= packaging.version.parse("1.25.0"), - reason="This test requires google-auth < 1.25.0", -) -requires_google_auth_gte_1_25_0 = pytest.mark.skipif( - packaging.version.parse(_GOOGLE_AUTH_VERSION) < packaging.version.parse("1.25.0"), - reason="This test requires google-auth >= 1.25.0", -) - - def client_cert_source_callback(): return b"cert bytes", b"key bytes" @@ -210,7 +192,7 @@ def test_group_service_client_client_options( options = client_options.ClientOptions(api_endpoint="squid.clam.whelk") with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class(client_options=options) + client = client_class(transport=transport_name, client_options=options) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -227,7 +209,7 @@ def test_group_service_client_client_options( with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class() + client = client_class(transport=transport_name) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -244,7 +226,7 @@ def test_group_service_client_client_options( with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}): with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class() + client = client_class(transport=transport_name) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -273,7 +255,7 @@ def test_group_service_client_client_options( options = client_options.ClientOptions(quota_project_id="octopus") with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class(client_options=options) + client = client_class(transport=transport_name, client_options=options) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -330,7 +312,7 @@ def test_group_service_client_mtls_env_auto( ) with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class(client_options=options) + client = client_class(transport=transport_name, client_options=options) if use_client_cert_env == "false": expected_client_cert_source = None @@ -372,7 +354,7 @@ def test_group_service_client_mtls_env_auto( expected_client_cert_source = client_cert_source_callback patched.return_value = None - client = client_class() + client = client_class(transport=transport_name) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -394,7 +376,7 @@ def test_group_service_client_mtls_env_auto( return_value=False, ): patched.return_value = None - client = client_class() + client = client_class(transport=transport_name) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -425,7 +407,7 @@ def test_group_service_client_client_options_scopes( options = client_options.ClientOptions(scopes=["1", "2"],) with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class(client_options=options) + client = client_class(transport=transport_name, client_options=options) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -456,7 +438,7 @@ def test_group_service_client_client_options_credentials_file( options = client_options.ClientOptions(credentials_file="credentials.json") with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class(client_options=options) + client = client_class(transport=transport_name, client_options=options) patched.assert_called_once_with( credentials=None, credentials_file="credentials.json", @@ -2125,7 +2107,6 @@ def test_group_service_base_transport(): transport.close() -@requires_google_auth_gte_1_25_0 def test_group_service_base_transport_with_credentials_file(): # Instantiate the base transport with a credentials file with mock.patch.object( @@ -2150,30 +2131,6 @@ def test_group_service_base_transport_with_credentials_file(): ) -@requires_google_auth_lt_1_25_0 -def test_group_service_base_transport_with_credentials_file_old_google_auth(): - # Instantiate the base transport with a credentials file - with mock.patch.object( - google.auth, "load_credentials_from_file", autospec=True - ) as load_creds, mock.patch( - "google.cloud.monitoring_v3.services.group_service.transports.GroupServiceTransport._prep_wrapped_messages" - ) as Transport: - Transport.return_value = None - load_creds.return_value = (ga_credentials.AnonymousCredentials(), None) - transport = transports.GroupServiceTransport( - credentials_file="credentials.json", quota_project_id="octopus", - ) - load_creds.assert_called_once_with( - "credentials.json", - scopes=( - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/monitoring", - "https://www.googleapis.com/auth/monitoring.read", - ), - quota_project_id="octopus", - ) - - def test_group_service_base_transport_with_adc(): # Test the default credentials are used if credentials and credentials_file are None. with mock.patch.object(google.auth, "default", autospec=True) as adc, mock.patch( @@ -2185,7 +2142,6 @@ def test_group_service_base_transport_with_adc(): adc.assert_called_once() -@requires_google_auth_gte_1_25_0 def test_group_service_auth_adc(): # If no credentials are provided, we should use ADC credentials. with mock.patch.object(google.auth, "default", autospec=True) as adc: @@ -2202,22 +2158,6 @@ def test_group_service_auth_adc(): ) -@requires_google_auth_lt_1_25_0 -def test_group_service_auth_adc_old_google_auth(): - # If no credentials are provided, we should use ADC credentials. - with mock.patch.object(google.auth, "default", autospec=True) as adc: - adc.return_value = (ga_credentials.AnonymousCredentials(), None) - GroupServiceClient() - adc.assert_called_once_with( - scopes=( - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/monitoring", - "https://www.googleapis.com/auth/monitoring.read", - ), - quota_project_id=None, - ) - - @pytest.mark.parametrize( "transport_class", [ @@ -2225,7 +2165,6 @@ def test_group_service_auth_adc_old_google_auth(): transports.GroupServiceGrpcAsyncIOTransport, ], ) -@requires_google_auth_gte_1_25_0 def test_group_service_transport_auth_adc(transport_class): # If credentials and host are not provided, the transport class should use # ADC credentials. @@ -2243,30 +2182,6 @@ def test_group_service_transport_auth_adc(transport_class): ) -@pytest.mark.parametrize( - "transport_class", - [ - transports.GroupServiceGrpcTransport, - transports.GroupServiceGrpcAsyncIOTransport, - ], -) -@requires_google_auth_lt_1_25_0 -def test_group_service_transport_auth_adc_old_google_auth(transport_class): - # If credentials and host are not provided, the transport class should use - # ADC credentials. - with mock.patch.object(google.auth, "default", autospec=True) as adc: - adc.return_value = (ga_credentials.AnonymousCredentials(), None) - transport_class(quota_project_id="octopus") - adc.assert_called_once_with( - scopes=( - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/monitoring", - "https://www.googleapis.com/auth/monitoring.read", - ), - quota_project_id="octopus", - ) - - @pytest.mark.parametrize( "transport_class,grpc_helpers", [ diff --git a/tests/unit/gapic/monitoring_v3/test_metric_service.py b/tests/unit/gapic/monitoring_v3/test_metric_service.py index 9e0600b2..7829c83b 100644 --- a/tests/unit/gapic/monitoring_v3/test_metric_service.py +++ b/tests/unit/gapic/monitoring_v3/test_metric_service.py @@ -15,7 +15,6 @@ # import os import mock -import packaging.version import grpc from grpc.experimental import aio @@ -41,9 +40,6 @@ from google.cloud.monitoring_v3.services.metric_service import MetricServiceClient from google.cloud.monitoring_v3.services.metric_service import pagers from google.cloud.monitoring_v3.services.metric_service import transports -from google.cloud.monitoring_v3.services.metric_service.transports.base import ( - _GOOGLE_AUTH_VERSION, -) from google.cloud.monitoring_v3.types import common from google.cloud.monitoring_v3.types import metric as gm_metric from google.cloud.monitoring_v3.types import metric_service @@ -55,20 +51,6 @@ import google.auth -# TODO(busunkim): Once google-auth >= 1.25.0 is required transitively -# through google-api-core: -# - Delete the auth "less than" test cases -# - Delete these pytest markers (Make the "greater than or equal to" tests the default). -requires_google_auth_lt_1_25_0 = pytest.mark.skipif( - packaging.version.parse(_GOOGLE_AUTH_VERSION) >= packaging.version.parse("1.25.0"), - reason="This test requires google-auth < 1.25.0", -) -requires_google_auth_gte_1_25_0 = pytest.mark.skipif( - packaging.version.parse(_GOOGLE_AUTH_VERSION) < packaging.version.parse("1.25.0"), - reason="This test requires google-auth >= 1.25.0", -) - - def client_cert_source_callback(): return b"cert bytes", b"key bytes" @@ -225,7 +207,7 @@ def test_metric_service_client_client_options( options = client_options.ClientOptions(api_endpoint="squid.clam.whelk") with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class(client_options=options) + client = client_class(transport=transport_name, client_options=options) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -242,7 +224,7 @@ def test_metric_service_client_client_options( with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class() + client = client_class(transport=transport_name) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -259,7 +241,7 @@ def test_metric_service_client_client_options( with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}): with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class() + client = client_class(transport=transport_name) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -288,7 +270,7 @@ def test_metric_service_client_client_options( options = client_options.ClientOptions(quota_project_id="octopus") with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class(client_options=options) + client = client_class(transport=transport_name, client_options=options) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -347,7 +329,7 @@ def test_metric_service_client_mtls_env_auto( ) with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class(client_options=options) + client = client_class(transport=transport_name, client_options=options) if use_client_cert_env == "false": expected_client_cert_source = None @@ -389,7 +371,7 @@ def test_metric_service_client_mtls_env_auto( expected_client_cert_source = client_cert_source_callback patched.return_value = None - client = client_class() + client = client_class(transport=transport_name) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -411,7 +393,7 @@ def test_metric_service_client_mtls_env_auto( return_value=False, ): patched.return_value = None - client = client_class() + client = client_class(transport=transport_name) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -442,7 +424,7 @@ def test_metric_service_client_client_options_scopes( options = client_options.ClientOptions(scopes=["1", "2"],) with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class(client_options=options) + client = client_class(transport=transport_name, client_options=options) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -473,7 +455,7 @@ def test_metric_service_client_client_options_credentials_file( options = client_options.ClientOptions(credentials_file="credentials.json") with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class(client_options=options) + client = client_class(transport=transport_name, client_options=options) patched.assert_called_once_with( credentials=None, credentials_file="credentials.json", @@ -3219,7 +3201,6 @@ def test_metric_service_base_transport(): transport.close() -@requires_google_auth_gte_1_25_0 def test_metric_service_base_transport_with_credentials_file(): # Instantiate the base transport with a credentials file with mock.patch.object( @@ -3245,31 +3226,6 @@ def test_metric_service_base_transport_with_credentials_file(): ) -@requires_google_auth_lt_1_25_0 -def test_metric_service_base_transport_with_credentials_file_old_google_auth(): - # Instantiate the base transport with a credentials file - with mock.patch.object( - google.auth, "load_credentials_from_file", autospec=True - ) as load_creds, mock.patch( - "google.cloud.monitoring_v3.services.metric_service.transports.MetricServiceTransport._prep_wrapped_messages" - ) as Transport: - Transport.return_value = None - load_creds.return_value = (ga_credentials.AnonymousCredentials(), None) - transport = transports.MetricServiceTransport( - credentials_file="credentials.json", quota_project_id="octopus", - ) - load_creds.assert_called_once_with( - "credentials.json", - scopes=( - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/monitoring", - "https://www.googleapis.com/auth/monitoring.read", - "https://www.googleapis.com/auth/monitoring.write", - ), - quota_project_id="octopus", - ) - - def test_metric_service_base_transport_with_adc(): # Test the default credentials are used if credentials and credentials_file are None. with mock.patch.object(google.auth, "default", autospec=True) as adc, mock.patch( @@ -3281,7 +3237,6 @@ def test_metric_service_base_transport_with_adc(): adc.assert_called_once() -@requires_google_auth_gte_1_25_0 def test_metric_service_auth_adc(): # If no credentials are provided, we should use ADC credentials. with mock.patch.object(google.auth, "default", autospec=True) as adc: @@ -3299,23 +3254,6 @@ def test_metric_service_auth_adc(): ) -@requires_google_auth_lt_1_25_0 -def test_metric_service_auth_adc_old_google_auth(): - # If no credentials are provided, we should use ADC credentials. - with mock.patch.object(google.auth, "default", autospec=True) as adc: - adc.return_value = (ga_credentials.AnonymousCredentials(), None) - MetricServiceClient() - adc.assert_called_once_with( - scopes=( - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/monitoring", - "https://www.googleapis.com/auth/monitoring.read", - "https://www.googleapis.com/auth/monitoring.write", - ), - quota_project_id=None, - ) - - @pytest.mark.parametrize( "transport_class", [ @@ -3323,7 +3261,6 @@ def test_metric_service_auth_adc_old_google_auth(): transports.MetricServiceGrpcAsyncIOTransport, ], ) -@requires_google_auth_gte_1_25_0 def test_metric_service_transport_auth_adc(transport_class): # If credentials and host are not provided, the transport class should use # ADC credentials. @@ -3342,31 +3279,6 @@ def test_metric_service_transport_auth_adc(transport_class): ) -@pytest.mark.parametrize( - "transport_class", - [ - transports.MetricServiceGrpcTransport, - transports.MetricServiceGrpcAsyncIOTransport, - ], -) -@requires_google_auth_lt_1_25_0 -def test_metric_service_transport_auth_adc_old_google_auth(transport_class): - # If credentials and host are not provided, the transport class should use - # ADC credentials. - with mock.patch.object(google.auth, "default", autospec=True) as adc: - adc.return_value = (ga_credentials.AnonymousCredentials(), None) - transport_class(quota_project_id="octopus") - adc.assert_called_once_with( - scopes=( - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/monitoring", - "https://www.googleapis.com/auth/monitoring.read", - "https://www.googleapis.com/auth/monitoring.write", - ), - quota_project_id="octopus", - ) - - @pytest.mark.parametrize( "transport_class,grpc_helpers", [ diff --git a/tests/unit/gapic/monitoring_v3/test_notification_channel_service.py b/tests/unit/gapic/monitoring_v3/test_notification_channel_service.py index 167f60b0..eedfda63 100644 --- a/tests/unit/gapic/monitoring_v3/test_notification_channel_service.py +++ b/tests/unit/gapic/monitoring_v3/test_notification_channel_service.py @@ -15,7 +15,6 @@ # import os import mock -import packaging.version import grpc from grpc.experimental import aio @@ -42,9 +41,6 @@ ) from google.cloud.monitoring_v3.services.notification_channel_service import pagers from google.cloud.monitoring_v3.services.notification_channel_service import transports -from google.cloud.monitoring_v3.services.notification_channel_service.transports.base import ( - _GOOGLE_AUTH_VERSION, -) from google.cloud.monitoring_v3.types import common from google.cloud.monitoring_v3.types import mutation_record from google.cloud.monitoring_v3.types import notification @@ -56,20 +52,6 @@ import google.auth -# TODO(busunkim): Once google-auth >= 1.25.0 is required transitively -# through google-api-core: -# - Delete the auth "less than" test cases -# - Delete these pytest markers (Make the "greater than or equal to" tests the default). -requires_google_auth_lt_1_25_0 = pytest.mark.skipif( - packaging.version.parse(_GOOGLE_AUTH_VERSION) >= packaging.version.parse("1.25.0"), - reason="This test requires google-auth < 1.25.0", -) -requires_google_auth_gte_1_25_0 = pytest.mark.skipif( - packaging.version.parse(_GOOGLE_AUTH_VERSION) < packaging.version.parse("1.25.0"), - reason="This test requires google-auth >= 1.25.0", -) - - def client_cert_source_callback(): return b"cert bytes", b"key bytes" @@ -239,7 +221,7 @@ def test_notification_channel_service_client_client_options( options = client_options.ClientOptions(api_endpoint="squid.clam.whelk") with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class(client_options=options) + client = client_class(transport=transport_name, client_options=options) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -256,7 +238,7 @@ def test_notification_channel_service_client_client_options( with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class() + client = client_class(transport=transport_name) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -273,7 +255,7 @@ def test_notification_channel_service_client_client_options( with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}): with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class() + client = client_class(transport=transport_name) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -302,7 +284,7 @@ def test_notification_channel_service_client_client_options( options = client_options.ClientOptions(quota_project_id="octopus") with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class(client_options=options) + client = client_class(transport=transport_name, client_options=options) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -371,7 +353,7 @@ def test_notification_channel_service_client_mtls_env_auto( ) with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class(client_options=options) + client = client_class(transport=transport_name, client_options=options) if use_client_cert_env == "false": expected_client_cert_source = None @@ -413,7 +395,7 @@ def test_notification_channel_service_client_mtls_env_auto( expected_client_cert_source = client_cert_source_callback patched.return_value = None - client = client_class() + client = client_class(transport=transport_name) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -435,7 +417,7 @@ def test_notification_channel_service_client_mtls_env_auto( return_value=False, ): patched.return_value = None - client = client_class() + client = client_class(transport=transport_name) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -470,7 +452,7 @@ def test_notification_channel_service_client_client_options_scopes( options = client_options.ClientOptions(scopes=["1", "2"],) with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class(client_options=options) + client = client_class(transport=transport_name, client_options=options) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -505,7 +487,7 @@ def test_notification_channel_service_client_client_options_credentials_file( options = client_options.ClientOptions(credentials_file="credentials.json") with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class(client_options=options) + client = client_class(transport=transport_name, client_options=options) patched.assert_called_once_with( credentials=None, credentials_file="credentials.json", @@ -3494,7 +3476,6 @@ def test_notification_channel_service_base_transport(): transport.close() -@requires_google_auth_gte_1_25_0 def test_notification_channel_service_base_transport_with_credentials_file(): # Instantiate the base transport with a credentials file with mock.patch.object( @@ -3519,30 +3500,6 @@ def test_notification_channel_service_base_transport_with_credentials_file(): ) -@requires_google_auth_lt_1_25_0 -def test_notification_channel_service_base_transport_with_credentials_file_old_google_auth(): - # Instantiate the base transport with a credentials file - with mock.patch.object( - google.auth, "load_credentials_from_file", autospec=True - ) as load_creds, mock.patch( - "google.cloud.monitoring_v3.services.notification_channel_service.transports.NotificationChannelServiceTransport._prep_wrapped_messages" - ) as Transport: - Transport.return_value = None - load_creds.return_value = (ga_credentials.AnonymousCredentials(), None) - transport = transports.NotificationChannelServiceTransport( - credentials_file="credentials.json", quota_project_id="octopus", - ) - load_creds.assert_called_once_with( - "credentials.json", - scopes=( - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/monitoring", - "https://www.googleapis.com/auth/monitoring.read", - ), - quota_project_id="octopus", - ) - - def test_notification_channel_service_base_transport_with_adc(): # Test the default credentials are used if credentials and credentials_file are None. with mock.patch.object(google.auth, "default", autospec=True) as adc, mock.patch( @@ -3554,7 +3511,6 @@ def test_notification_channel_service_base_transport_with_adc(): adc.assert_called_once() -@requires_google_auth_gte_1_25_0 def test_notification_channel_service_auth_adc(): # If no credentials are provided, we should use ADC credentials. with mock.patch.object(google.auth, "default", autospec=True) as adc: @@ -3571,22 +3527,6 @@ def test_notification_channel_service_auth_adc(): ) -@requires_google_auth_lt_1_25_0 -def test_notification_channel_service_auth_adc_old_google_auth(): - # If no credentials are provided, we should use ADC credentials. - with mock.patch.object(google.auth, "default", autospec=True) as adc: - adc.return_value = (ga_credentials.AnonymousCredentials(), None) - NotificationChannelServiceClient() - adc.assert_called_once_with( - scopes=( - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/monitoring", - "https://www.googleapis.com/auth/monitoring.read", - ), - quota_project_id=None, - ) - - @pytest.mark.parametrize( "transport_class", [ @@ -3594,7 +3534,6 @@ def test_notification_channel_service_auth_adc_old_google_auth(): transports.NotificationChannelServiceGrpcAsyncIOTransport, ], ) -@requires_google_auth_gte_1_25_0 def test_notification_channel_service_transport_auth_adc(transport_class): # If credentials and host are not provided, the transport class should use # ADC credentials. @@ -3612,32 +3551,6 @@ def test_notification_channel_service_transport_auth_adc(transport_class): ) -@pytest.mark.parametrize( - "transport_class", - [ - transports.NotificationChannelServiceGrpcTransport, - transports.NotificationChannelServiceGrpcAsyncIOTransport, - ], -) -@requires_google_auth_lt_1_25_0 -def test_notification_channel_service_transport_auth_adc_old_google_auth( - transport_class, -): - # If credentials and host are not provided, the transport class should use - # ADC credentials. - with mock.patch.object(google.auth, "default", autospec=True) as adc: - adc.return_value = (ga_credentials.AnonymousCredentials(), None) - transport_class(quota_project_id="octopus") - adc.assert_called_once_with( - scopes=( - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/monitoring", - "https://www.googleapis.com/auth/monitoring.read", - ), - quota_project_id="octopus", - ) - - @pytest.mark.parametrize( "transport_class,grpc_helpers", [ diff --git a/tests/unit/gapic/monitoring_v3/test_query_service.py b/tests/unit/gapic/monitoring_v3/test_query_service.py index 045bc1d3..cc9dfbcf 100644 --- a/tests/unit/gapic/monitoring_v3/test_query_service.py +++ b/tests/unit/gapic/monitoring_v3/test_query_service.py @@ -15,7 +15,6 @@ # import os import mock -import packaging.version import grpc from grpc.experimental import aio @@ -36,29 +35,12 @@ from google.cloud.monitoring_v3.services.query_service import QueryServiceClient from google.cloud.monitoring_v3.services.query_service import pagers from google.cloud.monitoring_v3.services.query_service import transports -from google.cloud.monitoring_v3.services.query_service.transports.base import ( - _GOOGLE_AUTH_VERSION, -) from google.cloud.monitoring_v3.types import metric from google.cloud.monitoring_v3.types import metric_service from google.oauth2 import service_account import google.auth -# TODO(busunkim): Once google-auth >= 1.25.0 is required transitively -# through google-api-core: -# - Delete the auth "less than" test cases -# - Delete these pytest markers (Make the "greater than or equal to" tests the default). -requires_google_auth_lt_1_25_0 = pytest.mark.skipif( - packaging.version.parse(_GOOGLE_AUTH_VERSION) >= packaging.version.parse("1.25.0"), - reason="This test requires google-auth < 1.25.0", -) -requires_google_auth_gte_1_25_0 = pytest.mark.skipif( - packaging.version.parse(_GOOGLE_AUTH_VERSION) < packaging.version.parse("1.25.0"), - reason="This test requires google-auth >= 1.25.0", -) - - def client_cert_source_callback(): return b"cert bytes", b"key bytes" @@ -206,7 +188,7 @@ def test_query_service_client_client_options( options = client_options.ClientOptions(api_endpoint="squid.clam.whelk") with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class(client_options=options) + client = client_class(transport=transport_name, client_options=options) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -223,7 +205,7 @@ def test_query_service_client_client_options( with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class() + client = client_class(transport=transport_name) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -240,7 +222,7 @@ def test_query_service_client_client_options( with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}): with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class() + client = client_class(transport=transport_name) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -269,7 +251,7 @@ def test_query_service_client_client_options( options = client_options.ClientOptions(quota_project_id="octopus") with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class(client_options=options) + client = client_class(transport=transport_name, client_options=options) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -326,7 +308,7 @@ def test_query_service_client_mtls_env_auto( ) with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class(client_options=options) + client = client_class(transport=transport_name, client_options=options) if use_client_cert_env == "false": expected_client_cert_source = None @@ -368,7 +350,7 @@ def test_query_service_client_mtls_env_auto( expected_client_cert_source = client_cert_source_callback patched.return_value = None - client = client_class() + client = client_class(transport=transport_name) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -390,7 +372,7 @@ def test_query_service_client_mtls_env_auto( return_value=False, ): patched.return_value = None - client = client_class() + client = client_class(transport=transport_name) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -421,7 +403,7 @@ def test_query_service_client_client_options_scopes( options = client_options.ClientOptions(scopes=["1", "2"],) with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class(client_options=options) + client = client_class(transport=transport_name, client_options=options) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -452,7 +434,7 @@ def test_query_service_client_client_options_credentials_file( options = client_options.ClientOptions(credentials_file="credentials.json") with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class(client_options=options) + client = client_class(transport=transport_name, client_options=options) patched.assert_called_once_with( credentials=None, credentials_file="credentials.json", @@ -888,7 +870,6 @@ def test_query_service_base_transport(): transport.close() -@requires_google_auth_gte_1_25_0 def test_query_service_base_transport_with_credentials_file(): # Instantiate the base transport with a credentials file with mock.patch.object( @@ -913,30 +894,6 @@ def test_query_service_base_transport_with_credentials_file(): ) -@requires_google_auth_lt_1_25_0 -def test_query_service_base_transport_with_credentials_file_old_google_auth(): - # Instantiate the base transport with a credentials file - with mock.patch.object( - google.auth, "load_credentials_from_file", autospec=True - ) as load_creds, mock.patch( - "google.cloud.monitoring_v3.services.query_service.transports.QueryServiceTransport._prep_wrapped_messages" - ) as Transport: - Transport.return_value = None - load_creds.return_value = (ga_credentials.AnonymousCredentials(), None) - transport = transports.QueryServiceTransport( - credentials_file="credentials.json", quota_project_id="octopus", - ) - load_creds.assert_called_once_with( - "credentials.json", - scopes=( - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/monitoring", - "https://www.googleapis.com/auth/monitoring.read", - ), - quota_project_id="octopus", - ) - - def test_query_service_base_transport_with_adc(): # Test the default credentials are used if credentials and credentials_file are None. with mock.patch.object(google.auth, "default", autospec=True) as adc, mock.patch( @@ -948,7 +905,6 @@ def test_query_service_base_transport_with_adc(): adc.assert_called_once() -@requires_google_auth_gte_1_25_0 def test_query_service_auth_adc(): # If no credentials are provided, we should use ADC credentials. with mock.patch.object(google.auth, "default", autospec=True) as adc: @@ -965,22 +921,6 @@ def test_query_service_auth_adc(): ) -@requires_google_auth_lt_1_25_0 -def test_query_service_auth_adc_old_google_auth(): - # If no credentials are provided, we should use ADC credentials. - with mock.patch.object(google.auth, "default", autospec=True) as adc: - adc.return_value = (ga_credentials.AnonymousCredentials(), None) - QueryServiceClient() - adc.assert_called_once_with( - scopes=( - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/monitoring", - "https://www.googleapis.com/auth/monitoring.read", - ), - quota_project_id=None, - ) - - @pytest.mark.parametrize( "transport_class", [ @@ -988,7 +928,6 @@ def test_query_service_auth_adc_old_google_auth(): transports.QueryServiceGrpcAsyncIOTransport, ], ) -@requires_google_auth_gte_1_25_0 def test_query_service_transport_auth_adc(transport_class): # If credentials and host are not provided, the transport class should use # ADC credentials. @@ -1006,30 +945,6 @@ def test_query_service_transport_auth_adc(transport_class): ) -@pytest.mark.parametrize( - "transport_class", - [ - transports.QueryServiceGrpcTransport, - transports.QueryServiceGrpcAsyncIOTransport, - ], -) -@requires_google_auth_lt_1_25_0 -def test_query_service_transport_auth_adc_old_google_auth(transport_class): - # If credentials and host are not provided, the transport class should use - # ADC credentials. - with mock.patch.object(google.auth, "default", autospec=True) as adc: - adc.return_value = (ga_credentials.AnonymousCredentials(), None) - transport_class(quota_project_id="octopus") - adc.assert_called_once_with( - scopes=( - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/monitoring", - "https://www.googleapis.com/auth/monitoring.read", - ), - quota_project_id="octopus", - ) - - @pytest.mark.parametrize( "transport_class,grpc_helpers", [ diff --git a/tests/unit/gapic/monitoring_v3/test_service_monitoring_service.py b/tests/unit/gapic/monitoring_v3/test_service_monitoring_service.py index 72e45fd8..4e652eb5 100644 --- a/tests/unit/gapic/monitoring_v3/test_service_monitoring_service.py +++ b/tests/unit/gapic/monitoring_v3/test_service_monitoring_service.py @@ -15,7 +15,6 @@ # import os import mock -import packaging.version import grpc from grpc.experimental import aio @@ -40,9 +39,6 @@ ) from google.cloud.monitoring_v3.services.service_monitoring_service import pagers from google.cloud.monitoring_v3.services.service_monitoring_service import transports -from google.cloud.monitoring_v3.services.service_monitoring_service.transports.base import ( - _GOOGLE_AUTH_VERSION, -) from google.cloud.monitoring_v3.types import service from google.cloud.monitoring_v3.types import service as gm_service from google.cloud.monitoring_v3.types import service_service @@ -53,20 +49,6 @@ import google.auth -# TODO(busunkim): Once google-auth >= 1.25.0 is required transitively -# through google-api-core: -# - Delete the auth "less than" test cases -# - Delete these pytest markers (Make the "greater than or equal to" tests the default). -requires_google_auth_lt_1_25_0 = pytest.mark.skipif( - packaging.version.parse(_GOOGLE_AUTH_VERSION) >= packaging.version.parse("1.25.0"), - reason="This test requires google-auth < 1.25.0", -) -requires_google_auth_gte_1_25_0 = pytest.mark.skipif( - packaging.version.parse(_GOOGLE_AUTH_VERSION) < packaging.version.parse("1.25.0"), - reason="This test requires google-auth >= 1.25.0", -) - - def client_cert_source_callback(): return b"cert bytes", b"key bytes" @@ -234,7 +216,7 @@ def test_service_monitoring_service_client_client_options( options = client_options.ClientOptions(api_endpoint="squid.clam.whelk") with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class(client_options=options) + client = client_class(transport=transport_name, client_options=options) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -251,7 +233,7 @@ def test_service_monitoring_service_client_client_options( with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class() + client = client_class(transport=transport_name) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -268,7 +250,7 @@ def test_service_monitoring_service_client_client_options( with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}): with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class() + client = client_class(transport=transport_name) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -297,7 +279,7 @@ def test_service_monitoring_service_client_client_options( options = client_options.ClientOptions(quota_project_id="octopus") with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class(client_options=options) + client = client_class(transport=transport_name, client_options=options) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -366,7 +348,7 @@ def test_service_monitoring_service_client_mtls_env_auto( ) with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class(client_options=options) + client = client_class(transport=transport_name, client_options=options) if use_client_cert_env == "false": expected_client_cert_source = None @@ -408,7 +390,7 @@ def test_service_monitoring_service_client_mtls_env_auto( expected_client_cert_source = client_cert_source_callback patched.return_value = None - client = client_class() + client = client_class(transport=transport_name) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -430,7 +412,7 @@ def test_service_monitoring_service_client_mtls_env_auto( return_value=False, ): patched.return_value = None - client = client_class() + client = client_class(transport=transport_name) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -465,7 +447,7 @@ def test_service_monitoring_service_client_client_options_scopes( options = client_options.ClientOptions(scopes=["1", "2"],) with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class(client_options=options) + client = client_class(transport=transport_name, client_options=options) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -500,7 +482,7 @@ def test_service_monitoring_service_client_client_options_credentials_file( options = client_options.ClientOptions(credentials_file="credentials.json") with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class(client_options=options) + client = client_class(transport=transport_name, client_options=options) patched.assert_called_once_with( credentials=None, credentials_file="credentials.json", @@ -3198,7 +3180,6 @@ def test_service_monitoring_service_base_transport(): transport.close() -@requires_google_auth_gte_1_25_0 def test_service_monitoring_service_base_transport_with_credentials_file(): # Instantiate the base transport with a credentials file with mock.patch.object( @@ -3223,30 +3204,6 @@ def test_service_monitoring_service_base_transport_with_credentials_file(): ) -@requires_google_auth_lt_1_25_0 -def test_service_monitoring_service_base_transport_with_credentials_file_old_google_auth(): - # Instantiate the base transport with a credentials file - with mock.patch.object( - google.auth, "load_credentials_from_file", autospec=True - ) as load_creds, mock.patch( - "google.cloud.monitoring_v3.services.service_monitoring_service.transports.ServiceMonitoringServiceTransport._prep_wrapped_messages" - ) as Transport: - Transport.return_value = None - load_creds.return_value = (ga_credentials.AnonymousCredentials(), None) - transport = transports.ServiceMonitoringServiceTransport( - credentials_file="credentials.json", quota_project_id="octopus", - ) - load_creds.assert_called_once_with( - "credentials.json", - scopes=( - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/monitoring", - "https://www.googleapis.com/auth/monitoring.read", - ), - quota_project_id="octopus", - ) - - def test_service_monitoring_service_base_transport_with_adc(): # Test the default credentials are used if credentials and credentials_file are None. with mock.patch.object(google.auth, "default", autospec=True) as adc, mock.patch( @@ -3258,7 +3215,6 @@ def test_service_monitoring_service_base_transport_with_adc(): adc.assert_called_once() -@requires_google_auth_gte_1_25_0 def test_service_monitoring_service_auth_adc(): # If no credentials are provided, we should use ADC credentials. with mock.patch.object(google.auth, "default", autospec=True) as adc: @@ -3275,22 +3231,6 @@ def test_service_monitoring_service_auth_adc(): ) -@requires_google_auth_lt_1_25_0 -def test_service_monitoring_service_auth_adc_old_google_auth(): - # If no credentials are provided, we should use ADC credentials. - with mock.patch.object(google.auth, "default", autospec=True) as adc: - adc.return_value = (ga_credentials.AnonymousCredentials(), None) - ServiceMonitoringServiceClient() - adc.assert_called_once_with( - scopes=( - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/monitoring", - "https://www.googleapis.com/auth/monitoring.read", - ), - quota_project_id=None, - ) - - @pytest.mark.parametrize( "transport_class", [ @@ -3298,7 +3238,6 @@ def test_service_monitoring_service_auth_adc_old_google_auth(): transports.ServiceMonitoringServiceGrpcAsyncIOTransport, ], ) -@requires_google_auth_gte_1_25_0 def test_service_monitoring_service_transport_auth_adc(transport_class): # If credentials and host are not provided, the transport class should use # ADC credentials. @@ -3316,30 +3255,6 @@ def test_service_monitoring_service_transport_auth_adc(transport_class): ) -@pytest.mark.parametrize( - "transport_class", - [ - transports.ServiceMonitoringServiceGrpcTransport, - transports.ServiceMonitoringServiceGrpcAsyncIOTransport, - ], -) -@requires_google_auth_lt_1_25_0 -def test_service_monitoring_service_transport_auth_adc_old_google_auth(transport_class): - # If credentials and host are not provided, the transport class should use - # ADC credentials. - with mock.patch.object(google.auth, "default", autospec=True) as adc: - adc.return_value = (ga_credentials.AnonymousCredentials(), None) - transport_class(quota_project_id="octopus") - adc.assert_called_once_with( - scopes=( - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/monitoring", - "https://www.googleapis.com/auth/monitoring.read", - ), - quota_project_id="octopus", - ) - - @pytest.mark.parametrize( "transport_class,grpc_helpers", [ diff --git a/tests/unit/gapic/monitoring_v3/test_uptime_check_service.py b/tests/unit/gapic/monitoring_v3/test_uptime_check_service.py index 40c4a60c..ed05aa0d 100644 --- a/tests/unit/gapic/monitoring_v3/test_uptime_check_service.py +++ b/tests/unit/gapic/monitoring_v3/test_uptime_check_service.py @@ -15,7 +15,6 @@ # import os import mock -import packaging.version import grpc from grpc.experimental import aio @@ -41,9 +40,6 @@ ) from google.cloud.monitoring_v3.services.uptime_check_service import pagers from google.cloud.monitoring_v3.services.uptime_check_service import transports -from google.cloud.monitoring_v3.services.uptime_check_service.transports.base import ( - _GOOGLE_AUTH_VERSION, -) from google.cloud.monitoring_v3.types import uptime from google.cloud.monitoring_v3.types import uptime_service from google.oauth2 import service_account @@ -52,20 +48,6 @@ import google.auth -# TODO(busunkim): Once google-auth >= 1.25.0 is required transitively -# through google-api-core: -# - Delete the auth "less than" test cases -# - Delete these pytest markers (Make the "greater than or equal to" tests the default). -requires_google_auth_lt_1_25_0 = pytest.mark.skipif( - packaging.version.parse(_GOOGLE_AUTH_VERSION) >= packaging.version.parse("1.25.0"), - reason="This test requires google-auth < 1.25.0", -) -requires_google_auth_gte_1_25_0 = pytest.mark.skipif( - packaging.version.parse(_GOOGLE_AUTH_VERSION) < packaging.version.parse("1.25.0"), - reason="This test requires google-auth >= 1.25.0", -) - - def client_cert_source_callback(): return b"cert bytes", b"key bytes" @@ -223,7 +205,7 @@ def test_uptime_check_service_client_client_options( options = client_options.ClientOptions(api_endpoint="squid.clam.whelk") with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class(client_options=options) + client = client_class(transport=transport_name, client_options=options) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -240,7 +222,7 @@ def test_uptime_check_service_client_client_options( with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class() + client = client_class(transport=transport_name) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -257,7 +239,7 @@ def test_uptime_check_service_client_client_options( with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}): with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class() + client = client_class(transport=transport_name) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -286,7 +268,7 @@ def test_uptime_check_service_client_client_options( options = client_options.ClientOptions(quota_project_id="octopus") with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class(client_options=options) + client = client_class(transport=transport_name, client_options=options) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -355,7 +337,7 @@ def test_uptime_check_service_client_mtls_env_auto( ) with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class(client_options=options) + client = client_class(transport=transport_name, client_options=options) if use_client_cert_env == "false": expected_client_cert_source = None @@ -397,7 +379,7 @@ def test_uptime_check_service_client_mtls_env_auto( expected_client_cert_source = client_cert_source_callback patched.return_value = None - client = client_class() + client = client_class(transport=transport_name) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -419,7 +401,7 @@ def test_uptime_check_service_client_mtls_env_auto( return_value=False, ): patched.return_value = None - client = client_class() + client = client_class(transport=transport_name) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -450,7 +432,7 @@ def test_uptime_check_service_client_client_options_scopes( options = client_options.ClientOptions(scopes=["1", "2"],) with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class(client_options=options) + client = client_class(transport=transport_name, client_options=options) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -481,7 +463,7 @@ def test_uptime_check_service_client_client_options_credentials_file( options = client_options.ClientOptions(credentials_file="credentials.json") with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class(client_options=options) + client = client_class(transport=transport_name, client_options=options) patched.assert_called_once_with( credentials=None, credentials_file="credentials.json", @@ -2260,7 +2242,6 @@ def test_uptime_check_service_base_transport(): transport.close() -@requires_google_auth_gte_1_25_0 def test_uptime_check_service_base_transport_with_credentials_file(): # Instantiate the base transport with a credentials file with mock.patch.object( @@ -2285,30 +2266,6 @@ def test_uptime_check_service_base_transport_with_credentials_file(): ) -@requires_google_auth_lt_1_25_0 -def test_uptime_check_service_base_transport_with_credentials_file_old_google_auth(): - # Instantiate the base transport with a credentials file - with mock.patch.object( - google.auth, "load_credentials_from_file", autospec=True - ) as load_creds, mock.patch( - "google.cloud.monitoring_v3.services.uptime_check_service.transports.UptimeCheckServiceTransport._prep_wrapped_messages" - ) as Transport: - Transport.return_value = None - load_creds.return_value = (ga_credentials.AnonymousCredentials(), None) - transport = transports.UptimeCheckServiceTransport( - credentials_file="credentials.json", quota_project_id="octopus", - ) - load_creds.assert_called_once_with( - "credentials.json", - scopes=( - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/monitoring", - "https://www.googleapis.com/auth/monitoring.read", - ), - quota_project_id="octopus", - ) - - def test_uptime_check_service_base_transport_with_adc(): # Test the default credentials are used if credentials and credentials_file are None. with mock.patch.object(google.auth, "default", autospec=True) as adc, mock.patch( @@ -2320,7 +2277,6 @@ def test_uptime_check_service_base_transport_with_adc(): adc.assert_called_once() -@requires_google_auth_gte_1_25_0 def test_uptime_check_service_auth_adc(): # If no credentials are provided, we should use ADC credentials. with mock.patch.object(google.auth, "default", autospec=True) as adc: @@ -2337,22 +2293,6 @@ def test_uptime_check_service_auth_adc(): ) -@requires_google_auth_lt_1_25_0 -def test_uptime_check_service_auth_adc_old_google_auth(): - # If no credentials are provided, we should use ADC credentials. - with mock.patch.object(google.auth, "default", autospec=True) as adc: - adc.return_value = (ga_credentials.AnonymousCredentials(), None) - UptimeCheckServiceClient() - adc.assert_called_once_with( - scopes=( - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/monitoring", - "https://www.googleapis.com/auth/monitoring.read", - ), - quota_project_id=None, - ) - - @pytest.mark.parametrize( "transport_class", [ @@ -2360,7 +2300,6 @@ def test_uptime_check_service_auth_adc_old_google_auth(): transports.UptimeCheckServiceGrpcAsyncIOTransport, ], ) -@requires_google_auth_gte_1_25_0 def test_uptime_check_service_transport_auth_adc(transport_class): # If credentials and host are not provided, the transport class should use # ADC credentials. @@ -2378,30 +2317,6 @@ def test_uptime_check_service_transport_auth_adc(transport_class): ) -@pytest.mark.parametrize( - "transport_class", - [ - transports.UptimeCheckServiceGrpcTransport, - transports.UptimeCheckServiceGrpcAsyncIOTransport, - ], -) -@requires_google_auth_lt_1_25_0 -def test_uptime_check_service_transport_auth_adc_old_google_auth(transport_class): - # If credentials and host are not provided, the transport class should use - # ADC credentials. - with mock.patch.object(google.auth, "default", autospec=True) as adc: - adc.return_value = (ga_credentials.AnonymousCredentials(), None) - transport_class(quota_project_id="octopus") - adc.assert_called_once_with( - scopes=( - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/monitoring", - "https://www.googleapis.com/auth/monitoring.read", - ), - quota_project_id="octopus", - ) - - @pytest.mark.parametrize( "transport_class,grpc_helpers", [