From c23c122505b147117d96a89b9a316b0f4bf49fdc Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Tue, 25 Jan 2022 17:38:13 +0000 Subject: [PATCH] feat: add api key support (#78) - [ ] Regenerate this pull request now. PiperOrigin-RevId: 423842556 Source-Link: https://github.com/googleapis/googleapis/commit/a616ca08f4b1416abbac7bc5dd6d61c791756a81 Source-Link: https://github.com/googleapis/googleapis-gen/commit/29b938c58c1e51d019f2ee539d55dc0a3c86a905 Copy-Tag: eyJwIjoiLmdpdGh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiMjliOTM4YzU4YzFlNTFkMDE5ZjJlZTUzOWQ1NWRjMGEzYzg2YTkwNSJ9 feat: generate snippet metadata --- .../services/private_catalog/async_client.py | 96 ++++++- .../services/private_catalog/client.py | 188 ++++++++++--- ...1_private_catalog_search_catalogs_async.py | 2 - ...a1_private_catalog_search_catalogs_sync.py | 2 - ...1_private_catalog_search_products_async.py | 2 - ...a1_private_catalog_search_products_sync.py | 2 - ...1_private_catalog_search_versions_async.py | 2 - ...a1_private_catalog_search_versions_sync.py | 2 - ...ippet_metadata_privatecatalog_v1beta1.json | 259 ++++++++++++++++++ .../test_private_catalog.py | 128 +++++++++ 10 files changed, 627 insertions(+), 56 deletions(-) create mode 100644 packages/google-cloud-private-catalog/samples/generated_samples/snippet_metadata_privatecatalog_v1beta1.json diff --git a/packages/google-cloud-private-catalog/google/cloud/privatecatalog_v1beta1/services/private_catalog/async_client.py b/packages/google-cloud-private-catalog/google/cloud/privatecatalog_v1beta1/services/private_catalog/async_client.py index b2f285b87714..77adf8d5c833 100644 --- a/packages/google-cloud-private-catalog/google/cloud/privatecatalog_v1beta1/services/private_catalog/async_client.py +++ b/packages/google-cloud-private-catalog/google/cloud/privatecatalog_v1beta1/services/private_catalog/async_client.py @@ -16,7 +16,7 @@ from collections import OrderedDict import functools import re -from typing import Dict, Sequence, Tuple, Type, Union +from typing import Dict, Optional, Sequence, Tuple, Type, Union import pkg_resources from google.api_core.client_options import ClientOptions @@ -132,6 +132,42 @@ def from_service_account_file(cls, filename: str, *args, **kwargs): from_service_account_json = from_service_account_file + @classmethod + def get_mtls_endpoint_and_cert_source( + cls, client_options: Optional[ClientOptions] = None + ): + """Return the API endpoint and client cert source for mutual TLS. + + The client cert source is determined in the following order: + (1) if `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is not "true", the + client cert source is None. + (2) if `client_options.client_cert_source` is provided, use the provided one; if the + default client cert source exists, use the default one; otherwise the client cert + source is None. + + The API endpoint is determined in the following order: + (1) if `client_options.api_endpoint` if provided, use the provided one. + (2) if `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is "always", use the + default mTLS endpoint; if the environment variabel is "never", use the default API + endpoint; otherwise if client cert source exists, use the default mTLS endpoint, otherwise + use the default API endpoint. + + More details can be found at https://google.aip.dev/auth/4114. + + Args: + client_options (google.api_core.client_options.ClientOptions): Custom options for the + client. Only the `api_endpoint` and `client_cert_source` properties may be used + in this method. + + Returns: + Tuple[str, Callable[[], Tuple[bytes, bytes]]]: returns the API endpoint and the + client cert source to use. + + Raises: + google.auth.exceptions.MutualTLSChannelError: If any errors happen. + """ + return PrivateCatalogClient.get_mtls_endpoint_and_cert_source(client_options) # type: ignore + @property def transport(self) -> PrivateCatalogTransport: """Returns the transport used by the client instance. @@ -204,6 +240,25 @@ async def search_catalogs( resources that consumers have access to, within the scope of the consumer cloud resource hierarchy context. + + .. code-block:: + + from google.cloud import privatecatalog_v1beta1 + + def sample_search_catalogs(): + # Create a client + client = privatecatalog_v1beta1.PrivateCatalogClient() + + # Initialize request argument(s) + request = privatecatalog_v1beta1.SearchCatalogsRequest( + resource="resource_value", + ) + + # Make the request + page_result = client.search_catalogs(request=request) + for response in page_result: + print(response) + Args: request (Union[google.cloud.privatecatalog_v1beta1.types.SearchCatalogsRequest, dict]): The request object. Request message for @@ -264,6 +319,25 @@ async def search_products( resources that consumers have access to, within the scope of the consumer cloud resource hierarchy context. + + .. code-block:: + + from google.cloud import privatecatalog_v1beta1 + + def sample_search_products(): + # Create a client + client = privatecatalog_v1beta1.PrivateCatalogClient() + + # Initialize request argument(s) + request = privatecatalog_v1beta1.SearchProductsRequest( + resource="resource_value", + ) + + # Make the request + page_result = client.search_products(request=request) + for response in page_result: + print(response) + Args: request (Union[google.cloud.privatecatalog_v1beta1.types.SearchProductsRequest, dict]): The request object. Request message for @@ -324,6 +398,26 @@ async def search_versions( resources that consumers have access to, within the scope of the consumer cloud resource hierarchy context. + + .. code-block:: + + from google.cloud import privatecatalog_v1beta1 + + def sample_search_versions(): + # Create a client + client = privatecatalog_v1beta1.PrivateCatalogClient() + + # Initialize request argument(s) + request = privatecatalog_v1beta1.SearchVersionsRequest( + resource="resource_value", + query="query_value", + ) + + # Make the request + page_result = client.search_versions(request=request) + for response in page_result: + print(response) + Args: request (Union[google.cloud.privatecatalog_v1beta1.types.SearchVersionsRequest, dict]): The request object. Request message for diff --git a/packages/google-cloud-private-catalog/google/cloud/privatecatalog_v1beta1/services/private_catalog/client.py b/packages/google-cloud-private-catalog/google/cloud/privatecatalog_v1beta1/services/private_catalog/client.py index 22e5f7d776cb..746d305d5865 100644 --- a/packages/google-cloud-private-catalog/google/cloud/privatecatalog_v1beta1/services/private_catalog/client.py +++ b/packages/google-cloud-private-catalog/google/cloud/privatecatalog_v1beta1/services/private_catalog/client.py @@ -278,6 +278,73 @@ def parse_common_location_path(path: str) -> Dict[str, str]: m = re.match(r"^projects/(?P.+?)/locations/(?P.+?)$", path) return m.groupdict() if m else {} + @classmethod + def get_mtls_endpoint_and_cert_source( + cls, client_options: Optional[client_options_lib.ClientOptions] = None + ): + """Return the API endpoint and client cert source for mutual TLS. + + The client cert source is determined in the following order: + (1) if `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is not "true", the + client cert source is None. + (2) if `client_options.client_cert_source` is provided, use the provided one; if the + default client cert source exists, use the default one; otherwise the client cert + source is None. + + The API endpoint is determined in the following order: + (1) if `client_options.api_endpoint` if provided, use the provided one. + (2) if `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is "always", use the + default mTLS endpoint; if the environment variabel is "never", use the default API + endpoint; otherwise if client cert source exists, use the default mTLS endpoint, otherwise + use the default API endpoint. + + More details can be found at https://google.aip.dev/auth/4114. + + Args: + client_options (google.api_core.client_options.ClientOptions): Custom options for the + client. Only the `api_endpoint` and `client_cert_source` properties may be used + in this method. + + Returns: + Tuple[str, Callable[[], Tuple[bytes, bytes]]]: returns the API endpoint and the + client cert source to use. + + Raises: + google.auth.exceptions.MutualTLSChannelError: If any errors happen. + """ + if client_options is None: + client_options = client_options_lib.ClientOptions() + use_client_cert = os.getenv("GOOGLE_API_USE_CLIENT_CERTIFICATE", "false") + use_mtls_endpoint = os.getenv("GOOGLE_API_USE_MTLS_ENDPOINT", "auto") + if use_client_cert not in ("true", "false"): + raise ValueError( + "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`" + ) + if use_mtls_endpoint not in ("auto", "never", "always"): + raise MutualTLSChannelError( + "Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`" + ) + + # Figure out the client cert source to use. + client_cert_source = None + if use_client_cert == "true": + if client_options.client_cert_source: + client_cert_source = client_options.client_cert_source + elif mtls.has_default_client_cert_source(): + client_cert_source = mtls.default_client_cert_source() + + # Figure out which api endpoint to use. + if client_options.api_endpoint is not None: + api_endpoint = client_options.api_endpoint + elif use_mtls_endpoint == "always" or ( + use_mtls_endpoint == "auto" and client_cert_source + ): + api_endpoint = cls.DEFAULT_MTLS_ENDPOINT + else: + api_endpoint = cls.DEFAULT_ENDPOINT + + return api_endpoint, client_cert_source + def __init__( self, *, @@ -328,57 +395,22 @@ def __init__( if client_options is None: client_options = client_options_lib.ClientOptions() - # Create SSL credentials for mutual TLS if needed. - if os.getenv("GOOGLE_API_USE_CLIENT_CERTIFICATE", "false") not in ( - "true", - "false", - ): - raise ValueError( - "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`" - ) - use_client_cert = ( - os.getenv("GOOGLE_API_USE_CLIENT_CERTIFICATE", "false") == "true" + api_endpoint, client_cert_source_func = self.get_mtls_endpoint_and_cert_source( + client_options ) - client_cert_source_func = None - is_mtls = False - if use_client_cert: - if client_options.client_cert_source: - is_mtls = True - client_cert_source_func = client_options.client_cert_source - else: - is_mtls = mtls.has_default_client_cert_source() - if is_mtls: - client_cert_source_func = mtls.default_client_cert_source() - else: - client_cert_source_func = None - - # Figure out which api endpoint to use. - if client_options.api_endpoint is not None: - api_endpoint = client_options.api_endpoint - else: - use_mtls_env = os.getenv("GOOGLE_API_USE_MTLS_ENDPOINT", "auto") - if use_mtls_env == "never": - api_endpoint = self.DEFAULT_ENDPOINT - elif use_mtls_env == "always": - api_endpoint = self.DEFAULT_MTLS_ENDPOINT - elif use_mtls_env == "auto": - if is_mtls: - api_endpoint = self.DEFAULT_MTLS_ENDPOINT - else: - api_endpoint = self.DEFAULT_ENDPOINT - else: - raise MutualTLSChannelError( - "Unsupported GOOGLE_API_USE_MTLS_ENDPOINT value. Accepted " - "values: never, auto, always" - ) + api_key_value = getattr(client_options, "api_key", None) + if api_key_value and credentials: + raise ValueError( + "client_options.api_key and credentials are mutually exclusive" + ) # Save or instantiate the transport. # Ordinarily, we provide the transport, but allowing a custom transport # instance provides an extensibility point for unusual situations. if isinstance(transport, PrivateCatalogTransport): # transport is a PrivateCatalogTransport instance. - if credentials or client_options.credentials_file: + if credentials or client_options.credentials_file or api_key_value: raise ValueError( "When providing a transport instance, " "provide its credentials directly." @@ -390,6 +422,15 @@ def __init__( ) self._transport = transport else: + import google.auth._default # type: ignore + + if api_key_value and hasattr( + google.auth._default, "get_api_key_credentials" + ): + credentials = google.auth._default.get_api_key_credentials( + api_key_value + ) + Transport = type(self).get_transport_class(transport) self._transport = Transport( credentials=credentials, @@ -414,6 +455,26 @@ def search_catalogs( resources that consumers have access to, within the scope of the consumer cloud resource hierarchy context. + + + .. code-block:: + + from google.cloud import privatecatalog_v1beta1 + + def sample_search_catalogs(): + # Create a client + client = privatecatalog_v1beta1.PrivateCatalogClient() + + # Initialize request argument(s) + request = privatecatalog_v1beta1.SearchCatalogsRequest( + resource="resource_value", + ) + + # Make the request + page_result = client.search_catalogs(request=request) + for response in page_result: + print(response) + Args: request (Union[google.cloud.privatecatalog_v1beta1.types.SearchCatalogsRequest, dict]): The request object. Request message for @@ -475,6 +536,26 @@ def search_products( resources that consumers have access to, within the scope of the consumer cloud resource hierarchy context. + + + .. code-block:: + + from google.cloud import privatecatalog_v1beta1 + + def sample_search_products(): + # Create a client + client = privatecatalog_v1beta1.PrivateCatalogClient() + + # Initialize request argument(s) + request = privatecatalog_v1beta1.SearchProductsRequest( + resource="resource_value", + ) + + # Make the request + page_result = client.search_products(request=request) + for response in page_result: + print(response) + Args: request (Union[google.cloud.privatecatalog_v1beta1.types.SearchProductsRequest, dict]): The request object. Request message for @@ -536,6 +617,27 @@ def search_versions( resources that consumers have access to, within the scope of the consumer cloud resource hierarchy context. + + + .. code-block:: + + from google.cloud import privatecatalog_v1beta1 + + def sample_search_versions(): + # Create a client + client = privatecatalog_v1beta1.PrivateCatalogClient() + + # Initialize request argument(s) + request = privatecatalog_v1beta1.SearchVersionsRequest( + resource="resource_value", + query="query_value", + ) + + # Make the request + page_result = client.search_versions(request=request) + for response in page_result: + print(response) + Args: request (Union[google.cloud.privatecatalog_v1beta1.types.SearchVersionsRequest, dict]): The request object. Request message for diff --git a/packages/google-cloud-private-catalog/samples/generated_samples/cloudprivatecatalog_generated_privatecatalog_v1beta1_private_catalog_search_catalogs_async.py b/packages/google-cloud-private-catalog/samples/generated_samples/cloudprivatecatalog_generated_privatecatalog_v1beta1_private_catalog_search_catalogs_async.py index 172218332aff..095e4934b9d6 100644 --- a/packages/google-cloud-private-catalog/samples/generated_samples/cloudprivatecatalog_generated_privatecatalog_v1beta1_private_catalog_search_catalogs_async.py +++ b/packages/google-cloud-private-catalog/samples/generated_samples/cloudprivatecatalog_generated_privatecatalog_v1beta1_private_catalog_search_catalogs_async.py @@ -28,8 +28,6 @@ async def sample_search_catalogs(): - """Snippet for search_catalogs""" - # Create a client client = privatecatalog_v1beta1.PrivateCatalogAsyncClient() diff --git a/packages/google-cloud-private-catalog/samples/generated_samples/cloudprivatecatalog_generated_privatecatalog_v1beta1_private_catalog_search_catalogs_sync.py b/packages/google-cloud-private-catalog/samples/generated_samples/cloudprivatecatalog_generated_privatecatalog_v1beta1_private_catalog_search_catalogs_sync.py index 2abf298cfd22..439b64740465 100644 --- a/packages/google-cloud-private-catalog/samples/generated_samples/cloudprivatecatalog_generated_privatecatalog_v1beta1_private_catalog_search_catalogs_sync.py +++ b/packages/google-cloud-private-catalog/samples/generated_samples/cloudprivatecatalog_generated_privatecatalog_v1beta1_private_catalog_search_catalogs_sync.py @@ -28,8 +28,6 @@ def sample_search_catalogs(): - """Snippet for search_catalogs""" - # Create a client client = privatecatalog_v1beta1.PrivateCatalogClient() diff --git a/packages/google-cloud-private-catalog/samples/generated_samples/cloudprivatecatalog_generated_privatecatalog_v1beta1_private_catalog_search_products_async.py b/packages/google-cloud-private-catalog/samples/generated_samples/cloudprivatecatalog_generated_privatecatalog_v1beta1_private_catalog_search_products_async.py index ca4768bb6bb1..24cd202dcb86 100644 --- a/packages/google-cloud-private-catalog/samples/generated_samples/cloudprivatecatalog_generated_privatecatalog_v1beta1_private_catalog_search_products_async.py +++ b/packages/google-cloud-private-catalog/samples/generated_samples/cloudprivatecatalog_generated_privatecatalog_v1beta1_private_catalog_search_products_async.py @@ -28,8 +28,6 @@ async def sample_search_products(): - """Snippet for search_products""" - # Create a client client = privatecatalog_v1beta1.PrivateCatalogAsyncClient() diff --git a/packages/google-cloud-private-catalog/samples/generated_samples/cloudprivatecatalog_generated_privatecatalog_v1beta1_private_catalog_search_products_sync.py b/packages/google-cloud-private-catalog/samples/generated_samples/cloudprivatecatalog_generated_privatecatalog_v1beta1_private_catalog_search_products_sync.py index a0daa33c671c..0f233c45b64d 100644 --- a/packages/google-cloud-private-catalog/samples/generated_samples/cloudprivatecatalog_generated_privatecatalog_v1beta1_private_catalog_search_products_sync.py +++ b/packages/google-cloud-private-catalog/samples/generated_samples/cloudprivatecatalog_generated_privatecatalog_v1beta1_private_catalog_search_products_sync.py @@ -28,8 +28,6 @@ def sample_search_products(): - """Snippet for search_products""" - # Create a client client = privatecatalog_v1beta1.PrivateCatalogClient() diff --git a/packages/google-cloud-private-catalog/samples/generated_samples/cloudprivatecatalog_generated_privatecatalog_v1beta1_private_catalog_search_versions_async.py b/packages/google-cloud-private-catalog/samples/generated_samples/cloudprivatecatalog_generated_privatecatalog_v1beta1_private_catalog_search_versions_async.py index 56ce621545da..e36a0c5926b2 100644 --- a/packages/google-cloud-private-catalog/samples/generated_samples/cloudprivatecatalog_generated_privatecatalog_v1beta1_private_catalog_search_versions_async.py +++ b/packages/google-cloud-private-catalog/samples/generated_samples/cloudprivatecatalog_generated_privatecatalog_v1beta1_private_catalog_search_versions_async.py @@ -28,8 +28,6 @@ async def sample_search_versions(): - """Snippet for search_versions""" - # Create a client client = privatecatalog_v1beta1.PrivateCatalogAsyncClient() diff --git a/packages/google-cloud-private-catalog/samples/generated_samples/cloudprivatecatalog_generated_privatecatalog_v1beta1_private_catalog_search_versions_sync.py b/packages/google-cloud-private-catalog/samples/generated_samples/cloudprivatecatalog_generated_privatecatalog_v1beta1_private_catalog_search_versions_sync.py index 7949686514a6..a22531690d29 100644 --- a/packages/google-cloud-private-catalog/samples/generated_samples/cloudprivatecatalog_generated_privatecatalog_v1beta1_private_catalog_search_versions_sync.py +++ b/packages/google-cloud-private-catalog/samples/generated_samples/cloudprivatecatalog_generated_privatecatalog_v1beta1_private_catalog_search_versions_sync.py @@ -28,8 +28,6 @@ def sample_search_versions(): - """Snippet for search_versions""" - # Create a client client = privatecatalog_v1beta1.PrivateCatalogClient() diff --git a/packages/google-cloud-private-catalog/samples/generated_samples/snippet_metadata_privatecatalog_v1beta1.json b/packages/google-cloud-private-catalog/samples/generated_samples/snippet_metadata_privatecatalog_v1beta1.json new file mode 100644 index 000000000000..8a39e8b8472e --- /dev/null +++ b/packages/google-cloud-private-catalog/samples/generated_samples/snippet_metadata_privatecatalog_v1beta1.json @@ -0,0 +1,259 @@ +{ + "snippets": [ + { + "clientMethod": { + "async": true, + "method": { + "service": { + "shortName": "PrivateCatalog" + }, + "shortName": "SearchCatalogs" + } + }, + "file": "cloudprivatecatalog_generated_privatecatalog_v1beta1_private_catalog_search_catalogs_async.py", + "regionTag": "cloudprivatecatalog_generated_privatecatalog_v1beta1_PrivateCatalog_SearchCatalogs_async", + "segments": [ + { + "end": 43, + "start": 27, + "type": "FULL" + }, + { + "end": 43, + "start": 27, + "type": "SHORT" + }, + { + "end": 33, + "start": 31, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 38, + "start": 34, + "type": "REQUEST_INITIALIZATION" + }, + { + "start": 39, + "type": "REQUEST_EXECUTION" + }, + { + "end": 44, + "type": "RESPONSE_HANDLING" + } + ] + }, + { + "clientMethod": { + "method": { + "service": { + "shortName": "PrivateCatalog" + }, + "shortName": "SearchCatalogs" + } + }, + "file": "cloudprivatecatalog_generated_privatecatalog_v1beta1_private_catalog_search_catalogs_sync.py", + "regionTag": "cloudprivatecatalog_generated_privatecatalog_v1beta1_PrivateCatalog_SearchCatalogs_sync", + "segments": [ + { + "end": 43, + "start": 27, + "type": "FULL" + }, + { + "end": 43, + "start": 27, + "type": "SHORT" + }, + { + "end": 33, + "start": 31, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 38, + "start": 34, + "type": "REQUEST_INITIALIZATION" + }, + { + "start": 39, + "type": "REQUEST_EXECUTION" + }, + { + "end": 44, + "type": "RESPONSE_HANDLING" + } + ] + }, + { + "clientMethod": { + "async": true, + "method": { + "service": { + "shortName": "PrivateCatalog" + }, + "shortName": "SearchProducts" + } + }, + "file": "cloudprivatecatalog_generated_privatecatalog_v1beta1_private_catalog_search_products_async.py", + "regionTag": "cloudprivatecatalog_generated_privatecatalog_v1beta1_PrivateCatalog_SearchProducts_async", + "segments": [ + { + "end": 43, + "start": 27, + "type": "FULL" + }, + { + "end": 43, + "start": 27, + "type": "SHORT" + }, + { + "end": 33, + "start": 31, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 38, + "start": 34, + "type": "REQUEST_INITIALIZATION" + }, + { + "start": 39, + "type": "REQUEST_EXECUTION" + }, + { + "end": 44, + "type": "RESPONSE_HANDLING" + } + ] + }, + { + "clientMethod": { + "method": { + "service": { + "shortName": "PrivateCatalog" + }, + "shortName": "SearchProducts" + } + }, + "file": "cloudprivatecatalog_generated_privatecatalog_v1beta1_private_catalog_search_products_sync.py", + "regionTag": "cloudprivatecatalog_generated_privatecatalog_v1beta1_PrivateCatalog_SearchProducts_sync", + "segments": [ + { + "end": 43, + "start": 27, + "type": "FULL" + }, + { + "end": 43, + "start": 27, + "type": "SHORT" + }, + { + "end": 33, + "start": 31, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 38, + "start": 34, + "type": "REQUEST_INITIALIZATION" + }, + { + "start": 39, + "type": "REQUEST_EXECUTION" + }, + { + "end": 44, + "type": "RESPONSE_HANDLING" + } + ] + }, + { + "clientMethod": { + "async": true, + "method": { + "service": { + "shortName": "PrivateCatalog" + }, + "shortName": "SearchVersions" + } + }, + "file": "cloudprivatecatalog_generated_privatecatalog_v1beta1_private_catalog_search_versions_async.py", + "regionTag": "cloudprivatecatalog_generated_privatecatalog_v1beta1_PrivateCatalog_SearchVersions_async", + "segments": [ + { + "end": 44, + "start": 27, + "type": "FULL" + }, + { + "end": 44, + "start": 27, + "type": "SHORT" + }, + { + "end": 33, + "start": 31, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 39, + "start": 34, + "type": "REQUEST_INITIALIZATION" + }, + { + "start": 40, + "type": "REQUEST_EXECUTION" + }, + { + "end": 45, + "type": "RESPONSE_HANDLING" + } + ] + }, + { + "clientMethod": { + "method": { + "service": { + "shortName": "PrivateCatalog" + }, + "shortName": "SearchVersions" + } + }, + "file": "cloudprivatecatalog_generated_privatecatalog_v1beta1_private_catalog_search_versions_sync.py", + "regionTag": "cloudprivatecatalog_generated_privatecatalog_v1beta1_PrivateCatalog_SearchVersions_sync", + "segments": [ + { + "end": 44, + "start": 27, + "type": "FULL" + }, + { + "end": 44, + "start": 27, + "type": "SHORT" + }, + { + "end": 33, + "start": 31, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 39, + "start": 34, + "type": "REQUEST_INITIALIZATION" + }, + { + "start": 40, + "type": "REQUEST_EXECUTION" + }, + { + "end": 45, + "type": "RESPONSE_HANDLING" + } + ] + } + ] +} diff --git a/packages/google-cloud-private-catalog/tests/unit/gapic/privatecatalog_v1beta1/test_private_catalog.py b/packages/google-cloud-private-catalog/tests/unit/gapic/privatecatalog_v1beta1/test_private_catalog.py index 6e3ead62014c..e4006382ce80 100644 --- a/packages/google-cloud-private-catalog/tests/unit/gapic/privatecatalog_v1beta1/test_private_catalog.py +++ b/packages/google-cloud-private-catalog/tests/unit/gapic/privatecatalog_v1beta1/test_private_catalog.py @@ -399,6 +399,87 @@ def test_private_catalog_client_mtls_env_auto( ) +@pytest.mark.parametrize( + "client_class", [PrivateCatalogClient, PrivateCatalogAsyncClient] +) +@mock.patch.object( + PrivateCatalogClient, + "DEFAULT_ENDPOINT", + modify_default_endpoint(PrivateCatalogClient), +) +@mock.patch.object( + PrivateCatalogAsyncClient, + "DEFAULT_ENDPOINT", + modify_default_endpoint(PrivateCatalogAsyncClient), +) +def test_private_catalog_client_get_mtls_endpoint_and_cert_source(client_class): + mock_client_cert_source = mock.Mock() + + # Test the case GOOGLE_API_USE_CLIENT_CERTIFICATE is "true". + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): + mock_api_endpoint = "foo" + options = client_options.ClientOptions( + client_cert_source=mock_client_cert_source, api_endpoint=mock_api_endpoint + ) + api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source( + options + ) + assert api_endpoint == mock_api_endpoint + assert cert_source == mock_client_cert_source + + # Test the case GOOGLE_API_USE_CLIENT_CERTIFICATE is "false". + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "false"}): + mock_client_cert_source = mock.Mock() + mock_api_endpoint = "foo" + options = client_options.ClientOptions( + client_cert_source=mock_client_cert_source, api_endpoint=mock_api_endpoint + ) + api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source( + options + ) + assert api_endpoint == mock_api_endpoint + assert cert_source is None + + # Test the case GOOGLE_API_USE_MTLS_ENDPOINT is "never". + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): + api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source() + assert api_endpoint == client_class.DEFAULT_ENDPOINT + assert cert_source is None + + # Test the case GOOGLE_API_USE_MTLS_ENDPOINT is "always". + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}): + api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source() + assert api_endpoint == client_class.DEFAULT_MTLS_ENDPOINT + assert cert_source is None + + # Test the case GOOGLE_API_USE_MTLS_ENDPOINT is "auto" and default cert doesn't exist. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): + with mock.patch( + "google.auth.transport.mtls.has_default_client_cert_source", + return_value=False, + ): + api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source() + assert api_endpoint == client_class.DEFAULT_ENDPOINT + assert cert_source is None + + # Test the case GOOGLE_API_USE_MTLS_ENDPOINT is "auto" and default cert exists. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): + with mock.patch( + "google.auth.transport.mtls.has_default_client_cert_source", + return_value=True, + ): + with mock.patch( + "google.auth.transport.mtls.default_client_cert_source", + return_value=mock_client_cert_source, + ): + ( + api_endpoint, + cert_source, + ) = client_class.get_mtls_endpoint_and_cert_source() + assert api_endpoint == client_class.DEFAULT_MTLS_ENDPOINT + assert cert_source == mock_client_cert_source + + @pytest.mark.parametrize( "client_class,transport_class,transport_name", [ @@ -1326,6 +1407,23 @@ def test_credentials_transport_error(): transport=transport, ) + # It is an error to provide an api_key and a transport instance. + transport = transports.PrivateCatalogGrpcTransport( + credentials=ga_credentials.AnonymousCredentials(), + ) + options = client_options.ClientOptions() + options.api_key = "api_key" + with pytest.raises(ValueError): + client = PrivateCatalogClient(client_options=options, transport=transport,) + + # It is an error to provide an api_key and a credential. + options = mock.Mock() + options.api_key = "api_key" + with pytest.raises(ValueError): + client = PrivateCatalogClient( + client_options=options, credentials=ga_credentials.AnonymousCredentials() + ) + # It is an error to provide scopes and a transport instance. transport = transports.PrivateCatalogGrpcTransport( credentials=ga_credentials.AnonymousCredentials(), @@ -1923,3 +2021,33 @@ def test_client_ctx(): with client: pass close.assert_called() + + +@pytest.mark.parametrize( + "client_class,transport_class", + [ + (PrivateCatalogClient, transports.PrivateCatalogGrpcTransport), + (PrivateCatalogAsyncClient, transports.PrivateCatalogGrpcAsyncIOTransport), + ], +) +def test_api_key_credentials(client_class, transport_class): + with mock.patch.object( + google.auth._default, "get_api_key_credentials", create=True + ) as get_api_key_credentials: + mock_cred = mock.Mock() + get_api_key_credentials.return_value = mock_cred + options = client_options.ClientOptions() + options.api_key = "api_key" + with mock.patch.object(transport_class, "__init__") as patched: + patched.return_value = None + client = client_class(client_options=options) + patched.assert_called_once_with( + credentials=mock_cred, + credentials_file=None, + host=client.DEFAULT_ENDPOINT, + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + )