diff --git a/google/cloud/oslogin_v1/services/os_login_service/async_client.py b/google/cloud/oslogin_v1/services/os_login_service/async_client.py index 71fb027..c20d6a2 100644 --- a/google/cloud/oslogin_v1/services/os_login_service/async_client.py +++ b/google/cloud/oslogin_v1/services/os_login_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.oslogin_v1 import common # type: ignore from google.cloud.oslogin_v1.types import oslogin from google.protobuf import field_mask_pb2 # type: ignore @@ -174,17 +176,17 @@ def __init__( async def delete_posix_account( self, - request: oslogin.DeletePosixAccountRequest = None, + request: Union[oslogin.DeletePosixAccountRequest, 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 a POSIX account. Args: - request (:class:`google.cloud.oslogin_v1.types.DeletePosixAccountRequest`): + request (Union[google.cloud.oslogin_v1.types.DeletePosixAccountRequest, dict]): The request object. A request message for deleting a POSIX account entry. name (:class:`str`): @@ -250,17 +252,17 @@ async def delete_posix_account( async def delete_ssh_public_key( self, - request: oslogin.DeleteSshPublicKeyRequest = None, + request: Union[oslogin.DeleteSshPublicKeyRequest, 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 SSH public key. Args: - request (:class:`google.cloud.oslogin_v1.types.DeleteSshPublicKeyRequest`): + request (Union[google.cloud.oslogin_v1.types.DeleteSshPublicKeyRequest, dict]): The request object. A request message for deleting an SSH public key. name (:class:`str`): @@ -326,10 +328,10 @@ async def delete_ssh_public_key( async def get_login_profile( self, - request: oslogin.GetLoginProfileRequest = None, + request: Union[oslogin.GetLoginProfileRequest, 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]] = (), ) -> oslogin.LoginProfile: @@ -337,7 +339,7 @@ async def get_login_profile( to a virtual machine on Google Compute Engine. Args: - request (:class:`google.cloud.oslogin_v1.types.GetLoginProfileRequest`): + request (Union[google.cloud.oslogin_v1.types.GetLoginProfileRequest, dict]): The request object. A request message for retrieving the login profile information for a user. name (:class:`str`): @@ -409,17 +411,17 @@ async def get_login_profile( async def get_ssh_public_key( self, - request: oslogin.GetSshPublicKeyRequest = None, + request: Union[oslogin.GetSshPublicKeyRequest, 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]] = (), ) -> common.SshPublicKey: r"""Retrieves an SSH public key. Args: - request (:class:`google.cloud.oslogin_v1.types.GetSshPublicKeyRequest`): + request (Union[google.cloud.oslogin_v1.types.GetSshPublicKeyRequest, dict]): The request object. A request message for retrieving an SSH public key. name (:class:`str`): @@ -492,12 +494,12 @@ async def get_ssh_public_key( async def import_ssh_public_key( self, - request: oslogin.ImportSshPublicKeyRequest = None, + request: Union[oslogin.ImportSshPublicKeyRequest, dict] = None, *, parent: str = None, ssh_public_key: common.SshPublicKey = None, project_id: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> oslogin.ImportSshPublicKeyResponse: @@ -507,7 +509,7 @@ async def import_ssh_public_key( profile. Args: - request (:class:`google.cloud.oslogin_v1.types.ImportSshPublicKeyRequest`): + request (Union[google.cloud.oslogin_v1.types.ImportSshPublicKeyRequest, dict]): The request object. A request message for importing an SSH public key. parent (:class:`str`): @@ -596,12 +598,12 @@ async def import_ssh_public_key( async def update_ssh_public_key( self, - request: oslogin.UpdateSshPublicKeyRequest = None, + request: Union[oslogin.UpdateSshPublicKeyRequest, dict] = None, *, name: str = None, ssh_public_key: common.SshPublicKey = None, update_mask: field_mask_pb2.FieldMask = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> common.SshPublicKey: @@ -609,7 +611,7 @@ async def update_ssh_public_key( information. This method supports patch semantics. Args: - request (:class:`google.cloud.oslogin_v1.types.UpdateSshPublicKeyRequest`): + request (Union[google.cloud.oslogin_v1.types.UpdateSshPublicKeyRequest, dict]): The request object. A request message for updating an SSH public key. name (:class:`str`): diff --git a/google/cloud/oslogin_v1/services/os_login_service/client.py b/google/cloud/oslogin_v1/services/os_login_service/client.py index 283c9c0..3b6e170 100644 --- a/google/cloud/oslogin_v1/services/os_login_service/client.py +++ b/google/cloud/oslogin_v1/services/os_login_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.oslogin_v1 import common # type: ignore from google.cloud.oslogin_v1.types import oslogin from google.protobuf import field_mask_pb2 # type: ignore @@ -365,7 +367,7 @@ def delete_posix_account( request: Union[oslogin.DeletePosixAccountRequest, 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: @@ -431,7 +433,7 @@ def delete_ssh_public_key( request: Union[oslogin.DeleteSshPublicKeyRequest, 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: @@ -497,7 +499,7 @@ def get_login_profile( request: Union[oslogin.GetLoginProfileRequest, 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]] = (), ) -> oslogin.LoginProfile: @@ -570,7 +572,7 @@ def get_ssh_public_key( request: Union[oslogin.GetSshPublicKeyRequest, 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]] = (), ) -> common.SshPublicKey: @@ -645,7 +647,7 @@ def import_ssh_public_key( parent: str = None, ssh_public_key: common.SshPublicKey = None, project_id: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> oslogin.ImportSshPublicKeyResponse: @@ -739,7 +741,7 @@ def update_ssh_public_key( name: str = None, ssh_public_key: common.SshPublicKey = None, update_mask: field_mask_pb2.FieldMask = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> common.SshPublicKey: diff --git a/google/cloud/oslogin_v1/services/os_login_service/transports/base.py b/google/cloud/oslogin_v1/services/os_login_service/transports/base.py index 5829fb9..949a05d 100644 --- a/google/cloud/oslogin_v1/services/os_login_service/transports/base.py +++ b/google/cloud/oslogin_v1/services/os_login_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 OsLoginServiceTransport(abc.ABC): """Abstract transport class for OsLoginService.""" @@ -98,7 +88,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 @@ -131,29 +121,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/oslogin_v1/services/os_login_service/transports/grpc_asyncio.py b/google/cloud/oslogin_v1/services/os_login_service/transports/grpc_asyncio.py index 9229c1f..637699b 100644 --- a/google/cloud/oslogin_v1/services/os_login_service/transports/grpc_asyncio.py +++ b/google/cloud/oslogin_v1/services/os_login_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/setup.py b/setup.py index 1ee429c..11418e3 100644 --- a/setup.py +++ b/setup.py @@ -32,10 +32,9 @@ # NOTE: Maintainers, please do not require google-api-core>=2.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.4.0", "libcst >= 0.2.5", - "packaging >= 14.3", ] extras = {} diff --git a/testing/constraints-3.6.txt b/testing/constraints-3.6.txt index 28c92b1..098d660 100644 --- a/testing/constraints-3.6.txt +++ b/testing/constraints-3.6.txt @@ -5,8 +5,6 @@ # # e.g., if setup.py has "foo >= 1.14.0, < 2.0.0dev", # Then this file should have foo==1.14.0 -google-api-core==1.26.0 +google-api-core==1.28.0 proto-plus==1.4.0 libcst==0.2.5 -packaging==14.3 -google-auth==1.24.0 # TODO: remove when google-auth>=1.25.0 is transitively required through google-api-core diff --git a/tests/unit/gapic/oslogin_v1/test_os_login_service.py b/tests/unit/gapic/oslogin_v1/test_os_login_service.py index f36ec67..0e315d0 100644 --- a/tests/unit/gapic/oslogin_v1/test_os_login_service.py +++ b/tests/unit/gapic/oslogin_v1/test_os_login_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.oslogin_v1.services.os_login_service import OsLoginServiceAsyncClient from google.cloud.oslogin_v1.services.os_login_service import OsLoginServiceClient from google.cloud.oslogin_v1.services.os_login_service import transports -from google.cloud.oslogin_v1.services.os_login_service.transports.base import ( - _GOOGLE_AUTH_VERSION, -) from google.cloud.oslogin_v1.types import oslogin from google.oauth2 import service_account from google.protobuf import field_mask_pb2 # type: ignore 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" @@ -215,7 +197,7 @@ def test_os_login_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, @@ -232,7 +214,7 @@ def test_os_login_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, @@ -249,7 +231,7 @@ def test_os_login_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, @@ -278,7 +260,7 @@ def test_os_login_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, @@ -337,7 +319,7 @@ def test_os_login_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 @@ -379,7 +361,7 @@ def test_os_login_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, @@ -401,7 +383,7 @@ def test_os_login_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, @@ -432,7 +414,7 @@ def test_os_login_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, @@ -463,7 +445,7 @@ def test_os_login_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", @@ -1946,7 +1928,6 @@ def test_os_login_service_base_transport(): transport.close() -@requires_google_auth_gte_1_25_0 def test_os_login_service_base_transport_with_credentials_file(): # Instantiate the base transport with a credentials file with mock.patch.object( @@ -1970,29 +1951,6 @@ def test_os_login_service_base_transport_with_credentials_file(): ) -@requires_google_auth_lt_1_25_0 -def test_os_login_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.oslogin_v1.services.os_login_service.transports.OsLoginServiceTransport._prep_wrapped_messages" - ) as Transport: - Transport.return_value = None - load_creds.return_value = (ga_credentials.AnonymousCredentials(), None) - transport = transports.OsLoginServiceTransport( - 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/compute", - ), - quota_project_id="octopus", - ) - - def test_os_login_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( @@ -2004,7 +1962,6 @@ def test_os_login_service_base_transport_with_adc(): adc.assert_called_once() -@requires_google_auth_gte_1_25_0 def test_os_login_service_auth_adc(): # If no credentials are provided, we should use ADC credentials. with mock.patch.object(google.auth, "default", autospec=True) as adc: @@ -2020,21 +1977,6 @@ def test_os_login_service_auth_adc(): ) -@requires_google_auth_lt_1_25_0 -def test_os_login_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) - OsLoginServiceClient() - adc.assert_called_once_with( - scopes=( - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/compute", - ), - quota_project_id=None, - ) - - @pytest.mark.parametrize( "transport_class", [ @@ -2042,7 +1984,6 @@ def test_os_login_service_auth_adc_old_google_auth(): transports.OsLoginServiceGrpcAsyncIOTransport, ], ) -@requires_google_auth_gte_1_25_0 def test_os_login_service_transport_auth_adc(transport_class): # If credentials and host are not provided, the transport class should use # ADC credentials. @@ -2059,29 +2000,6 @@ def test_os_login_service_transport_auth_adc(transport_class): ) -@pytest.mark.parametrize( - "transport_class", - [ - transports.OsLoginServiceGrpcTransport, - transports.OsLoginServiceGrpcAsyncIOTransport, - ], -) -@requires_google_auth_lt_1_25_0 -def test_os_login_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/compute", - ), - quota_project_id="octopus", - ) - - @pytest.mark.parametrize( "transport_class,grpc_helpers", [