diff --git a/packages/google-cloud-essential-contacts/google/cloud/essential_contacts/gapic_version.py b/packages/google-cloud-essential-contacts/google/cloud/essential_contacts/gapic_version.py index 1c08bcbd1569..558c8aab67c5 100644 --- a/packages/google-cloud-essential-contacts/google/cloud/essential_contacts/gapic_version.py +++ b/packages/google-cloud-essential-contacts/google/cloud/essential_contacts/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.9.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-essential-contacts/google/cloud/essential_contacts_v1/gapic_version.py b/packages/google-cloud-essential-contacts/google/cloud/essential_contacts_v1/gapic_version.py index 1c08bcbd1569..558c8aab67c5 100644 --- a/packages/google-cloud-essential-contacts/google/cloud/essential_contacts_v1/gapic_version.py +++ b/packages/google-cloud-essential-contacts/google/cloud/essential_contacts_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.9.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-essential-contacts/google/cloud/essential_contacts_v1/services/essential_contacts_service/client.py b/packages/google-cloud-essential-contacts/google/cloud/essential_contacts_v1/services/essential_contacts_service/client.py index a6285d076150..698b0d5817df 100644 --- a/packages/google-cloud-essential-contacts/google/cloud/essential_contacts_v1/services/essential_contacts_service/client.py +++ b/packages/google-cloud-essential-contacts/google/cloud/essential_contacts_v1/services/essential_contacts_service/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -486,6 +488,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. diff --git a/packages/google-cloud-essential-contacts/google/cloud/essential_contacts_v1/services/essential_contacts_service/transports/rest.py b/packages/google-cloud-essential-contacts/google/cloud/essential_contacts_v1/services/essential_contacts_service/transports/rest.py index 26bd3a41ab62..aec636750405 100644 --- a/packages/google-cloud-essential-contacts/google/cloud/essential_contacts_v1/services/essential_contacts_service/transports/rest.py +++ b/packages/google-cloud-essential-contacts/google/cloud/essential_contacts_v1/services/essential_contacts_service/transports/rest.py @@ -140,12 +140,37 @@ def post_compute_contacts( ) -> service.ComputeContactsResponse: """Post-rpc interceptor for compute_contacts - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_compute_contacts_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the EssentialContactsService server but before - it is returned to user code. + it is returned to user code. This `post_compute_contacts` interceptor runs + before the `post_compute_contacts_with_metadata` interceptor. """ return response + def post_compute_contacts_with_metadata( + self, + response: service.ComputeContactsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service.ComputeContactsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for compute_contacts + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the EssentialContactsService server but before it is returned to user code. + + We recommend only using this `post_compute_contacts_with_metadata` + interceptor in new development instead of the `post_compute_contacts` interceptor. + When both interceptors are used, this `post_compute_contacts_with_metadata` interceptor runs after the + `post_compute_contacts` interceptor. The (possibly modified) response returned by + `post_compute_contacts` will be passed to + `post_compute_contacts_with_metadata`. + """ + return response, metadata + def pre_create_contact( self, request: service.CreateContactRequest, @@ -161,12 +186,35 @@ def pre_create_contact( def post_create_contact(self, response: service.Contact) -> service.Contact: """Post-rpc interceptor for create_contact - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_contact_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the EssentialContactsService server but before - it is returned to user code. + it is returned to user code. This `post_create_contact` interceptor runs + before the `post_create_contact_with_metadata` interceptor. """ return response + def post_create_contact_with_metadata( + self, + response: service.Contact, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.Contact, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_contact + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the EssentialContactsService server but before it is returned to user code. + + We recommend only using this `post_create_contact_with_metadata` + interceptor in new development instead of the `post_create_contact` interceptor. + When both interceptors are used, this `post_create_contact_with_metadata` interceptor runs after the + `post_create_contact` interceptor. The (possibly modified) response returned by + `post_create_contact` will be passed to + `post_create_contact_with_metadata`. + """ + return response, metadata + def pre_delete_contact( self, request: service.DeleteContactRequest, @@ -194,12 +242,35 @@ def pre_get_contact( def post_get_contact(self, response: service.Contact) -> service.Contact: """Post-rpc interceptor for get_contact - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_contact_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the EssentialContactsService server but before - it is returned to user code. + it is returned to user code. This `post_get_contact` interceptor runs + before the `post_get_contact_with_metadata` interceptor. """ return response + def post_get_contact_with_metadata( + self, + response: service.Contact, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.Contact, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_contact + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the EssentialContactsService server but before it is returned to user code. + + We recommend only using this `post_get_contact_with_metadata` + interceptor in new development instead of the `post_get_contact` interceptor. + When both interceptors are used, this `post_get_contact_with_metadata` interceptor runs after the + `post_get_contact` interceptor. The (possibly modified) response returned by + `post_get_contact` will be passed to + `post_get_contact_with_metadata`. + """ + return response, metadata + def pre_list_contacts( self, request: service.ListContactsRequest, @@ -217,12 +288,35 @@ def post_list_contacts( ) -> service.ListContactsResponse: """Post-rpc interceptor for list_contacts - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_contacts_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the EssentialContactsService server but before - it is returned to user code. + it is returned to user code. This `post_list_contacts` interceptor runs + before the `post_list_contacts_with_metadata` interceptor. """ return response + def post_list_contacts_with_metadata( + self, + response: service.ListContactsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.ListContactsResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_contacts + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the EssentialContactsService server but before it is returned to user code. + + We recommend only using this `post_list_contacts_with_metadata` + interceptor in new development instead of the `post_list_contacts` interceptor. + When both interceptors are used, this `post_list_contacts_with_metadata` interceptor runs after the + `post_list_contacts` interceptor. The (possibly modified) response returned by + `post_list_contacts` will be passed to + `post_list_contacts_with_metadata`. + """ + return response, metadata + def pre_send_test_message( self, request: service.SendTestMessageRequest, @@ -250,12 +344,35 @@ def pre_update_contact( def post_update_contact(self, response: service.Contact) -> service.Contact: """Post-rpc interceptor for update_contact - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_contact_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the EssentialContactsService server but before - it is returned to user code. + it is returned to user code. This `post_update_contact` interceptor runs + before the `post_update_contact_with_metadata` interceptor. """ return response + def post_update_contact_with_metadata( + self, + response: service.Contact, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.Contact, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_contact + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the EssentialContactsService server but before it is returned to user code. + + We recommend only using this `post_update_contact_with_metadata` + interceptor in new development instead of the `post_update_contact` interceptor. + When both interceptors are used, this `post_update_contact_with_metadata` interceptor runs after the + `post_update_contact` interceptor. The (possibly modified) response returned by + `post_update_contact` will be passed to + `post_update_contact_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class EssentialContactsServiceRestStub: @@ -468,6 +585,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_compute_contacts(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_compute_contacts_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -620,6 +741,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_contact(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_contact_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -874,6 +999,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_contact(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_contact_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1020,6 +1149,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_contacts(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_contacts_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1290,6 +1423,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_contact(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_contact_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-essential-contacts/samples/generated_samples/snippet_metadata_google.cloud.essentialcontacts.v1.json b/packages/google-cloud-essential-contacts/samples/generated_samples/snippet_metadata_google.cloud.essentialcontacts.v1.json index 0c856a9a6e6c..4de241e850c4 100644 --- a/packages/google-cloud-essential-contacts/samples/generated_samples/snippet_metadata_google.cloud.essentialcontacts.v1.json +++ b/packages/google-cloud-essential-contacts/samples/generated_samples/snippet_metadata_google.cloud.essentialcontacts.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-essential-contacts", - "version": "1.9.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-essential-contacts/tests/unit/gapic/essential_contacts_v1/test_essential_contacts_service.py b/packages/google-cloud-essential-contacts/tests/unit/gapic/essential_contacts_v1/test_essential_contacts_service.py index 641bd3bb6974..ace4985938b0 100644 --- a/packages/google-cloud-essential-contacts/tests/unit/gapic/essential_contacts_v1/test_essential_contacts_service.py +++ b/packages/google-cloud-essential-contacts/tests/unit/gapic/essential_contacts_v1/test_essential_contacts_service.py @@ -62,6 +62,13 @@ ) from google.cloud.essential_contacts_v1.types import enums, service +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -337,6 +344,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = EssentialContactsServiceClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=["foo"]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + if show_cred_info: + assert error.details == ["foo", CRED_INFO_STRING] + else: + assert error.details == ["foo"] + + +@pytest.mark.parametrize("error_code", [401, 403, 404, 500]) +def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code): + cred = mock.Mock([]) + assert not hasattr(cred, "get_cred_info") + client = EssentialContactsServiceClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -5599,10 +5649,14 @@ def test_create_contact_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.EssentialContactsServiceRestInterceptor, "post_create_contact" ) as post, mock.patch.object( + transports.EssentialContactsServiceRestInterceptor, + "post_create_contact_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.EssentialContactsServiceRestInterceptor, "pre_create_contact" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateContactRequest.pb(service.CreateContactRequest()) transcode.return_value = { "method": "post", @@ -5624,6 +5678,7 @@ def test_create_contact_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.Contact() + post_with_metadata.return_value = service.Contact(), metadata client.create_contact( request, @@ -5635,6 +5690,7 @@ def test_create_contact_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_contact_rest_bad_request(request_type=service.UpdateContactRequest): @@ -5802,10 +5858,14 @@ def test_update_contact_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.EssentialContactsServiceRestInterceptor, "post_update_contact" ) as post, mock.patch.object( + transports.EssentialContactsServiceRestInterceptor, + "post_update_contact_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.EssentialContactsServiceRestInterceptor, "pre_update_contact" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.UpdateContactRequest.pb(service.UpdateContactRequest()) transcode.return_value = { "method": "post", @@ -5827,6 +5887,7 @@ def test_update_contact_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.Contact() + post_with_metadata.return_value = service.Contact(), metadata client.update_contact( request, @@ -5838,6 +5899,7 @@ def test_update_contact_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_contacts_rest_bad_request(request_type=service.ListContactsRequest): @@ -5920,10 +5982,14 @@ def test_list_contacts_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.EssentialContactsServiceRestInterceptor, "post_list_contacts" ) as post, mock.patch.object( + transports.EssentialContactsServiceRestInterceptor, + "post_list_contacts_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.EssentialContactsServiceRestInterceptor, "pre_list_contacts" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListContactsRequest.pb(service.ListContactsRequest()) transcode.return_value = { "method": "post", @@ -5947,6 +6013,7 @@ def test_list_contacts_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListContactsResponse() + post_with_metadata.return_value = service.ListContactsResponse(), metadata client.list_contacts( request, @@ -5958,6 +6025,7 @@ def test_list_contacts_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_contact_rest_bad_request(request_type=service.GetContactRequest): @@ -6050,10 +6118,14 @@ def test_get_contact_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.EssentialContactsServiceRestInterceptor, "post_get_contact" ) as post, mock.patch.object( + transports.EssentialContactsServiceRestInterceptor, + "post_get_contact_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.EssentialContactsServiceRestInterceptor, "pre_get_contact" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetContactRequest.pb(service.GetContactRequest()) transcode.return_value = { "method": "post", @@ -6075,6 +6147,7 @@ def test_get_contact_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.Contact() + post_with_metadata.return_value = service.Contact(), metadata client.get_contact( request, @@ -6086,6 +6159,7 @@ def test_get_contact_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_contact_rest_bad_request(request_type=service.DeleteContactRequest): @@ -6273,10 +6347,14 @@ def test_compute_contacts_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.EssentialContactsServiceRestInterceptor, "post_compute_contacts" ) as post, mock.patch.object( + transports.EssentialContactsServiceRestInterceptor, + "post_compute_contacts_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.EssentialContactsServiceRestInterceptor, "pre_compute_contacts" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ComputeContactsRequest.pb(service.ComputeContactsRequest()) transcode.return_value = { "method": "post", @@ -6300,6 +6378,7 @@ def test_compute_contacts_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ComputeContactsResponse() + post_with_metadata.return_value = service.ComputeContactsResponse(), metadata client.compute_contacts( request, @@ -6311,6 +6390,7 @@ def test_compute_contacts_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_send_test_message_rest_bad_request( diff --git a/packages/google-cloud-eventarc-publishing/google/cloud/eventarc_publishing/gapic_version.py b/packages/google-cloud-eventarc-publishing/google/cloud/eventarc_publishing/gapic_version.py index e51340f75942..558c8aab67c5 100644 --- a/packages/google-cloud-eventarc-publishing/google/cloud/eventarc_publishing/gapic_version.py +++ b/packages/google-cloud-eventarc-publishing/google/cloud/eventarc_publishing/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.6.15" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-eventarc-publishing/google/cloud/eventarc_publishing_v1/gapic_version.py b/packages/google-cloud-eventarc-publishing/google/cloud/eventarc_publishing_v1/gapic_version.py index e51340f75942..558c8aab67c5 100644 --- a/packages/google-cloud-eventarc-publishing/google/cloud/eventarc_publishing_v1/gapic_version.py +++ b/packages/google-cloud-eventarc-publishing/google/cloud/eventarc_publishing_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.6.15" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-eventarc-publishing/google/cloud/eventarc_publishing_v1/services/publisher/client.py b/packages/google-cloud-eventarc-publishing/google/cloud/eventarc_publishing_v1/services/publisher/client.py index e0434e6e921d..6384fed5badc 100644 --- a/packages/google-cloud-eventarc-publishing/google/cloud/eventarc_publishing_v1/services/publisher/client.py +++ b/packages/google-cloud-eventarc-publishing/google/cloud/eventarc_publishing_v1/services/publisher/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -487,6 +489,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. diff --git a/packages/google-cloud-eventarc-publishing/google/cloud/eventarc_publishing_v1/services/publisher/transports/rest.py b/packages/google-cloud-eventarc-publishing/google/cloud/eventarc_publishing_v1/services/publisher/transports/rest.py index 4157fc7276de..ad92f3d9fcd6 100644 --- a/packages/google-cloud-eventarc-publishing/google/cloud/eventarc_publishing_v1/services/publisher/transports/rest.py +++ b/packages/google-cloud-eventarc-publishing/google/cloud/eventarc_publishing_v1/services/publisher/transports/rest.py @@ -115,12 +115,35 @@ def post_publish( ) -> publisher.PublishResponse: """Post-rpc interceptor for publish - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_publish_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Publisher server but before - it is returned to user code. + it is returned to user code. This `post_publish` interceptor runs + before the `post_publish_with_metadata` interceptor. """ return response + def post_publish_with_metadata( + self, + response: publisher.PublishResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[publisher.PublishResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for publish + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Publisher server but before it is returned to user code. + + We recommend only using this `post_publish_with_metadata` + interceptor in new development instead of the `post_publish` interceptor. + When both interceptors are used, this `post_publish_with_metadata` interceptor runs after the + `post_publish` interceptor. The (possibly modified) response returned by + `post_publish` will be passed to + `post_publish_with_metadata`. + """ + return response, metadata + def pre_publish_channel_connection_events( self, request: publisher.PublishChannelConnectionEventsRequest, @@ -141,12 +164,38 @@ def post_publish_channel_connection_events( ) -> publisher.PublishChannelConnectionEventsResponse: """Post-rpc interceptor for publish_channel_connection_events - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_publish_channel_connection_events_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Publisher server but before - it is returned to user code. + it is returned to user code. This `post_publish_channel_connection_events` interceptor runs + before the `post_publish_channel_connection_events_with_metadata` interceptor. """ return response + def post_publish_channel_connection_events_with_metadata( + self, + response: publisher.PublishChannelConnectionEventsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + publisher.PublishChannelConnectionEventsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for publish_channel_connection_events + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Publisher server but before it is returned to user code. + + We recommend only using this `post_publish_channel_connection_events_with_metadata` + interceptor in new development instead of the `post_publish_channel_connection_events` interceptor. + When both interceptors are used, this `post_publish_channel_connection_events_with_metadata` interceptor runs after the + `post_publish_channel_connection_events` interceptor. The (possibly modified) response returned by + `post_publish_channel_connection_events` will be passed to + `post_publish_channel_connection_events_with_metadata`. + """ + return response, metadata + def pre_publish_events( self, request: publisher.PublishEventsRequest, @@ -164,12 +213,37 @@ def post_publish_events( ) -> publisher.PublishEventsResponse: """Post-rpc interceptor for publish_events - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_publish_events_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Publisher server but before - it is returned to user code. + it is returned to user code. This `post_publish_events` interceptor runs + before the `post_publish_events_with_metadata` interceptor. """ return response + def post_publish_events_with_metadata( + self, + response: publisher.PublishEventsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + publisher.PublishEventsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for publish_events + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Publisher server but before it is returned to user code. + + We recommend only using this `post_publish_events_with_metadata` + interceptor in new development instead of the `post_publish_events` interceptor. + When both interceptors are used, this `post_publish_events_with_metadata` interceptor runs after the + `post_publish_events` interceptor. The (possibly modified) response returned by + `post_publish_events` will be passed to + `post_publish_events_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class PublisherRestStub: @@ -410,6 +484,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_publish(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_publish_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -565,6 +643,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_publish_channel_connection_events(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_publish_channel_connection_events_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -724,6 +809,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_publish_events(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_publish_events_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-eventarc-publishing/samples/generated_samples/snippet_metadata_google.cloud.eventarc.publishing.v1.json b/packages/google-cloud-eventarc-publishing/samples/generated_samples/snippet_metadata_google.cloud.eventarc.publishing.v1.json index 418db6cb175e..96c6a4cbfc35 100644 --- a/packages/google-cloud-eventarc-publishing/samples/generated_samples/snippet_metadata_google.cloud.eventarc.publishing.v1.json +++ b/packages/google-cloud-eventarc-publishing/samples/generated_samples/snippet_metadata_google.cloud.eventarc.publishing.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-eventarc-publishing", - "version": "0.6.15" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-eventarc-publishing/tests/unit/gapic/eventarc_publishing_v1/test_publisher.py b/packages/google-cloud-eventarc-publishing/tests/unit/gapic/eventarc_publishing_v1/test_publisher.py index 55ea48dabf99..b35827aa1335 100644 --- a/packages/google-cloud-eventarc-publishing/tests/unit/gapic/eventarc_publishing_v1/test_publisher.py +++ b/packages/google-cloud-eventarc-publishing/tests/unit/gapic/eventarc_publishing_v1/test_publisher.py @@ -61,6 +61,13 @@ ) from google.cloud.eventarc_publishing_v1.types import cloud_event, publisher +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -294,6 +301,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = PublisherClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=["foo"]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + if show_cred_info: + assert error.details == ["foo", CRED_INFO_STRING] + else: + assert error.details == ["foo"] + + +@pytest.mark.parametrize("error_code", [401, 403, 404, 500]) +def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code): + cred = mock.Mock([]) + assert not hasattr(cred, "get_cred_info") + client = PublisherClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -2283,10 +2333,14 @@ def test_publish_channel_connection_events_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.PublisherRestInterceptor, "post_publish_channel_connection_events" ) as post, mock.patch.object( + transports.PublisherRestInterceptor, + "post_publish_channel_connection_events_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.PublisherRestInterceptor, "pre_publish_channel_connection_events" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = publisher.PublishChannelConnectionEventsRequest.pb( publisher.PublishChannelConnectionEventsRequest() ) @@ -2312,6 +2366,10 @@ def test_publish_channel_connection_events_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = publisher.PublishChannelConnectionEventsResponse() + post_with_metadata.return_value = ( + publisher.PublishChannelConnectionEventsResponse(), + metadata, + ) client.publish_channel_connection_events( request, @@ -2323,6 +2381,7 @@ def test_publish_channel_connection_events_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_publish_events_rest_bad_request(request_type=publisher.PublishEventsRequest): @@ -2400,10 +2459,13 @@ def test_publish_events_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.PublisherRestInterceptor, "post_publish_events" ) as post, mock.patch.object( + transports.PublisherRestInterceptor, "post_publish_events_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.PublisherRestInterceptor, "pre_publish_events" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = publisher.PublishEventsRequest.pb(publisher.PublishEventsRequest()) transcode.return_value = { "method": "post", @@ -2427,6 +2489,7 @@ def test_publish_events_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = publisher.PublishEventsResponse() + post_with_metadata.return_value = publisher.PublishEventsResponse(), metadata client.publish_events( request, @@ -2438,6 +2501,7 @@ def test_publish_events_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_publish_rest_bad_request(request_type=publisher.PublishRequest): @@ -2519,10 +2583,13 @@ def test_publish_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.PublisherRestInterceptor, "post_publish" ) as post, mock.patch.object( + transports.PublisherRestInterceptor, "post_publish_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.PublisherRestInterceptor, "pre_publish" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = publisher.PublishRequest.pb(publisher.PublishRequest()) transcode.return_value = { "method": "post", @@ -2544,6 +2611,7 @@ def test_publish_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = publisher.PublishResponse() + post_with_metadata.return_value = publisher.PublishResponse(), metadata client.publish( request, @@ -2555,6 +2623,7 @@ def test_publish_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_initialize_client_w_rest(): diff --git a/packages/google-cloud-eventarc/google/cloud/eventarc/gapic_version.py b/packages/google-cloud-eventarc/google/cloud/eventarc/gapic_version.py index 2159c8af6f8e..558c8aab67c5 100644 --- a/packages/google-cloud-eventarc/google/cloud/eventarc/gapic_version.py +++ b/packages/google-cloud-eventarc/google/cloud/eventarc/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.14.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-eventarc/google/cloud/eventarc_v1/gapic_version.py b/packages/google-cloud-eventarc/google/cloud/eventarc_v1/gapic_version.py index 2159c8af6f8e..558c8aab67c5 100644 --- a/packages/google-cloud-eventarc/google/cloud/eventarc_v1/gapic_version.py +++ b/packages/google-cloud-eventarc/google/cloud/eventarc_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.14.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-eventarc/google/cloud/eventarc_v1/services/eventarc/client.py b/packages/google-cloud-eventarc/google/cloud/eventarc_v1/services/eventarc/client.py index 1f319a69dfd1..77f5a09c4ec4 100644 --- a/packages/google-cloud-eventarc/google/cloud/eventarc_v1/services/eventarc/client.py +++ b/packages/google-cloud-eventarc/google/cloud/eventarc_v1/services/eventarc/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -830,6 +832,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. @@ -6030,16 +6059,20 @@ def list_operations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def get_operation( self, @@ -6085,16 +6118,20 @@ def get_operation( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def delete_operation( self, @@ -6317,16 +6354,20 @@ def set_iam_policy( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def get_iam_policy( self, @@ -6439,16 +6480,20 @@ def get_iam_policy( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def test_iam_permissions( self, @@ -6499,16 +6544,20 @@ def test_iam_permissions( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def get_location( self, @@ -6554,16 +6603,20 @@ def get_location( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def list_locations( self, @@ -6609,16 +6662,20 @@ def list_locations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-eventarc/google/cloud/eventarc_v1/services/eventarc/transports/rest.py b/packages/google-cloud-eventarc/google/cloud/eventarc_v1/services/eventarc/transports/rest.py index f0a0b6ede923..5a40d3b84910 100644 --- a/packages/google-cloud-eventarc/google/cloud/eventarc_v1/services/eventarc/transports/rest.py +++ b/packages/google-cloud-eventarc/google/cloud/eventarc_v1/services/eventarc/transports/rest.py @@ -419,12 +419,35 @@ def post_create_channel( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_channel - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_channel_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Eventarc server but before - it is returned to user code. + it is returned to user code. This `post_create_channel` interceptor runs + before the `post_create_channel_with_metadata` interceptor. """ return response + def post_create_channel_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_channel + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Eventarc server but before it is returned to user code. + + We recommend only using this `post_create_channel_with_metadata` + interceptor in new development instead of the `post_create_channel` interceptor. + When both interceptors are used, this `post_create_channel_with_metadata` interceptor runs after the + `post_create_channel` interceptor. The (possibly modified) response returned by + `post_create_channel` will be passed to + `post_create_channel_with_metadata`. + """ + return response, metadata + def pre_create_channel_connection( self, request: eventarc.CreateChannelConnectionRequest, @@ -444,12 +467,35 @@ def post_create_channel_connection( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_channel_connection - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_channel_connection_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Eventarc server but before - it is returned to user code. + it is returned to user code. This `post_create_channel_connection` interceptor runs + before the `post_create_channel_connection_with_metadata` interceptor. """ return response + def post_create_channel_connection_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_channel_connection + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Eventarc server but before it is returned to user code. + + We recommend only using this `post_create_channel_connection_with_metadata` + interceptor in new development instead of the `post_create_channel_connection` interceptor. + When both interceptors are used, this `post_create_channel_connection_with_metadata` interceptor runs after the + `post_create_channel_connection` interceptor. The (possibly modified) response returned by + `post_create_channel_connection` will be passed to + `post_create_channel_connection_with_metadata`. + """ + return response, metadata + def pre_create_enrollment( self, request: eventarc.CreateEnrollmentRequest, @@ -469,12 +515,35 @@ def post_create_enrollment( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_enrollment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_enrollment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Eventarc server but before - it is returned to user code. + it is returned to user code. This `post_create_enrollment` interceptor runs + before the `post_create_enrollment_with_metadata` interceptor. """ return response + def post_create_enrollment_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_enrollment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Eventarc server but before it is returned to user code. + + We recommend only using this `post_create_enrollment_with_metadata` + interceptor in new development instead of the `post_create_enrollment` interceptor. + When both interceptors are used, this `post_create_enrollment_with_metadata` interceptor runs after the + `post_create_enrollment` interceptor. The (possibly modified) response returned by + `post_create_enrollment` will be passed to + `post_create_enrollment_with_metadata`. + """ + return response, metadata + def pre_create_google_api_source( self, request: eventarc.CreateGoogleApiSourceRequest, @@ -494,12 +563,35 @@ def post_create_google_api_source( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_google_api_source - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_google_api_source_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Eventarc server but before - it is returned to user code. + it is returned to user code. This `post_create_google_api_source` interceptor runs + before the `post_create_google_api_source_with_metadata` interceptor. """ return response + def post_create_google_api_source_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_google_api_source + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Eventarc server but before it is returned to user code. + + We recommend only using this `post_create_google_api_source_with_metadata` + interceptor in new development instead of the `post_create_google_api_source` interceptor. + When both interceptors are used, this `post_create_google_api_source_with_metadata` interceptor runs after the + `post_create_google_api_source` interceptor. The (possibly modified) response returned by + `post_create_google_api_source` will be passed to + `post_create_google_api_source_with_metadata`. + """ + return response, metadata + def pre_create_message_bus( self, request: eventarc.CreateMessageBusRequest, @@ -519,12 +611,35 @@ def post_create_message_bus( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_message_bus - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_message_bus_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Eventarc server but before - it is returned to user code. + it is returned to user code. This `post_create_message_bus` interceptor runs + before the `post_create_message_bus_with_metadata` interceptor. """ return response + def post_create_message_bus_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_message_bus + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Eventarc server but before it is returned to user code. + + We recommend only using this `post_create_message_bus_with_metadata` + interceptor in new development instead of the `post_create_message_bus` interceptor. + When both interceptors are used, this `post_create_message_bus_with_metadata` interceptor runs after the + `post_create_message_bus` interceptor. The (possibly modified) response returned by + `post_create_message_bus` will be passed to + `post_create_message_bus_with_metadata`. + """ + return response, metadata + def pre_create_pipeline( self, request: eventarc.CreatePipelineRequest, @@ -542,12 +657,35 @@ def post_create_pipeline( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_pipeline - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_pipeline_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Eventarc server but before - it is returned to user code. + it is returned to user code. This `post_create_pipeline` interceptor runs + before the `post_create_pipeline_with_metadata` interceptor. """ return response + def post_create_pipeline_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_pipeline + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Eventarc server but before it is returned to user code. + + We recommend only using this `post_create_pipeline_with_metadata` + interceptor in new development instead of the `post_create_pipeline` interceptor. + When both interceptors are used, this `post_create_pipeline_with_metadata` interceptor runs after the + `post_create_pipeline` interceptor. The (possibly modified) response returned by + `post_create_pipeline` will be passed to + `post_create_pipeline_with_metadata`. + """ + return response, metadata + def pre_create_trigger( self, request: eventarc.CreateTriggerRequest, @@ -565,12 +703,35 @@ def post_create_trigger( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_trigger - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_trigger_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Eventarc server but before - it is returned to user code. + it is returned to user code. This `post_create_trigger` interceptor runs + before the `post_create_trigger_with_metadata` interceptor. """ return response + def post_create_trigger_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_trigger + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Eventarc server but before it is returned to user code. + + We recommend only using this `post_create_trigger_with_metadata` + interceptor in new development instead of the `post_create_trigger` interceptor. + When both interceptors are used, this `post_create_trigger_with_metadata` interceptor runs after the + `post_create_trigger` interceptor. The (possibly modified) response returned by + `post_create_trigger` will be passed to + `post_create_trigger_with_metadata`. + """ + return response, metadata + def pre_delete_channel( self, request: eventarc.DeleteChannelRequest, @@ -588,12 +749,35 @@ def post_delete_channel( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_channel - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_channel_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Eventarc server but before - it is returned to user code. + it is returned to user code. This `post_delete_channel` interceptor runs + before the `post_delete_channel_with_metadata` interceptor. """ return response + def post_delete_channel_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_channel + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Eventarc server but before it is returned to user code. + + We recommend only using this `post_delete_channel_with_metadata` + interceptor in new development instead of the `post_delete_channel` interceptor. + When both interceptors are used, this `post_delete_channel_with_metadata` interceptor runs after the + `post_delete_channel` interceptor. The (possibly modified) response returned by + `post_delete_channel` will be passed to + `post_delete_channel_with_metadata`. + """ + return response, metadata + def pre_delete_channel_connection( self, request: eventarc.DeleteChannelConnectionRequest, @@ -613,12 +797,35 @@ def post_delete_channel_connection( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_channel_connection - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_channel_connection_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Eventarc server but before - it is returned to user code. + it is returned to user code. This `post_delete_channel_connection` interceptor runs + before the `post_delete_channel_connection_with_metadata` interceptor. """ return response + def post_delete_channel_connection_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_channel_connection + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Eventarc server but before it is returned to user code. + + We recommend only using this `post_delete_channel_connection_with_metadata` + interceptor in new development instead of the `post_delete_channel_connection` interceptor. + When both interceptors are used, this `post_delete_channel_connection_with_metadata` interceptor runs after the + `post_delete_channel_connection` interceptor. The (possibly modified) response returned by + `post_delete_channel_connection` will be passed to + `post_delete_channel_connection_with_metadata`. + """ + return response, metadata + def pre_delete_enrollment( self, request: eventarc.DeleteEnrollmentRequest, @@ -638,12 +845,35 @@ def post_delete_enrollment( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_enrollment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_enrollment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Eventarc server but before - it is returned to user code. + it is returned to user code. This `post_delete_enrollment` interceptor runs + before the `post_delete_enrollment_with_metadata` interceptor. """ return response + def post_delete_enrollment_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_enrollment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Eventarc server but before it is returned to user code. + + We recommend only using this `post_delete_enrollment_with_metadata` + interceptor in new development instead of the `post_delete_enrollment` interceptor. + When both interceptors are used, this `post_delete_enrollment_with_metadata` interceptor runs after the + `post_delete_enrollment` interceptor. The (possibly modified) response returned by + `post_delete_enrollment` will be passed to + `post_delete_enrollment_with_metadata`. + """ + return response, metadata + def pre_delete_google_api_source( self, request: eventarc.DeleteGoogleApiSourceRequest, @@ -663,12 +893,35 @@ def post_delete_google_api_source( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_google_api_source - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_google_api_source_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Eventarc server but before - it is returned to user code. + it is returned to user code. This `post_delete_google_api_source` interceptor runs + before the `post_delete_google_api_source_with_metadata` interceptor. """ return response + def post_delete_google_api_source_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_google_api_source + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Eventarc server but before it is returned to user code. + + We recommend only using this `post_delete_google_api_source_with_metadata` + interceptor in new development instead of the `post_delete_google_api_source` interceptor. + When both interceptors are used, this `post_delete_google_api_source_with_metadata` interceptor runs after the + `post_delete_google_api_source` interceptor. The (possibly modified) response returned by + `post_delete_google_api_source` will be passed to + `post_delete_google_api_source_with_metadata`. + """ + return response, metadata + def pre_delete_message_bus( self, request: eventarc.DeleteMessageBusRequest, @@ -688,12 +941,35 @@ def post_delete_message_bus( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_message_bus - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_message_bus_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Eventarc server but before - it is returned to user code. + it is returned to user code. This `post_delete_message_bus` interceptor runs + before the `post_delete_message_bus_with_metadata` interceptor. """ return response + def post_delete_message_bus_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_message_bus + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Eventarc server but before it is returned to user code. + + We recommend only using this `post_delete_message_bus_with_metadata` + interceptor in new development instead of the `post_delete_message_bus` interceptor. + When both interceptors are used, this `post_delete_message_bus_with_metadata` interceptor runs after the + `post_delete_message_bus` interceptor. The (possibly modified) response returned by + `post_delete_message_bus` will be passed to + `post_delete_message_bus_with_metadata`. + """ + return response, metadata + def pre_delete_pipeline( self, request: eventarc.DeletePipelineRequest, @@ -711,12 +987,35 @@ def post_delete_pipeline( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_pipeline - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_pipeline_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Eventarc server but before - it is returned to user code. + it is returned to user code. This `post_delete_pipeline` interceptor runs + before the `post_delete_pipeline_with_metadata` interceptor. """ return response + def post_delete_pipeline_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_pipeline + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Eventarc server but before it is returned to user code. + + We recommend only using this `post_delete_pipeline_with_metadata` + interceptor in new development instead of the `post_delete_pipeline` interceptor. + When both interceptors are used, this `post_delete_pipeline_with_metadata` interceptor runs after the + `post_delete_pipeline` interceptor. The (possibly modified) response returned by + `post_delete_pipeline` will be passed to + `post_delete_pipeline_with_metadata`. + """ + return response, metadata + def pre_delete_trigger( self, request: eventarc.DeleteTriggerRequest, @@ -734,12 +1033,35 @@ def post_delete_trigger( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_trigger - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_trigger_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Eventarc server but before - it is returned to user code. + it is returned to user code. This `post_delete_trigger` interceptor runs + before the `post_delete_trigger_with_metadata` interceptor. """ return response + def post_delete_trigger_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_trigger + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Eventarc server but before it is returned to user code. + + We recommend only using this `post_delete_trigger_with_metadata` + interceptor in new development instead of the `post_delete_trigger` interceptor. + When both interceptors are used, this `post_delete_trigger_with_metadata` interceptor runs after the + `post_delete_trigger` interceptor. The (possibly modified) response returned by + `post_delete_trigger` will be passed to + `post_delete_trigger_with_metadata`. + """ + return response, metadata + def pre_get_channel( self, request: eventarc.GetChannelRequest, @@ -755,12 +1077,35 @@ def pre_get_channel( def post_get_channel(self, response: channel.Channel) -> channel.Channel: """Post-rpc interceptor for get_channel - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_channel_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Eventarc server but before - it is returned to user code. + it is returned to user code. This `post_get_channel` interceptor runs + before the `post_get_channel_with_metadata` interceptor. """ return response + def post_get_channel_with_metadata( + self, + response: channel.Channel, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[channel.Channel, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_channel + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Eventarc server but before it is returned to user code. + + We recommend only using this `post_get_channel_with_metadata` + interceptor in new development instead of the `post_get_channel` interceptor. + When both interceptors are used, this `post_get_channel_with_metadata` interceptor runs after the + `post_get_channel` interceptor. The (possibly modified) response returned by + `post_get_channel` will be passed to + `post_get_channel_with_metadata`. + """ + return response, metadata + def pre_get_channel_connection( self, request: eventarc.GetChannelConnectionRequest, @@ -780,12 +1125,37 @@ def post_get_channel_connection( ) -> channel_connection.ChannelConnection: """Post-rpc interceptor for get_channel_connection - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_channel_connection_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Eventarc server but before - it is returned to user code. + it is returned to user code. This `post_get_channel_connection` interceptor runs + before the `post_get_channel_connection_with_metadata` interceptor. """ return response + def post_get_channel_connection_with_metadata( + self, + response: channel_connection.ChannelConnection, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + channel_connection.ChannelConnection, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_channel_connection + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Eventarc server but before it is returned to user code. + + We recommend only using this `post_get_channel_connection_with_metadata` + interceptor in new development instead of the `post_get_channel_connection` interceptor. + When both interceptors are used, this `post_get_channel_connection_with_metadata` interceptor runs after the + `post_get_channel_connection` interceptor. The (possibly modified) response returned by + `post_get_channel_connection` will be passed to + `post_get_channel_connection_with_metadata`. + """ + return response, metadata + def pre_get_enrollment( self, request: eventarc.GetEnrollmentRequest, @@ -803,12 +1173,35 @@ def post_get_enrollment( ) -> enrollment.Enrollment: """Post-rpc interceptor for get_enrollment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_enrollment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Eventarc server but before - it is returned to user code. + it is returned to user code. This `post_get_enrollment` interceptor runs + before the `post_get_enrollment_with_metadata` interceptor. """ return response + def post_get_enrollment_with_metadata( + self, + response: enrollment.Enrollment, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[enrollment.Enrollment, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_enrollment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Eventarc server but before it is returned to user code. + + We recommend only using this `post_get_enrollment_with_metadata` + interceptor in new development instead of the `post_get_enrollment` interceptor. + When both interceptors are used, this `post_get_enrollment_with_metadata` interceptor runs after the + `post_get_enrollment` interceptor. The (possibly modified) response returned by + `post_get_enrollment` will be passed to + `post_get_enrollment_with_metadata`. + """ + return response, metadata + def pre_get_google_api_source( self, request: eventarc.GetGoogleApiSourceRequest, @@ -828,12 +1221,37 @@ def post_get_google_api_source( ) -> google_api_source.GoogleApiSource: """Post-rpc interceptor for get_google_api_source - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_google_api_source_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Eventarc server but before - it is returned to user code. + it is returned to user code. This `post_get_google_api_source` interceptor runs + before the `post_get_google_api_source_with_metadata` interceptor. """ return response + def post_get_google_api_source_with_metadata( + self, + response: google_api_source.GoogleApiSource, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + google_api_source.GoogleApiSource, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_google_api_source + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Eventarc server but before it is returned to user code. + + We recommend only using this `post_get_google_api_source_with_metadata` + interceptor in new development instead of the `post_get_google_api_source` interceptor. + When both interceptors are used, this `post_get_google_api_source_with_metadata` interceptor runs after the + `post_get_google_api_source` interceptor. The (possibly modified) response returned by + `post_get_google_api_source` will be passed to + `post_get_google_api_source_with_metadata`. + """ + return response, metadata + def pre_get_google_channel_config( self, request: eventarc.GetGoogleChannelConfigRequest, @@ -853,12 +1271,38 @@ def post_get_google_channel_config( ) -> google_channel_config.GoogleChannelConfig: """Post-rpc interceptor for get_google_channel_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_google_channel_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Eventarc server but before - it is returned to user code. + it is returned to user code. This `post_get_google_channel_config` interceptor runs + before the `post_get_google_channel_config_with_metadata` interceptor. """ return response + def post_get_google_channel_config_with_metadata( + self, + response: google_channel_config.GoogleChannelConfig, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + google_channel_config.GoogleChannelConfig, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for get_google_channel_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Eventarc server but before it is returned to user code. + + We recommend only using this `post_get_google_channel_config_with_metadata` + interceptor in new development instead of the `post_get_google_channel_config` interceptor. + When both interceptors are used, this `post_get_google_channel_config_with_metadata` interceptor runs after the + `post_get_google_channel_config` interceptor. The (possibly modified) response returned by + `post_get_google_channel_config` will be passed to + `post_get_google_channel_config_with_metadata`. + """ + return response, metadata + def pre_get_message_bus( self, request: eventarc.GetMessageBusRequest, @@ -876,12 +1320,35 @@ def post_get_message_bus( ) -> message_bus.MessageBus: """Post-rpc interceptor for get_message_bus - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_message_bus_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Eventarc server but before - it is returned to user code. + it is returned to user code. This `post_get_message_bus` interceptor runs + before the `post_get_message_bus_with_metadata` interceptor. """ return response + def post_get_message_bus_with_metadata( + self, + response: message_bus.MessageBus, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[message_bus.MessageBus, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_message_bus + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Eventarc server but before it is returned to user code. + + We recommend only using this `post_get_message_bus_with_metadata` + interceptor in new development instead of the `post_get_message_bus` interceptor. + When both interceptors are used, this `post_get_message_bus_with_metadata` interceptor runs after the + `post_get_message_bus` interceptor. The (possibly modified) response returned by + `post_get_message_bus` will be passed to + `post_get_message_bus_with_metadata`. + """ + return response, metadata + def pre_get_pipeline( self, request: eventarc.GetPipelineRequest, @@ -897,12 +1364,35 @@ def pre_get_pipeline( def post_get_pipeline(self, response: pipeline.Pipeline) -> pipeline.Pipeline: """Post-rpc interceptor for get_pipeline - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_pipeline_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Eventarc server but before - it is returned to user code. + it is returned to user code. This `post_get_pipeline` interceptor runs + before the `post_get_pipeline_with_metadata` interceptor. """ return response + def post_get_pipeline_with_metadata( + self, + response: pipeline.Pipeline, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[pipeline.Pipeline, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_pipeline + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Eventarc server but before it is returned to user code. + + We recommend only using this `post_get_pipeline_with_metadata` + interceptor in new development instead of the `post_get_pipeline` interceptor. + When both interceptors are used, this `post_get_pipeline_with_metadata` interceptor runs after the + `post_get_pipeline` interceptor. The (possibly modified) response returned by + `post_get_pipeline` will be passed to + `post_get_pipeline_with_metadata`. + """ + return response, metadata + def pre_get_provider( self, request: eventarc.GetProviderRequest, @@ -918,12 +1408,35 @@ def pre_get_provider( def post_get_provider(self, response: discovery.Provider) -> discovery.Provider: """Post-rpc interceptor for get_provider - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_provider_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Eventarc server but before - it is returned to user code. + it is returned to user code. This `post_get_provider` interceptor runs + before the `post_get_provider_with_metadata` interceptor. """ return response + def post_get_provider_with_metadata( + self, + response: discovery.Provider, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[discovery.Provider, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_provider + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Eventarc server but before it is returned to user code. + + We recommend only using this `post_get_provider_with_metadata` + interceptor in new development instead of the `post_get_provider` interceptor. + When both interceptors are used, this `post_get_provider_with_metadata` interceptor runs after the + `post_get_provider` interceptor. The (possibly modified) response returned by + `post_get_provider` will be passed to + `post_get_provider_with_metadata`. + """ + return response, metadata + def pre_get_trigger( self, request: eventarc.GetTriggerRequest, @@ -939,12 +1452,35 @@ def pre_get_trigger( def post_get_trigger(self, response: trigger.Trigger) -> trigger.Trigger: """Post-rpc interceptor for get_trigger - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_trigger_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Eventarc server but before - it is returned to user code. + it is returned to user code. This `post_get_trigger` interceptor runs + before the `post_get_trigger_with_metadata` interceptor. """ return response + def post_get_trigger_with_metadata( + self, + response: trigger.Trigger, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[trigger.Trigger, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_trigger + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Eventarc server but before it is returned to user code. + + We recommend only using this `post_get_trigger_with_metadata` + interceptor in new development instead of the `post_get_trigger` interceptor. + When both interceptors are used, this `post_get_trigger_with_metadata` interceptor runs after the + `post_get_trigger` interceptor. The (possibly modified) response returned by + `post_get_trigger` will be passed to + `post_get_trigger_with_metadata`. + """ + return response, metadata + def pre_list_channel_connections( self, request: eventarc.ListChannelConnectionsRequest, @@ -964,12 +1500,37 @@ def post_list_channel_connections( ) -> eventarc.ListChannelConnectionsResponse: """Post-rpc interceptor for list_channel_connections - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_channel_connections_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Eventarc server but before - it is returned to user code. + it is returned to user code. This `post_list_channel_connections` interceptor runs + before the `post_list_channel_connections_with_metadata` interceptor. """ return response + def post_list_channel_connections_with_metadata( + self, + response: eventarc.ListChannelConnectionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + eventarc.ListChannelConnectionsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_channel_connections + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Eventarc server but before it is returned to user code. + + We recommend only using this `post_list_channel_connections_with_metadata` + interceptor in new development instead of the `post_list_channel_connections` interceptor. + When both interceptors are used, this `post_list_channel_connections_with_metadata` interceptor runs after the + `post_list_channel_connections` interceptor. The (possibly modified) response returned by + `post_list_channel_connections` will be passed to + `post_list_channel_connections_with_metadata`. + """ + return response, metadata + def pre_list_channels( self, request: eventarc.ListChannelsRequest, @@ -987,12 +1548,35 @@ def post_list_channels( ) -> eventarc.ListChannelsResponse: """Post-rpc interceptor for list_channels - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_channels_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Eventarc server but before - it is returned to user code. + it is returned to user code. This `post_list_channels` interceptor runs + before the `post_list_channels_with_metadata` interceptor. """ return response + def post_list_channels_with_metadata( + self, + response: eventarc.ListChannelsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[eventarc.ListChannelsResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_channels + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Eventarc server but before it is returned to user code. + + We recommend only using this `post_list_channels_with_metadata` + interceptor in new development instead of the `post_list_channels` interceptor. + When both interceptors are used, this `post_list_channels_with_metadata` interceptor runs after the + `post_list_channels` interceptor. The (possibly modified) response returned by + `post_list_channels` will be passed to + `post_list_channels_with_metadata`. + """ + return response, metadata + def pre_list_enrollments( self, request: eventarc.ListEnrollmentsRequest, @@ -1012,12 +1596,37 @@ def post_list_enrollments( ) -> eventarc.ListEnrollmentsResponse: """Post-rpc interceptor for list_enrollments - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_enrollments_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Eventarc server but before - it is returned to user code. + it is returned to user code. This `post_list_enrollments` interceptor runs + before the `post_list_enrollments_with_metadata` interceptor. """ return response + def post_list_enrollments_with_metadata( + self, + response: eventarc.ListEnrollmentsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + eventarc.ListEnrollmentsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_enrollments + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Eventarc server but before it is returned to user code. + + We recommend only using this `post_list_enrollments_with_metadata` + interceptor in new development instead of the `post_list_enrollments` interceptor. + When both interceptors are used, this `post_list_enrollments_with_metadata` interceptor runs after the + `post_list_enrollments` interceptor. The (possibly modified) response returned by + `post_list_enrollments` will be passed to + `post_list_enrollments_with_metadata`. + """ + return response, metadata + def pre_list_google_api_sources( self, request: eventarc.ListGoogleApiSourcesRequest, @@ -1037,12 +1646,37 @@ def post_list_google_api_sources( ) -> eventarc.ListGoogleApiSourcesResponse: """Post-rpc interceptor for list_google_api_sources - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_google_api_sources_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Eventarc server but before - it is returned to user code. + it is returned to user code. This `post_list_google_api_sources` interceptor runs + before the `post_list_google_api_sources_with_metadata` interceptor. """ return response + def post_list_google_api_sources_with_metadata( + self, + response: eventarc.ListGoogleApiSourcesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + eventarc.ListGoogleApiSourcesResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_google_api_sources + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Eventarc server but before it is returned to user code. + + We recommend only using this `post_list_google_api_sources_with_metadata` + interceptor in new development instead of the `post_list_google_api_sources` interceptor. + When both interceptors are used, this `post_list_google_api_sources_with_metadata` interceptor runs after the + `post_list_google_api_sources` interceptor. The (possibly modified) response returned by + `post_list_google_api_sources` will be passed to + `post_list_google_api_sources_with_metadata`. + """ + return response, metadata + def pre_list_message_bus_enrollments( self, request: eventarc.ListMessageBusEnrollmentsRequest, @@ -1063,12 +1697,38 @@ def post_list_message_bus_enrollments( ) -> eventarc.ListMessageBusEnrollmentsResponse: """Post-rpc interceptor for list_message_bus_enrollments - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_message_bus_enrollments_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Eventarc server but before - it is returned to user code. + it is returned to user code. This `post_list_message_bus_enrollments` interceptor runs + before the `post_list_message_bus_enrollments_with_metadata` interceptor. """ return response + def post_list_message_bus_enrollments_with_metadata( + self, + response: eventarc.ListMessageBusEnrollmentsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + eventarc.ListMessageBusEnrollmentsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_message_bus_enrollments + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Eventarc server but before it is returned to user code. + + We recommend only using this `post_list_message_bus_enrollments_with_metadata` + interceptor in new development instead of the `post_list_message_bus_enrollments` interceptor. + When both interceptors are used, this `post_list_message_bus_enrollments_with_metadata` interceptor runs after the + `post_list_message_bus_enrollments` interceptor. The (possibly modified) response returned by + `post_list_message_bus_enrollments` will be passed to + `post_list_message_bus_enrollments_with_metadata`. + """ + return response, metadata + def pre_list_message_buses( self, request: eventarc.ListMessageBusesRequest, @@ -1088,12 +1748,37 @@ def post_list_message_buses( ) -> eventarc.ListMessageBusesResponse: """Post-rpc interceptor for list_message_buses - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_message_buses_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Eventarc server but before - it is returned to user code. + it is returned to user code. This `post_list_message_buses` interceptor runs + before the `post_list_message_buses_with_metadata` interceptor. """ return response + def post_list_message_buses_with_metadata( + self, + response: eventarc.ListMessageBusesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + eventarc.ListMessageBusesResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_message_buses + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Eventarc server but before it is returned to user code. + + We recommend only using this `post_list_message_buses_with_metadata` + interceptor in new development instead of the `post_list_message_buses` interceptor. + When both interceptors are used, this `post_list_message_buses_with_metadata` interceptor runs after the + `post_list_message_buses` interceptor. The (possibly modified) response returned by + `post_list_message_buses` will be passed to + `post_list_message_buses_with_metadata`. + """ + return response, metadata + def pre_list_pipelines( self, request: eventarc.ListPipelinesRequest, @@ -1111,12 +1796,35 @@ def post_list_pipelines( ) -> eventarc.ListPipelinesResponse: """Post-rpc interceptor for list_pipelines - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_pipelines_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Eventarc server but before - it is returned to user code. + it is returned to user code. This `post_list_pipelines` interceptor runs + before the `post_list_pipelines_with_metadata` interceptor. """ return response + def post_list_pipelines_with_metadata( + self, + response: eventarc.ListPipelinesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[eventarc.ListPipelinesResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_pipelines + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Eventarc server but before it is returned to user code. + + We recommend only using this `post_list_pipelines_with_metadata` + interceptor in new development instead of the `post_list_pipelines` interceptor. + When both interceptors are used, this `post_list_pipelines_with_metadata` interceptor runs after the + `post_list_pipelines` interceptor. The (possibly modified) response returned by + `post_list_pipelines` will be passed to + `post_list_pipelines_with_metadata`. + """ + return response, metadata + def pre_list_providers( self, request: eventarc.ListProvidersRequest, @@ -1134,12 +1842,35 @@ def post_list_providers( ) -> eventarc.ListProvidersResponse: """Post-rpc interceptor for list_providers - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_providers_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Eventarc server but before - it is returned to user code. + it is returned to user code. This `post_list_providers` interceptor runs + before the `post_list_providers_with_metadata` interceptor. """ return response + def post_list_providers_with_metadata( + self, + response: eventarc.ListProvidersResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[eventarc.ListProvidersResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_providers + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Eventarc server but before it is returned to user code. + + We recommend only using this `post_list_providers_with_metadata` + interceptor in new development instead of the `post_list_providers` interceptor. + When both interceptors are used, this `post_list_providers_with_metadata` interceptor runs after the + `post_list_providers` interceptor. The (possibly modified) response returned by + `post_list_providers` will be passed to + `post_list_providers_with_metadata`. + """ + return response, metadata + def pre_list_triggers( self, request: eventarc.ListTriggersRequest, @@ -1157,12 +1888,35 @@ def post_list_triggers( ) -> eventarc.ListTriggersResponse: """Post-rpc interceptor for list_triggers - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_triggers_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Eventarc server but before - it is returned to user code. + it is returned to user code. This `post_list_triggers` interceptor runs + before the `post_list_triggers_with_metadata` interceptor. """ return response + def post_list_triggers_with_metadata( + self, + response: eventarc.ListTriggersResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[eventarc.ListTriggersResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_triggers + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Eventarc server but before it is returned to user code. + + We recommend only using this `post_list_triggers_with_metadata` + interceptor in new development instead of the `post_list_triggers` interceptor. + When both interceptors are used, this `post_list_triggers_with_metadata` interceptor runs after the + `post_list_triggers` interceptor. The (possibly modified) response returned by + `post_list_triggers` will be passed to + `post_list_triggers_with_metadata`. + """ + return response, metadata + def pre_update_channel( self, request: eventarc.UpdateChannelRequest, @@ -1180,12 +1934,35 @@ def post_update_channel( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_channel - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_channel_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Eventarc server but before - it is returned to user code. + it is returned to user code. This `post_update_channel` interceptor runs + before the `post_update_channel_with_metadata` interceptor. """ return response + def post_update_channel_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_channel + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Eventarc server but before it is returned to user code. + + We recommend only using this `post_update_channel_with_metadata` + interceptor in new development instead of the `post_update_channel` interceptor. + When both interceptors are used, this `post_update_channel_with_metadata` interceptor runs after the + `post_update_channel` interceptor. The (possibly modified) response returned by + `post_update_channel` will be passed to + `post_update_channel_with_metadata`. + """ + return response, metadata + def pre_update_enrollment( self, request: eventarc.UpdateEnrollmentRequest, @@ -1205,12 +1982,35 @@ def post_update_enrollment( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_enrollment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_enrollment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Eventarc server but before - it is returned to user code. + it is returned to user code. This `post_update_enrollment` interceptor runs + before the `post_update_enrollment_with_metadata` interceptor. """ return response + def post_update_enrollment_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_enrollment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Eventarc server but before it is returned to user code. + + We recommend only using this `post_update_enrollment_with_metadata` + interceptor in new development instead of the `post_update_enrollment` interceptor. + When both interceptors are used, this `post_update_enrollment_with_metadata` interceptor runs after the + `post_update_enrollment` interceptor. The (possibly modified) response returned by + `post_update_enrollment` will be passed to + `post_update_enrollment_with_metadata`. + """ + return response, metadata + def pre_update_google_api_source( self, request: eventarc.UpdateGoogleApiSourceRequest, @@ -1230,12 +2030,35 @@ def post_update_google_api_source( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_google_api_source - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_google_api_source_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Eventarc server but before - it is returned to user code. + it is returned to user code. This `post_update_google_api_source` interceptor runs + before the `post_update_google_api_source_with_metadata` interceptor. """ return response + def post_update_google_api_source_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_google_api_source + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Eventarc server but before it is returned to user code. + + We recommend only using this `post_update_google_api_source_with_metadata` + interceptor in new development instead of the `post_update_google_api_source` interceptor. + When both interceptors are used, this `post_update_google_api_source_with_metadata` interceptor runs after the + `post_update_google_api_source` interceptor. The (possibly modified) response returned by + `post_update_google_api_source` will be passed to + `post_update_google_api_source_with_metadata`. + """ + return response, metadata + def pre_update_google_channel_config( self, request: eventarc.UpdateGoogleChannelConfigRequest, @@ -1256,12 +2079,38 @@ def post_update_google_channel_config( ) -> gce_google_channel_config.GoogleChannelConfig: """Post-rpc interceptor for update_google_channel_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_google_channel_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Eventarc server but before - it is returned to user code. + it is returned to user code. This `post_update_google_channel_config` interceptor runs + before the `post_update_google_channel_config_with_metadata` interceptor. """ return response + def post_update_google_channel_config_with_metadata( + self, + response: gce_google_channel_config.GoogleChannelConfig, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + gce_google_channel_config.GoogleChannelConfig, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for update_google_channel_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Eventarc server but before it is returned to user code. + + We recommend only using this `post_update_google_channel_config_with_metadata` + interceptor in new development instead of the `post_update_google_channel_config` interceptor. + When both interceptors are used, this `post_update_google_channel_config_with_metadata` interceptor runs after the + `post_update_google_channel_config` interceptor. The (possibly modified) response returned by + `post_update_google_channel_config` will be passed to + `post_update_google_channel_config_with_metadata`. + """ + return response, metadata + def pre_update_message_bus( self, request: eventarc.UpdateMessageBusRequest, @@ -1281,12 +2130,35 @@ def post_update_message_bus( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_message_bus - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_message_bus_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Eventarc server but before - it is returned to user code. + it is returned to user code. This `post_update_message_bus` interceptor runs + before the `post_update_message_bus_with_metadata` interceptor. """ return response + def post_update_message_bus_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_message_bus + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Eventarc server but before it is returned to user code. + + We recommend only using this `post_update_message_bus_with_metadata` + interceptor in new development instead of the `post_update_message_bus` interceptor. + When both interceptors are used, this `post_update_message_bus_with_metadata` interceptor runs after the + `post_update_message_bus` interceptor. The (possibly modified) response returned by + `post_update_message_bus` will be passed to + `post_update_message_bus_with_metadata`. + """ + return response, metadata + def pre_update_pipeline( self, request: eventarc.UpdatePipelineRequest, @@ -1304,12 +2176,35 @@ def post_update_pipeline( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_pipeline - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_pipeline_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Eventarc server but before - it is returned to user code. + it is returned to user code. This `post_update_pipeline` interceptor runs + before the `post_update_pipeline_with_metadata` interceptor. """ return response + def post_update_pipeline_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_pipeline + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Eventarc server but before it is returned to user code. + + We recommend only using this `post_update_pipeline_with_metadata` + interceptor in new development instead of the `post_update_pipeline` interceptor. + When both interceptors are used, this `post_update_pipeline_with_metadata` interceptor runs after the + `post_update_pipeline` interceptor. The (possibly modified) response returned by + `post_update_pipeline` will be passed to + `post_update_pipeline_with_metadata`. + """ + return response, metadata + def pre_update_trigger( self, request: eventarc.UpdateTriggerRequest, @@ -1327,12 +2222,35 @@ def post_update_trigger( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_trigger - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_trigger_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Eventarc server but before - it is returned to user code. + it is returned to user code. This `post_update_trigger` interceptor runs + before the `post_update_trigger_with_metadata` interceptor. """ return response + def post_update_trigger_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_trigger + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Eventarc server but before it is returned to user code. + + We recommend only using this `post_update_trigger_with_metadata` + interceptor in new development instead of the `post_update_trigger` interceptor. + When both interceptors are used, this `post_update_trigger_with_metadata` interceptor runs after the + `post_update_trigger` interceptor. The (possibly modified) response returned by + `post_update_trigger` will be passed to + `post_update_trigger_with_metadata`. + """ + return response, metadata + def pre_get_location( self, request: locations_pb2.GetLocationRequest, @@ -1823,6 +2741,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_channel(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_channel_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1973,6 +2895,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_channel_connection(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_channel_connection_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2127,6 +3053,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_enrollment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_enrollment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2277,6 +3207,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_google_api_source(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_google_api_source_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2431,6 +3365,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_message_bus(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_message_bus_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2585,6 +3523,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_pipeline(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_pipeline_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2737,6 +3679,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_trigger(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_trigger_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2883,6 +3829,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_channel(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_channel_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3027,6 +3977,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_channel_connection(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_channel_connection_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3173,6 +4127,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_enrollment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_enrollment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3317,6 +4275,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_google_api_source(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_google_api_source_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3463,6 +4425,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_message_bus(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_message_bus_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3609,6 +4575,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_pipeline(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_pipeline_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3755,6 +4725,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_trigger(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_trigger_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3906,6 +4880,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_channel(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_channel_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4056,6 +5034,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_channel_connection(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_channel_connection_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4209,6 +5191,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_enrollment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_enrollment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4355,6 +5341,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_google_api_source(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_google_api_source_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4508,6 +5498,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_google_channel_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_google_channel_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4663,6 +5657,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_message_bus(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_message_bus_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4808,6 +5806,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_pipeline(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_pipeline_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4953,6 +5955,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_provider(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_provider_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5098,6 +6104,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_trigger(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_trigger_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5243,6 +6253,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_channel_connections(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_channel_connections_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5388,6 +6402,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_channels(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_channels_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5535,6 +6553,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_enrollments(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_enrollments_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5682,6 +6704,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_google_api_sources(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_google_api_sources_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5830,6 +6856,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_message_bus_enrollments(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_message_bus_enrollments_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5979,6 +7009,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_message_buses(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_message_buses_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6128,6 +7162,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_pipelines(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_pipelines_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6273,6 +7311,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_providers(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_providers_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6416,6 +7458,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_triggers(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_triggers_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6568,6 +7614,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_channel(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_channel_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6722,6 +7772,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_enrollment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_enrollment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6872,6 +7926,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_google_api_source(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_google_api_source_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -7030,6 +8088,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_google_channel_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_google_channel_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -7186,6 +8248,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_message_bus(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_message_bus_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -7340,6 +8406,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_pipeline(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_pipeline_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -7492,6 +8562,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_trigger(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_trigger_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-eventarc/samples/generated_samples/snippet_metadata_google.cloud.eventarc.v1.json b/packages/google-cloud-eventarc/samples/generated_samples/snippet_metadata_google.cloud.eventarc.v1.json index 5822f5d5795f..73d35229f306 100644 --- a/packages/google-cloud-eventarc/samples/generated_samples/snippet_metadata_google.cloud.eventarc.v1.json +++ b/packages/google-cloud-eventarc/samples/generated_samples/snippet_metadata_google.cloud.eventarc.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-eventarc", - "version": "1.14.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-eventarc/tests/unit/gapic/eventarc_v1/test_eventarc.py b/packages/google-cloud-eventarc/tests/unit/gapic/eventarc_v1/test_eventarc.py index 8bbd1174cac8..033a57437c9b 100644 --- a/packages/google-cloud-eventarc/tests/unit/gapic/eventarc_v1/test_eventarc.py +++ b/packages/google-cloud-eventarc/tests/unit/gapic/eventarc_v1/test_eventarc.py @@ -99,6 +99,13 @@ from google.cloud.eventarc_v1.types import trigger from google.cloud.eventarc_v1.types import trigger as gce_trigger +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -329,6 +336,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = EventarcClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=["foo"]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + if show_cred_info: + assert error.details == ["foo", CRED_INFO_STRING] + else: + assert error.details == ["foo"] + + +@pytest.mark.parametrize("error_code", [401, 403, 404, 500]) +def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code): + cred = mock.Mock([]) + assert not hasattr(cred, "get_cred_info") + client = EventarcClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -26554,10 +26604,13 @@ def test_get_trigger_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.EventarcRestInterceptor, "post_get_trigger" ) as post, mock.patch.object( + transports.EventarcRestInterceptor, "post_get_trigger_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.EventarcRestInterceptor, "pre_get_trigger" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = eventarc.GetTriggerRequest.pb(eventarc.GetTriggerRequest()) transcode.return_value = { "method": "post", @@ -26579,6 +26632,7 @@ def test_get_trigger_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = trigger.Trigger() + post_with_metadata.return_value = trigger.Trigger(), metadata client.get_trigger( request, @@ -26590,6 +26644,7 @@ def test_get_trigger_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_triggers_rest_bad_request(request_type=eventarc.ListTriggersRequest): @@ -26672,10 +26727,13 @@ def test_list_triggers_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.EventarcRestInterceptor, "post_list_triggers" ) as post, mock.patch.object( + transports.EventarcRestInterceptor, "post_list_triggers_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.EventarcRestInterceptor, "pre_list_triggers" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = eventarc.ListTriggersRequest.pb(eventarc.ListTriggersRequest()) transcode.return_value = { "method": "post", @@ -26699,6 +26757,7 @@ def test_list_triggers_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = eventarc.ListTriggersResponse() + post_with_metadata.return_value = eventarc.ListTriggersResponse(), metadata client.list_triggers( request, @@ -26710,6 +26769,7 @@ def test_list_triggers_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_trigger_rest_bad_request(request_type=eventarc.CreateTriggerRequest): @@ -26894,10 +26954,13 @@ def test_create_trigger_rest_interceptors(null_interceptor): ), mock.patch.object( transports.EventarcRestInterceptor, "post_create_trigger" ) as post, mock.patch.object( + transports.EventarcRestInterceptor, "post_create_trigger_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.EventarcRestInterceptor, "pre_create_trigger" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = eventarc.CreateTriggerRequest.pb(eventarc.CreateTriggerRequest()) transcode.return_value = { "method": "post", @@ -26919,6 +26982,7 @@ def test_create_trigger_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_trigger( request, @@ -26930,6 +26994,7 @@ def test_create_trigger_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_trigger_rest_bad_request(request_type=eventarc.UpdateTriggerRequest): @@ -27118,10 +27183,13 @@ def test_update_trigger_rest_interceptors(null_interceptor): ), mock.patch.object( transports.EventarcRestInterceptor, "post_update_trigger" ) as post, mock.patch.object( + transports.EventarcRestInterceptor, "post_update_trigger_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.EventarcRestInterceptor, "pre_update_trigger" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = eventarc.UpdateTriggerRequest.pb(eventarc.UpdateTriggerRequest()) transcode.return_value = { "method": "post", @@ -27143,6 +27211,7 @@ def test_update_trigger_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.update_trigger( request, @@ -27154,6 +27223,7 @@ def test_update_trigger_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_trigger_rest_bad_request(request_type=eventarc.DeleteTriggerRequest): @@ -27230,10 +27300,13 @@ def test_delete_trigger_rest_interceptors(null_interceptor): ), mock.patch.object( transports.EventarcRestInterceptor, "post_delete_trigger" ) as post, mock.patch.object( + transports.EventarcRestInterceptor, "post_delete_trigger_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.EventarcRestInterceptor, "pre_delete_trigger" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = eventarc.DeleteTriggerRequest.pb(eventarc.DeleteTriggerRequest()) transcode.return_value = { "method": "post", @@ -27255,6 +27328,7 @@ def test_delete_trigger_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_trigger( request, @@ -27266,6 +27340,7 @@ def test_delete_trigger_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_channel_rest_bad_request(request_type=eventarc.GetChannelRequest): @@ -27359,10 +27434,13 @@ def test_get_channel_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.EventarcRestInterceptor, "post_get_channel" ) as post, mock.patch.object( + transports.EventarcRestInterceptor, "post_get_channel_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.EventarcRestInterceptor, "pre_get_channel" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = eventarc.GetChannelRequest.pb(eventarc.GetChannelRequest()) transcode.return_value = { "method": "post", @@ -27384,6 +27462,7 @@ def test_get_channel_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = channel.Channel() + post_with_metadata.return_value = channel.Channel(), metadata client.get_channel( request, @@ -27395,6 +27474,7 @@ def test_get_channel_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_channels_rest_bad_request(request_type=eventarc.ListChannelsRequest): @@ -27477,10 +27557,13 @@ def test_list_channels_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.EventarcRestInterceptor, "post_list_channels" ) as post, mock.patch.object( + transports.EventarcRestInterceptor, "post_list_channels_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.EventarcRestInterceptor, "pre_list_channels" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = eventarc.ListChannelsRequest.pb(eventarc.ListChannelsRequest()) transcode.return_value = { "method": "post", @@ -27504,6 +27587,7 @@ def test_list_channels_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = eventarc.ListChannelsResponse() + post_with_metadata.return_value = eventarc.ListChannelsResponse(), metadata client.list_channels( request, @@ -27515,6 +27599,7 @@ def test_list_channels_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_channel_rest_bad_request(request_type=eventarc.CreateChannelRequest): @@ -27670,10 +27755,13 @@ def test_create_channel_rest_interceptors(null_interceptor): ), mock.patch.object( transports.EventarcRestInterceptor, "post_create_channel" ) as post, mock.patch.object( + transports.EventarcRestInterceptor, "post_create_channel_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.EventarcRestInterceptor, "pre_create_channel" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = eventarc.CreateChannelRequest.pb(eventarc.CreateChannelRequest()) transcode.return_value = { "method": "post", @@ -27695,6 +27783,7 @@ def test_create_channel_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_channel( request, @@ -27706,6 +27795,7 @@ def test_create_channel_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_channel_rest_bad_request(request_type=eventarc.UpdateChannelRequest): @@ -27865,10 +27955,13 @@ def test_update_channel_rest_interceptors(null_interceptor): ), mock.patch.object( transports.EventarcRestInterceptor, "post_update_channel" ) as post, mock.patch.object( + transports.EventarcRestInterceptor, "post_update_channel_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.EventarcRestInterceptor, "pre_update_channel" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = eventarc.UpdateChannelRequest.pb(eventarc.UpdateChannelRequest()) transcode.return_value = { "method": "post", @@ -27890,6 +27983,7 @@ def test_update_channel_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.update_channel( request, @@ -27901,6 +27995,7 @@ def test_update_channel_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_channel_rest_bad_request(request_type=eventarc.DeleteChannelRequest): @@ -27977,10 +28072,13 @@ def test_delete_channel_rest_interceptors(null_interceptor): ), mock.patch.object( transports.EventarcRestInterceptor, "post_delete_channel" ) as post, mock.patch.object( + transports.EventarcRestInterceptor, "post_delete_channel_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.EventarcRestInterceptor, "pre_delete_channel" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = eventarc.DeleteChannelRequest.pb(eventarc.DeleteChannelRequest()) transcode.return_value = { "method": "post", @@ -28002,6 +28100,7 @@ def test_delete_channel_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_channel( request, @@ -28013,6 +28112,7 @@ def test_delete_channel_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_provider_rest_bad_request(request_type=eventarc.GetProviderRequest): @@ -28095,10 +28195,13 @@ def test_get_provider_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.EventarcRestInterceptor, "post_get_provider" ) as post, mock.patch.object( + transports.EventarcRestInterceptor, "post_get_provider_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.EventarcRestInterceptor, "pre_get_provider" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = eventarc.GetProviderRequest.pb(eventarc.GetProviderRequest()) transcode.return_value = { "method": "post", @@ -28120,6 +28223,7 @@ def test_get_provider_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = discovery.Provider() + post_with_metadata.return_value = discovery.Provider(), metadata client.get_provider( request, @@ -28131,6 +28235,7 @@ def test_get_provider_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_providers_rest_bad_request(request_type=eventarc.ListProvidersRequest): @@ -28213,10 +28318,13 @@ def test_list_providers_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.EventarcRestInterceptor, "post_list_providers" ) as post, mock.patch.object( + transports.EventarcRestInterceptor, "post_list_providers_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.EventarcRestInterceptor, "pre_list_providers" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = eventarc.ListProvidersRequest.pb(eventarc.ListProvidersRequest()) transcode.return_value = { "method": "post", @@ -28240,6 +28348,7 @@ def test_list_providers_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = eventarc.ListProvidersResponse() + post_with_metadata.return_value = eventarc.ListProvidersResponse(), metadata client.list_providers( request, @@ -28251,6 +28360,7 @@ def test_list_providers_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_channel_connection_rest_bad_request( @@ -28343,10 +28453,13 @@ def test_get_channel_connection_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.EventarcRestInterceptor, "post_get_channel_connection" ) as post, mock.patch.object( + transports.EventarcRestInterceptor, "post_get_channel_connection_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.EventarcRestInterceptor, "pre_get_channel_connection" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = eventarc.GetChannelConnectionRequest.pb( eventarc.GetChannelConnectionRequest() ) @@ -28372,6 +28485,10 @@ def test_get_channel_connection_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = channel_connection.ChannelConnection() + post_with_metadata.return_value = ( + channel_connection.ChannelConnection(), + metadata, + ) client.get_channel_connection( request, @@ -28383,6 +28500,7 @@ def test_get_channel_connection_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_channel_connections_rest_bad_request( @@ -28467,10 +28585,14 @@ def test_list_channel_connections_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.EventarcRestInterceptor, "post_list_channel_connections" ) as post, mock.patch.object( + transports.EventarcRestInterceptor, + "post_list_channel_connections_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.EventarcRestInterceptor, "pre_list_channel_connections" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = eventarc.ListChannelConnectionsRequest.pb( eventarc.ListChannelConnectionsRequest() ) @@ -28496,6 +28618,10 @@ def test_list_channel_connections_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = eventarc.ListChannelConnectionsResponse() + post_with_metadata.return_value = ( + eventarc.ListChannelConnectionsResponse(), + metadata, + ) client.list_channel_connections( request, @@ -28507,6 +28633,7 @@ def test_list_channel_connections_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_channel_connection_rest_bad_request( @@ -28662,10 +28789,14 @@ def test_create_channel_connection_rest_interceptors(null_interceptor): ), mock.patch.object( transports.EventarcRestInterceptor, "post_create_channel_connection" ) as post, mock.patch.object( + transports.EventarcRestInterceptor, + "post_create_channel_connection_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.EventarcRestInterceptor, "pre_create_channel_connection" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = eventarc.CreateChannelConnectionRequest.pb( eventarc.CreateChannelConnectionRequest() ) @@ -28689,6 +28820,7 @@ def test_create_channel_connection_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_channel_connection( request, @@ -28700,6 +28832,7 @@ def test_create_channel_connection_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_channel_connection_rest_bad_request( @@ -28782,10 +28915,14 @@ def test_delete_channel_connection_rest_interceptors(null_interceptor): ), mock.patch.object( transports.EventarcRestInterceptor, "post_delete_channel_connection" ) as post, mock.patch.object( + transports.EventarcRestInterceptor, + "post_delete_channel_connection_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.EventarcRestInterceptor, "pre_delete_channel_connection" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = eventarc.DeleteChannelConnectionRequest.pb( eventarc.DeleteChannelConnectionRequest() ) @@ -28809,6 +28946,7 @@ def test_delete_channel_connection_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_channel_connection( request, @@ -28820,6 +28958,7 @@ def test_delete_channel_connection_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_google_channel_config_rest_bad_request( @@ -28904,10 +29043,14 @@ def test_get_google_channel_config_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.EventarcRestInterceptor, "post_get_google_channel_config" ) as post, mock.patch.object( + transports.EventarcRestInterceptor, + "post_get_google_channel_config_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.EventarcRestInterceptor, "pre_get_google_channel_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = eventarc.GetGoogleChannelConfigRequest.pb( eventarc.GetGoogleChannelConfigRequest() ) @@ -28933,6 +29076,10 @@ def test_get_google_channel_config_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = google_channel_config.GoogleChannelConfig() + post_with_metadata.return_value = ( + google_channel_config.GoogleChannelConfig(), + metadata, + ) client.get_google_channel_config( request, @@ -28944,6 +29091,7 @@ def test_get_google_channel_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_google_channel_config_rest_bad_request( @@ -29112,10 +29260,14 @@ def test_update_google_channel_config_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.EventarcRestInterceptor, "post_update_google_channel_config" ) as post, mock.patch.object( + transports.EventarcRestInterceptor, + "post_update_google_channel_config_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.EventarcRestInterceptor, "pre_update_google_channel_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = eventarc.UpdateGoogleChannelConfigRequest.pb( eventarc.UpdateGoogleChannelConfigRequest() ) @@ -29141,6 +29293,10 @@ def test_update_google_channel_config_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gce_google_channel_config.GoogleChannelConfig() + post_with_metadata.return_value = ( + gce_google_channel_config.GoogleChannelConfig(), + metadata, + ) client.update_google_channel_config( request, @@ -29152,6 +29308,7 @@ def test_update_google_channel_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_message_bus_rest_bad_request(request_type=eventarc.GetMessageBusRequest): @@ -29240,10 +29397,13 @@ def test_get_message_bus_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.EventarcRestInterceptor, "post_get_message_bus" ) as post, mock.patch.object( + transports.EventarcRestInterceptor, "post_get_message_bus_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.EventarcRestInterceptor, "pre_get_message_bus" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = eventarc.GetMessageBusRequest.pb(eventarc.GetMessageBusRequest()) transcode.return_value = { "method": "post", @@ -29265,6 +29425,7 @@ def test_get_message_bus_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = message_bus.MessageBus() + post_with_metadata.return_value = message_bus.MessageBus(), metadata client.get_message_bus( request, @@ -29276,6 +29437,7 @@ def test_get_message_bus_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_message_buses_rest_bad_request( @@ -29360,10 +29522,13 @@ def test_list_message_buses_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.EventarcRestInterceptor, "post_list_message_buses" ) as post, mock.patch.object( + transports.EventarcRestInterceptor, "post_list_message_buses_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.EventarcRestInterceptor, "pre_list_message_buses" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = eventarc.ListMessageBusesRequest.pb( eventarc.ListMessageBusesRequest() ) @@ -29389,6 +29554,7 @@ def test_list_message_buses_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = eventarc.ListMessageBusesResponse() + post_with_metadata.return_value = eventarc.ListMessageBusesResponse(), metadata client.list_message_buses( request, @@ -29400,6 +29566,7 @@ def test_list_message_buses_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_message_bus_enrollments_rest_bad_request( @@ -29486,10 +29653,14 @@ def test_list_message_bus_enrollments_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.EventarcRestInterceptor, "post_list_message_bus_enrollments" ) as post, mock.patch.object( + transports.EventarcRestInterceptor, + "post_list_message_bus_enrollments_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.EventarcRestInterceptor, "pre_list_message_bus_enrollments" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = eventarc.ListMessageBusEnrollmentsRequest.pb( eventarc.ListMessageBusEnrollmentsRequest() ) @@ -29515,6 +29686,10 @@ def test_list_message_bus_enrollments_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = eventarc.ListMessageBusEnrollmentsResponse() + post_with_metadata.return_value = ( + eventarc.ListMessageBusEnrollmentsResponse(), + metadata, + ) client.list_message_bus_enrollments( request, @@ -29526,6 +29701,7 @@ def test_list_message_bus_enrollments_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_message_bus_rest_bad_request( @@ -29683,10 +29859,13 @@ def test_create_message_bus_rest_interceptors(null_interceptor): ), mock.patch.object( transports.EventarcRestInterceptor, "post_create_message_bus" ) as post, mock.patch.object( + transports.EventarcRestInterceptor, "post_create_message_bus_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.EventarcRestInterceptor, "pre_create_message_bus" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = eventarc.CreateMessageBusRequest.pb( eventarc.CreateMessageBusRequest() ) @@ -29710,6 +29889,7 @@ def test_create_message_bus_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_message_bus( request, @@ -29721,6 +29901,7 @@ def test_create_message_bus_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_message_bus_rest_bad_request( @@ -29886,10 +30067,13 @@ def test_update_message_bus_rest_interceptors(null_interceptor): ), mock.patch.object( transports.EventarcRestInterceptor, "post_update_message_bus" ) as post, mock.patch.object( + transports.EventarcRestInterceptor, "post_update_message_bus_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.EventarcRestInterceptor, "pre_update_message_bus" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = eventarc.UpdateMessageBusRequest.pb( eventarc.UpdateMessageBusRequest() ) @@ -29913,6 +30097,7 @@ def test_update_message_bus_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.update_message_bus( request, @@ -29924,6 +30109,7 @@ def test_update_message_bus_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_message_bus_rest_bad_request( @@ -30002,10 +30188,13 @@ def test_delete_message_bus_rest_interceptors(null_interceptor): ), mock.patch.object( transports.EventarcRestInterceptor, "post_delete_message_bus" ) as post, mock.patch.object( + transports.EventarcRestInterceptor, "post_delete_message_bus_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.EventarcRestInterceptor, "pre_delete_message_bus" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = eventarc.DeleteMessageBusRequest.pb( eventarc.DeleteMessageBusRequest() ) @@ -30029,6 +30218,7 @@ def test_delete_message_bus_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_message_bus( request, @@ -30040,6 +30230,7 @@ def test_delete_message_bus_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_enrollment_rest_bad_request(request_type=eventarc.GetEnrollmentRequest): @@ -30132,10 +30323,13 @@ def test_get_enrollment_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.EventarcRestInterceptor, "post_get_enrollment" ) as post, mock.patch.object( + transports.EventarcRestInterceptor, "post_get_enrollment_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.EventarcRestInterceptor, "pre_get_enrollment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = eventarc.GetEnrollmentRequest.pb(eventarc.GetEnrollmentRequest()) transcode.return_value = { "method": "post", @@ -30157,6 +30351,7 @@ def test_get_enrollment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = enrollment.Enrollment() + post_with_metadata.return_value = enrollment.Enrollment(), metadata client.get_enrollment( request, @@ -30168,6 +30363,7 @@ def test_get_enrollment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_enrollments_rest_bad_request( @@ -30252,10 +30448,13 @@ def test_list_enrollments_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.EventarcRestInterceptor, "post_list_enrollments" ) as post, mock.patch.object( + transports.EventarcRestInterceptor, "post_list_enrollments_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.EventarcRestInterceptor, "pre_list_enrollments" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = eventarc.ListEnrollmentsRequest.pb( eventarc.ListEnrollmentsRequest() ) @@ -30281,6 +30480,7 @@ def test_list_enrollments_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = eventarc.ListEnrollmentsResponse() + post_with_metadata.return_value = eventarc.ListEnrollmentsResponse(), metadata client.list_enrollments( request, @@ -30292,6 +30492,7 @@ def test_list_enrollments_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_enrollment_rest_bad_request( @@ -30450,10 +30651,13 @@ def test_create_enrollment_rest_interceptors(null_interceptor): ), mock.patch.object( transports.EventarcRestInterceptor, "post_create_enrollment" ) as post, mock.patch.object( + transports.EventarcRestInterceptor, "post_create_enrollment_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.EventarcRestInterceptor, "pre_create_enrollment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = eventarc.CreateEnrollmentRequest.pb( eventarc.CreateEnrollmentRequest() ) @@ -30477,6 +30681,7 @@ def test_create_enrollment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_enrollment( request, @@ -30488,6 +30693,7 @@ def test_create_enrollment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_enrollment_rest_bad_request( @@ -30650,10 +30856,13 @@ def test_update_enrollment_rest_interceptors(null_interceptor): ), mock.patch.object( transports.EventarcRestInterceptor, "post_update_enrollment" ) as post, mock.patch.object( + transports.EventarcRestInterceptor, "post_update_enrollment_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.EventarcRestInterceptor, "pre_update_enrollment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = eventarc.UpdateEnrollmentRequest.pb( eventarc.UpdateEnrollmentRequest() ) @@ -30677,6 +30886,7 @@ def test_update_enrollment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.update_enrollment( request, @@ -30688,6 +30898,7 @@ def test_update_enrollment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_enrollment_rest_bad_request( @@ -30766,10 +30977,13 @@ def test_delete_enrollment_rest_interceptors(null_interceptor): ), mock.patch.object( transports.EventarcRestInterceptor, "post_delete_enrollment" ) as post, mock.patch.object( + transports.EventarcRestInterceptor, "post_delete_enrollment_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.EventarcRestInterceptor, "pre_delete_enrollment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = eventarc.DeleteEnrollmentRequest.pb( eventarc.DeleteEnrollmentRequest() ) @@ -30793,6 +31007,7 @@ def test_delete_enrollment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_enrollment( request, @@ -30804,6 +31019,7 @@ def test_delete_enrollment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_pipeline_rest_bad_request(request_type=eventarc.GetPipelineRequest): @@ -30892,10 +31108,13 @@ def test_get_pipeline_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.EventarcRestInterceptor, "post_get_pipeline" ) as post, mock.patch.object( + transports.EventarcRestInterceptor, "post_get_pipeline_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.EventarcRestInterceptor, "pre_get_pipeline" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = eventarc.GetPipelineRequest.pb(eventarc.GetPipelineRequest()) transcode.return_value = { "method": "post", @@ -30917,6 +31136,7 @@ def test_get_pipeline_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = pipeline.Pipeline() + post_with_metadata.return_value = pipeline.Pipeline(), metadata client.get_pipeline( request, @@ -30928,6 +31148,7 @@ def test_get_pipeline_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_pipelines_rest_bad_request(request_type=eventarc.ListPipelinesRequest): @@ -31010,10 +31231,13 @@ def test_list_pipelines_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.EventarcRestInterceptor, "post_list_pipelines" ) as post, mock.patch.object( + transports.EventarcRestInterceptor, "post_list_pipelines_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.EventarcRestInterceptor, "pre_list_pipelines" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = eventarc.ListPipelinesRequest.pb(eventarc.ListPipelinesRequest()) transcode.return_value = { "method": "post", @@ -31037,6 +31261,7 @@ def test_list_pipelines_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = eventarc.ListPipelinesResponse() + post_with_metadata.return_value = eventarc.ListPipelinesResponse(), metadata client.list_pipelines( request, @@ -31048,6 +31273,7 @@ def test_list_pipelines_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_pipeline_rest_bad_request(request_type=eventarc.CreatePipelineRequest): @@ -31243,10 +31469,13 @@ def test_create_pipeline_rest_interceptors(null_interceptor): ), mock.patch.object( transports.EventarcRestInterceptor, "post_create_pipeline" ) as post, mock.patch.object( + transports.EventarcRestInterceptor, "post_create_pipeline_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.EventarcRestInterceptor, "pre_create_pipeline" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = eventarc.CreatePipelineRequest.pb(eventarc.CreatePipelineRequest()) transcode.return_value = { "method": "post", @@ -31268,6 +31497,7 @@ def test_create_pipeline_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_pipeline( request, @@ -31279,6 +31509,7 @@ def test_create_pipeline_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_pipeline_rest_bad_request(request_type=eventarc.UpdatePipelineRequest): @@ -31478,10 +31709,13 @@ def test_update_pipeline_rest_interceptors(null_interceptor): ), mock.patch.object( transports.EventarcRestInterceptor, "post_update_pipeline" ) as post, mock.patch.object( + transports.EventarcRestInterceptor, "post_update_pipeline_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.EventarcRestInterceptor, "pre_update_pipeline" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = eventarc.UpdatePipelineRequest.pb(eventarc.UpdatePipelineRequest()) transcode.return_value = { "method": "post", @@ -31503,6 +31737,7 @@ def test_update_pipeline_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.update_pipeline( request, @@ -31514,6 +31749,7 @@ def test_update_pipeline_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_pipeline_rest_bad_request(request_type=eventarc.DeletePipelineRequest): @@ -31590,10 +31826,13 @@ def test_delete_pipeline_rest_interceptors(null_interceptor): ), mock.patch.object( transports.EventarcRestInterceptor, "post_delete_pipeline" ) as post, mock.patch.object( + transports.EventarcRestInterceptor, "post_delete_pipeline_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.EventarcRestInterceptor, "pre_delete_pipeline" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = eventarc.DeletePipelineRequest.pb(eventarc.DeletePipelineRequest()) transcode.return_value = { "method": "post", @@ -31615,6 +31854,7 @@ def test_delete_pipeline_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_pipeline( request, @@ -31626,6 +31866,7 @@ def test_delete_pipeline_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_google_api_source_rest_bad_request( @@ -31722,10 +31963,13 @@ def test_get_google_api_source_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.EventarcRestInterceptor, "post_get_google_api_source" ) as post, mock.patch.object( + transports.EventarcRestInterceptor, "post_get_google_api_source_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.EventarcRestInterceptor, "pre_get_google_api_source" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = eventarc.GetGoogleApiSourceRequest.pb( eventarc.GetGoogleApiSourceRequest() ) @@ -31751,6 +31995,7 @@ def test_get_google_api_source_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = google_api_source.GoogleApiSource() + post_with_metadata.return_value = google_api_source.GoogleApiSource(), metadata client.get_google_api_source( request, @@ -31762,6 +32007,7 @@ def test_get_google_api_source_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_google_api_sources_rest_bad_request( @@ -31846,10 +32092,13 @@ def test_list_google_api_sources_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.EventarcRestInterceptor, "post_list_google_api_sources" ) as post, mock.patch.object( + transports.EventarcRestInterceptor, "post_list_google_api_sources_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.EventarcRestInterceptor, "pre_list_google_api_sources" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = eventarc.ListGoogleApiSourcesRequest.pb( eventarc.ListGoogleApiSourcesRequest() ) @@ -31875,6 +32124,10 @@ def test_list_google_api_sources_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = eventarc.ListGoogleApiSourcesResponse() + post_with_metadata.return_value = ( + eventarc.ListGoogleApiSourcesResponse(), + metadata, + ) client.list_google_api_sources( request, @@ -31886,6 +32139,7 @@ def test_list_google_api_sources_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_google_api_source_rest_bad_request( @@ -32044,10 +32298,14 @@ def test_create_google_api_source_rest_interceptors(null_interceptor): ), mock.patch.object( transports.EventarcRestInterceptor, "post_create_google_api_source" ) as post, mock.patch.object( + transports.EventarcRestInterceptor, + "post_create_google_api_source_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.EventarcRestInterceptor, "pre_create_google_api_source" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = eventarc.CreateGoogleApiSourceRequest.pb( eventarc.CreateGoogleApiSourceRequest() ) @@ -32071,6 +32329,7 @@ def test_create_google_api_source_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_google_api_source( request, @@ -32082,6 +32341,7 @@ def test_create_google_api_source_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_google_api_source_rest_bad_request( @@ -32248,10 +32508,14 @@ def test_update_google_api_source_rest_interceptors(null_interceptor): ), mock.patch.object( transports.EventarcRestInterceptor, "post_update_google_api_source" ) as post, mock.patch.object( + transports.EventarcRestInterceptor, + "post_update_google_api_source_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.EventarcRestInterceptor, "pre_update_google_api_source" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = eventarc.UpdateGoogleApiSourceRequest.pb( eventarc.UpdateGoogleApiSourceRequest() ) @@ -32275,6 +32539,7 @@ def test_update_google_api_source_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.update_google_api_source( request, @@ -32286,6 +32551,7 @@ def test_update_google_api_source_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_google_api_source_rest_bad_request( @@ -32368,10 +32634,14 @@ def test_delete_google_api_source_rest_interceptors(null_interceptor): ), mock.patch.object( transports.EventarcRestInterceptor, "post_delete_google_api_source" ) as post, mock.patch.object( + transports.EventarcRestInterceptor, + "post_delete_google_api_source_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.EventarcRestInterceptor, "pre_delete_google_api_source" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = eventarc.DeleteGoogleApiSourceRequest.pb( eventarc.DeleteGoogleApiSourceRequest() ) @@ -32395,6 +32665,7 @@ def test_delete_google_api_source_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_google_api_source( request, @@ -32406,6 +32677,7 @@ def test_delete_google_api_source_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_location_rest_bad_request(request_type=locations_pb2.GetLocationRequest): diff --git a/packages/google-cloud-filestore/google/cloud/filestore/gapic_version.py b/packages/google-cloud-filestore/google/cloud/filestore/gapic_version.py index 50d842f376d0..558c8aab67c5 100644 --- a/packages/google-cloud-filestore/google/cloud/filestore/gapic_version.py +++ b/packages/google-cloud-filestore/google/cloud/filestore/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.11.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-filestore/google/cloud/filestore_v1/gapic_version.py b/packages/google-cloud-filestore/google/cloud/filestore_v1/gapic_version.py index 50d842f376d0..558c8aab67c5 100644 --- a/packages/google-cloud-filestore/google/cloud/filestore_v1/gapic_version.py +++ b/packages/google-cloud-filestore/google/cloud/filestore_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.11.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-filestore/google/cloud/filestore_v1/services/cloud_filestore_manager/client.py b/packages/google-cloud-filestore/google/cloud/filestore_v1/services/cloud_filestore_manager/client.py index 273d0c676af5..ebb46394e114 100644 --- a/packages/google-cloud-filestore/google/cloud/filestore_v1/services/cloud_filestore_manager/client.py +++ b/packages/google-cloud-filestore/google/cloud/filestore_v1/services/cloud_filestore_manager/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -565,6 +567,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. @@ -2960,16 +2989,20 @@ def list_operations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def get_operation( self, @@ -3015,16 +3048,20 @@ def get_operation( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def delete_operation( self, @@ -3181,16 +3218,20 @@ def get_location( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def list_locations( self, @@ -3236,16 +3277,20 @@ def list_locations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-filestore/google/cloud/filestore_v1/services/cloud_filestore_manager/transports/rest.py b/packages/google-cloud-filestore/google/cloud/filestore_v1/services/cloud_filestore_manager/transports/rest.py index 6c7a98c40c74..f5e9e508aa19 100644 --- a/packages/google-cloud-filestore/google/cloud/filestore_v1/services/cloud_filestore_manager/transports/rest.py +++ b/packages/google-cloud-filestore/google/cloud/filestore_v1/services/cloud_filestore_manager/transports/rest.py @@ -232,12 +232,35 @@ def post_create_backup( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_backup - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_backup_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudFilestoreManager server but before - it is returned to user code. + it is returned to user code. This `post_create_backup` interceptor runs + before the `post_create_backup_with_metadata` interceptor. """ return response + def post_create_backup_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_backup + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudFilestoreManager server but before it is returned to user code. + + We recommend only using this `post_create_backup_with_metadata` + interceptor in new development instead of the `post_create_backup` interceptor. + When both interceptors are used, this `post_create_backup_with_metadata` interceptor runs after the + `post_create_backup` interceptor. The (possibly modified) response returned by + `post_create_backup` will be passed to + `post_create_backup_with_metadata`. + """ + return response, metadata + def pre_create_instance( self, request: cloud_filestore_service.CreateInstanceRequest, @@ -258,12 +281,35 @@ def post_create_instance( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_instance - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_instance_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudFilestoreManager server but before - it is returned to user code. + it is returned to user code. This `post_create_instance` interceptor runs + before the `post_create_instance_with_metadata` interceptor. """ return response + def post_create_instance_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_instance + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudFilestoreManager server but before it is returned to user code. + + We recommend only using this `post_create_instance_with_metadata` + interceptor in new development instead of the `post_create_instance` interceptor. + When both interceptors are used, this `post_create_instance_with_metadata` interceptor runs after the + `post_create_instance` interceptor. The (possibly modified) response returned by + `post_create_instance` will be passed to + `post_create_instance_with_metadata`. + """ + return response, metadata + def pre_create_snapshot( self, request: cloud_filestore_service.CreateSnapshotRequest, @@ -284,12 +330,35 @@ def post_create_snapshot( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_snapshot - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_snapshot_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudFilestoreManager server but before - it is returned to user code. + it is returned to user code. This `post_create_snapshot` interceptor runs + before the `post_create_snapshot_with_metadata` interceptor. """ return response + def post_create_snapshot_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_snapshot + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudFilestoreManager server but before it is returned to user code. + + We recommend only using this `post_create_snapshot_with_metadata` + interceptor in new development instead of the `post_create_snapshot` interceptor. + When both interceptors are used, this `post_create_snapshot_with_metadata` interceptor runs after the + `post_create_snapshot` interceptor. The (possibly modified) response returned by + `post_create_snapshot` will be passed to + `post_create_snapshot_with_metadata`. + """ + return response, metadata + def pre_delete_backup( self, request: cloud_filestore_service.DeleteBackupRequest, @@ -310,12 +379,35 @@ def post_delete_backup( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_backup - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_backup_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudFilestoreManager server but before - it is returned to user code. + it is returned to user code. This `post_delete_backup` interceptor runs + before the `post_delete_backup_with_metadata` interceptor. """ return response + def post_delete_backup_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_backup + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudFilestoreManager server but before it is returned to user code. + + We recommend only using this `post_delete_backup_with_metadata` + interceptor in new development instead of the `post_delete_backup` interceptor. + When both interceptors are used, this `post_delete_backup_with_metadata` interceptor runs after the + `post_delete_backup` interceptor. The (possibly modified) response returned by + `post_delete_backup` will be passed to + `post_delete_backup_with_metadata`. + """ + return response, metadata + def pre_delete_instance( self, request: cloud_filestore_service.DeleteInstanceRequest, @@ -336,12 +428,35 @@ def post_delete_instance( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_instance - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_instance_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudFilestoreManager server but before - it is returned to user code. + it is returned to user code. This `post_delete_instance` interceptor runs + before the `post_delete_instance_with_metadata` interceptor. """ return response + def post_delete_instance_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_instance + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudFilestoreManager server but before it is returned to user code. + + We recommend only using this `post_delete_instance_with_metadata` + interceptor in new development instead of the `post_delete_instance` interceptor. + When both interceptors are used, this `post_delete_instance_with_metadata` interceptor runs after the + `post_delete_instance` interceptor. The (possibly modified) response returned by + `post_delete_instance` will be passed to + `post_delete_instance_with_metadata`. + """ + return response, metadata + def pre_delete_snapshot( self, request: cloud_filestore_service.DeleteSnapshotRequest, @@ -362,12 +477,35 @@ def post_delete_snapshot( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_snapshot - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_snapshot_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudFilestoreManager server but before - it is returned to user code. + it is returned to user code. This `post_delete_snapshot` interceptor runs + before the `post_delete_snapshot_with_metadata` interceptor. """ return response + def post_delete_snapshot_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_snapshot + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudFilestoreManager server but before it is returned to user code. + + We recommend only using this `post_delete_snapshot_with_metadata` + interceptor in new development instead of the `post_delete_snapshot` interceptor. + When both interceptors are used, this `post_delete_snapshot_with_metadata` interceptor runs after the + `post_delete_snapshot` interceptor. The (possibly modified) response returned by + `post_delete_snapshot` will be passed to + `post_delete_snapshot_with_metadata`. + """ + return response, metadata + def pre_get_backup( self, request: cloud_filestore_service.GetBackupRequest, @@ -388,12 +526,35 @@ def post_get_backup( ) -> cloud_filestore_service.Backup: """Post-rpc interceptor for get_backup - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_backup_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudFilestoreManager server but before - it is returned to user code. + it is returned to user code. This `post_get_backup` interceptor runs + before the `post_get_backup_with_metadata` interceptor. """ return response + def post_get_backup_with_metadata( + self, + response: cloud_filestore_service.Backup, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cloud_filestore_service.Backup, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_backup + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudFilestoreManager server but before it is returned to user code. + + We recommend only using this `post_get_backup_with_metadata` + interceptor in new development instead of the `post_get_backup` interceptor. + When both interceptors are used, this `post_get_backup_with_metadata` interceptor runs after the + `post_get_backup` interceptor. The (possibly modified) response returned by + `post_get_backup` will be passed to + `post_get_backup_with_metadata`. + """ + return response, metadata + def pre_get_instance( self, request: cloud_filestore_service.GetInstanceRequest, @@ -414,12 +575,37 @@ def post_get_instance( ) -> cloud_filestore_service.Instance: """Post-rpc interceptor for get_instance - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_instance_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudFilestoreManager server but before - it is returned to user code. + it is returned to user code. This `post_get_instance` interceptor runs + before the `post_get_instance_with_metadata` interceptor. """ return response + def post_get_instance_with_metadata( + self, + response: cloud_filestore_service.Instance, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + cloud_filestore_service.Instance, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_instance + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudFilestoreManager server but before it is returned to user code. + + We recommend only using this `post_get_instance_with_metadata` + interceptor in new development instead of the `post_get_instance` interceptor. + When both interceptors are used, this `post_get_instance_with_metadata` interceptor runs after the + `post_get_instance` interceptor. The (possibly modified) response returned by + `post_get_instance` will be passed to + `post_get_instance_with_metadata`. + """ + return response, metadata + def pre_get_snapshot( self, request: cloud_filestore_service.GetSnapshotRequest, @@ -440,12 +626,37 @@ def post_get_snapshot( ) -> cloud_filestore_service.Snapshot: """Post-rpc interceptor for get_snapshot - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_snapshot_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudFilestoreManager server but before - it is returned to user code. + it is returned to user code. This `post_get_snapshot` interceptor runs + before the `post_get_snapshot_with_metadata` interceptor. """ return response + def post_get_snapshot_with_metadata( + self, + response: cloud_filestore_service.Snapshot, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + cloud_filestore_service.Snapshot, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_snapshot + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudFilestoreManager server but before it is returned to user code. + + We recommend only using this `post_get_snapshot_with_metadata` + interceptor in new development instead of the `post_get_snapshot` interceptor. + When both interceptors are used, this `post_get_snapshot_with_metadata` interceptor runs after the + `post_get_snapshot` interceptor. The (possibly modified) response returned by + `post_get_snapshot` will be passed to + `post_get_snapshot_with_metadata`. + """ + return response, metadata + def pre_list_backups( self, request: cloud_filestore_service.ListBackupsRequest, @@ -466,12 +677,38 @@ def post_list_backups( ) -> cloud_filestore_service.ListBackupsResponse: """Post-rpc interceptor for list_backups - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_backups_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudFilestoreManager server but before - it is returned to user code. + it is returned to user code. This `post_list_backups` interceptor runs + before the `post_list_backups_with_metadata` interceptor. """ return response + def post_list_backups_with_metadata( + self, + response: cloud_filestore_service.ListBackupsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + cloud_filestore_service.ListBackupsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_backups + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudFilestoreManager server but before it is returned to user code. + + We recommend only using this `post_list_backups_with_metadata` + interceptor in new development instead of the `post_list_backups` interceptor. + When both interceptors are used, this `post_list_backups_with_metadata` interceptor runs after the + `post_list_backups` interceptor. The (possibly modified) response returned by + `post_list_backups` will be passed to + `post_list_backups_with_metadata`. + """ + return response, metadata + def pre_list_instances( self, request: cloud_filestore_service.ListInstancesRequest, @@ -492,12 +729,38 @@ def post_list_instances( ) -> cloud_filestore_service.ListInstancesResponse: """Post-rpc interceptor for list_instances - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_instances_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudFilestoreManager server but before - it is returned to user code. + it is returned to user code. This `post_list_instances` interceptor runs + before the `post_list_instances_with_metadata` interceptor. """ return response + def post_list_instances_with_metadata( + self, + response: cloud_filestore_service.ListInstancesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + cloud_filestore_service.ListInstancesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_instances + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudFilestoreManager server but before it is returned to user code. + + We recommend only using this `post_list_instances_with_metadata` + interceptor in new development instead of the `post_list_instances` interceptor. + When both interceptors are used, this `post_list_instances_with_metadata` interceptor runs after the + `post_list_instances` interceptor. The (possibly modified) response returned by + `post_list_instances` will be passed to + `post_list_instances_with_metadata`. + """ + return response, metadata + def pre_list_snapshots( self, request: cloud_filestore_service.ListSnapshotsRequest, @@ -518,12 +781,38 @@ def post_list_snapshots( ) -> cloud_filestore_service.ListSnapshotsResponse: """Post-rpc interceptor for list_snapshots - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_snapshots_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudFilestoreManager server but before - it is returned to user code. + it is returned to user code. This `post_list_snapshots` interceptor runs + before the `post_list_snapshots_with_metadata` interceptor. """ return response + def post_list_snapshots_with_metadata( + self, + response: cloud_filestore_service.ListSnapshotsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + cloud_filestore_service.ListSnapshotsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_snapshots + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudFilestoreManager server but before it is returned to user code. + + We recommend only using this `post_list_snapshots_with_metadata` + interceptor in new development instead of the `post_list_snapshots` interceptor. + When both interceptors are used, this `post_list_snapshots_with_metadata` interceptor runs after the + `post_list_snapshots` interceptor. The (possibly modified) response returned by + `post_list_snapshots` will be passed to + `post_list_snapshots_with_metadata`. + """ + return response, metadata + def pre_restore_instance( self, request: cloud_filestore_service.RestoreInstanceRequest, @@ -544,12 +833,35 @@ def post_restore_instance( ) -> operations_pb2.Operation: """Post-rpc interceptor for restore_instance - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_restore_instance_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudFilestoreManager server but before - it is returned to user code. + it is returned to user code. This `post_restore_instance` interceptor runs + before the `post_restore_instance_with_metadata` interceptor. """ return response + def post_restore_instance_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for restore_instance + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudFilestoreManager server but before it is returned to user code. + + We recommend only using this `post_restore_instance_with_metadata` + interceptor in new development instead of the `post_restore_instance` interceptor. + When both interceptors are used, this `post_restore_instance_with_metadata` interceptor runs after the + `post_restore_instance` interceptor. The (possibly modified) response returned by + `post_restore_instance` will be passed to + `post_restore_instance_with_metadata`. + """ + return response, metadata + def pre_revert_instance( self, request: cloud_filestore_service.RevertInstanceRequest, @@ -570,12 +882,35 @@ def post_revert_instance( ) -> operations_pb2.Operation: """Post-rpc interceptor for revert_instance - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_revert_instance_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudFilestoreManager server but before - it is returned to user code. + it is returned to user code. This `post_revert_instance` interceptor runs + before the `post_revert_instance_with_metadata` interceptor. """ return response + def post_revert_instance_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for revert_instance + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudFilestoreManager server but before it is returned to user code. + + We recommend only using this `post_revert_instance_with_metadata` + interceptor in new development instead of the `post_revert_instance` interceptor. + When both interceptors are used, this `post_revert_instance_with_metadata` interceptor runs after the + `post_revert_instance` interceptor. The (possibly modified) response returned by + `post_revert_instance` will be passed to + `post_revert_instance_with_metadata`. + """ + return response, metadata + def pre_update_backup( self, request: cloud_filestore_service.UpdateBackupRequest, @@ -596,12 +931,35 @@ def post_update_backup( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_backup - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_backup_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudFilestoreManager server but before - it is returned to user code. + it is returned to user code. This `post_update_backup` interceptor runs + before the `post_update_backup_with_metadata` interceptor. """ return response + def post_update_backup_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_backup + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudFilestoreManager server but before it is returned to user code. + + We recommend only using this `post_update_backup_with_metadata` + interceptor in new development instead of the `post_update_backup` interceptor. + When both interceptors are used, this `post_update_backup_with_metadata` interceptor runs after the + `post_update_backup` interceptor. The (possibly modified) response returned by + `post_update_backup` will be passed to + `post_update_backup_with_metadata`. + """ + return response, metadata + def pre_update_instance( self, request: cloud_filestore_service.UpdateInstanceRequest, @@ -622,12 +980,35 @@ def post_update_instance( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_instance - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_instance_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudFilestoreManager server but before - it is returned to user code. + it is returned to user code. This `post_update_instance` interceptor runs + before the `post_update_instance_with_metadata` interceptor. """ return response + def post_update_instance_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_instance + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudFilestoreManager server but before it is returned to user code. + + We recommend only using this `post_update_instance_with_metadata` + interceptor in new development instead of the `post_update_instance` interceptor. + When both interceptors are used, this `post_update_instance_with_metadata` interceptor runs after the + `post_update_instance` interceptor. The (possibly modified) response returned by + `post_update_instance` will be passed to + `post_update_instance_with_metadata`. + """ + return response, metadata + def pre_update_snapshot( self, request: cloud_filestore_service.UpdateSnapshotRequest, @@ -648,12 +1029,35 @@ def post_update_snapshot( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_snapshot - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_snapshot_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudFilestoreManager server but before - it is returned to user code. + it is returned to user code. This `post_update_snapshot` interceptor runs + before the `post_update_snapshot_with_metadata` interceptor. """ return response + def post_update_snapshot_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_snapshot + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudFilestoreManager server but before it is returned to user code. + + We recommend only using this `post_update_snapshot_with_metadata` + interceptor in new development instead of the `post_update_snapshot` interceptor. + When both interceptors are used, this `post_update_snapshot_with_metadata` interceptor runs after the + `post_update_snapshot` interceptor. The (possibly modified) response returned by + `post_update_snapshot` will be passed to + `post_update_snapshot_with_metadata`. + """ + return response, metadata + def pre_get_location( self, request: locations_pb2.GetLocationRequest, @@ -1088,6 +1492,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_backup(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_backup_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1237,6 +1645,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_instance(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_instance_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1386,6 +1798,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_snapshot(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_snapshot_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1528,6 +1944,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_backup(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_backup_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1671,6 +2091,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_instance(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_instance_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1814,6 +2238,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_snapshot(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_snapshot_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1956,6 +2384,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_backup(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_backup_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2098,6 +2530,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_instance(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_instance_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2242,6 +2678,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_snapshot(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_snapshot_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2387,6 +2827,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_backups(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_backups_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2532,6 +2976,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_instances(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_instances_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2677,6 +3125,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_snapshots(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_snapshots_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2833,6 +3285,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_restore_instance(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_restore_instance_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2983,6 +3439,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_revert_instance(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_revert_instance_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3132,6 +3592,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_backup(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_backup_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3281,6 +3745,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_instance(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_instance_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3431,6 +3899,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_snapshot(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_snapshot_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-filestore/samples/generated_samples/snippet_metadata_google.cloud.filestore.v1.json b/packages/google-cloud-filestore/samples/generated_samples/snippet_metadata_google.cloud.filestore.v1.json index 0d0ed54e673b..c98cfe93c029 100644 --- a/packages/google-cloud-filestore/samples/generated_samples/snippet_metadata_google.cloud.filestore.v1.json +++ b/packages/google-cloud-filestore/samples/generated_samples/snippet_metadata_google.cloud.filestore.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-filestore", - "version": "1.11.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-filestore/tests/unit/gapic/filestore_v1/test_cloud_filestore_manager.py b/packages/google-cloud-filestore/tests/unit/gapic/filestore_v1/test_cloud_filestore_manager.py index 12173798f328..c97c064f5c87 100644 --- a/packages/google-cloud-filestore/tests/unit/gapic/filestore_v1/test_cloud_filestore_manager.py +++ b/packages/google-cloud-filestore/tests/unit/gapic/filestore_v1/test_cloud_filestore_manager.py @@ -76,6 +76,13 @@ ) from google.cloud.filestore_v1.types import cloud_filestore_service +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -351,6 +358,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = CloudFilestoreManagerClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=["foo"]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + if show_cred_info: + assert error.details == ["foo", CRED_INFO_STRING] + else: + assert error.details == ["foo"] + + +@pytest.mark.parametrize("error_code", [401, 403, 404, 500]) +def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code): + cred = mock.Mock([]) + assert not hasattr(cred, "get_cred_info") + client = CloudFilestoreManagerClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -11571,10 +11621,14 @@ def test_list_instances_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudFilestoreManagerRestInterceptor, "post_list_instances" ) as post, mock.patch.object( + transports.CloudFilestoreManagerRestInterceptor, + "post_list_instances_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudFilestoreManagerRestInterceptor, "pre_list_instances" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_filestore_service.ListInstancesRequest.pb( cloud_filestore_service.ListInstancesRequest() ) @@ -11600,6 +11654,10 @@ def test_list_instances_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloud_filestore_service.ListInstancesResponse() + post_with_metadata.return_value = ( + cloud_filestore_service.ListInstancesResponse(), + metadata, + ) client.list_instances( request, @@ -11611,6 +11669,7 @@ def test_list_instances_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_instance_rest_bad_request( @@ -11715,10 +11774,14 @@ def test_get_instance_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudFilestoreManagerRestInterceptor, "post_get_instance" ) as post, mock.patch.object( + transports.CloudFilestoreManagerRestInterceptor, + "post_get_instance_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudFilestoreManagerRestInterceptor, "pre_get_instance" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_filestore_service.GetInstanceRequest.pb( cloud_filestore_service.GetInstanceRequest() ) @@ -11744,6 +11807,7 @@ def test_get_instance_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloud_filestore_service.Instance() + post_with_metadata.return_value = cloud_filestore_service.Instance(), metadata client.get_instance( request, @@ -11755,6 +11819,7 @@ def test_get_instance_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_instance_rest_bad_request( @@ -11941,10 +12006,14 @@ def test_create_instance_rest_interceptors(null_interceptor): ), mock.patch.object( transports.CloudFilestoreManagerRestInterceptor, "post_create_instance" ) as post, mock.patch.object( + transports.CloudFilestoreManagerRestInterceptor, + "post_create_instance_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudFilestoreManagerRestInterceptor, "pre_create_instance" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_filestore_service.CreateInstanceRequest.pb( cloud_filestore_service.CreateInstanceRequest() ) @@ -11968,6 +12037,7 @@ def test_create_instance_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_instance( request, @@ -11979,6 +12049,7 @@ def test_create_instance_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_instance_rest_bad_request( @@ -12169,10 +12240,14 @@ def test_update_instance_rest_interceptors(null_interceptor): ), mock.patch.object( transports.CloudFilestoreManagerRestInterceptor, "post_update_instance" ) as post, mock.patch.object( + transports.CloudFilestoreManagerRestInterceptor, + "post_update_instance_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudFilestoreManagerRestInterceptor, "pre_update_instance" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_filestore_service.UpdateInstanceRequest.pb( cloud_filestore_service.UpdateInstanceRequest() ) @@ -12196,6 +12271,7 @@ def test_update_instance_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.update_instance( request, @@ -12207,6 +12283,7 @@ def test_update_instance_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_restore_instance_rest_bad_request( @@ -12287,10 +12364,14 @@ def test_restore_instance_rest_interceptors(null_interceptor): ), mock.patch.object( transports.CloudFilestoreManagerRestInterceptor, "post_restore_instance" ) as post, mock.patch.object( + transports.CloudFilestoreManagerRestInterceptor, + "post_restore_instance_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudFilestoreManagerRestInterceptor, "pre_restore_instance" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_filestore_service.RestoreInstanceRequest.pb( cloud_filestore_service.RestoreInstanceRequest() ) @@ -12314,6 +12395,7 @@ def test_restore_instance_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.restore_instance( request, @@ -12325,6 +12407,7 @@ def test_restore_instance_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_revert_instance_rest_bad_request( @@ -12405,10 +12488,14 @@ def test_revert_instance_rest_interceptors(null_interceptor): ), mock.patch.object( transports.CloudFilestoreManagerRestInterceptor, "post_revert_instance" ) as post, mock.patch.object( + transports.CloudFilestoreManagerRestInterceptor, + "post_revert_instance_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudFilestoreManagerRestInterceptor, "pre_revert_instance" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_filestore_service.RevertInstanceRequest.pb( cloud_filestore_service.RevertInstanceRequest() ) @@ -12432,6 +12519,7 @@ def test_revert_instance_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.revert_instance( request, @@ -12443,6 +12531,7 @@ def test_revert_instance_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_instance_rest_bad_request( @@ -12523,10 +12612,14 @@ def test_delete_instance_rest_interceptors(null_interceptor): ), mock.patch.object( transports.CloudFilestoreManagerRestInterceptor, "post_delete_instance" ) as post, mock.patch.object( + transports.CloudFilestoreManagerRestInterceptor, + "post_delete_instance_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudFilestoreManagerRestInterceptor, "pre_delete_instance" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_filestore_service.DeleteInstanceRequest.pb( cloud_filestore_service.DeleteInstanceRequest() ) @@ -12550,6 +12643,7 @@ def test_delete_instance_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_instance( request, @@ -12561,6 +12655,7 @@ def test_delete_instance_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_snapshots_rest_bad_request( @@ -12645,10 +12740,14 @@ def test_list_snapshots_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudFilestoreManagerRestInterceptor, "post_list_snapshots" ) as post, mock.patch.object( + transports.CloudFilestoreManagerRestInterceptor, + "post_list_snapshots_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudFilestoreManagerRestInterceptor, "pre_list_snapshots" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_filestore_service.ListSnapshotsRequest.pb( cloud_filestore_service.ListSnapshotsRequest() ) @@ -12674,6 +12773,10 @@ def test_list_snapshots_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloud_filestore_service.ListSnapshotsResponse() + post_with_metadata.return_value = ( + cloud_filestore_service.ListSnapshotsResponse(), + metadata, + ) client.list_snapshots( request, @@ -12685,6 +12788,7 @@ def test_list_snapshots_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_snapshot_rest_bad_request( @@ -12779,10 +12883,14 @@ def test_get_snapshot_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudFilestoreManagerRestInterceptor, "post_get_snapshot" ) as post, mock.patch.object( + transports.CloudFilestoreManagerRestInterceptor, + "post_get_snapshot_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudFilestoreManagerRestInterceptor, "pre_get_snapshot" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_filestore_service.GetSnapshotRequest.pb( cloud_filestore_service.GetSnapshotRequest() ) @@ -12808,6 +12916,7 @@ def test_get_snapshot_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloud_filestore_service.Snapshot() + post_with_metadata.return_value = cloud_filestore_service.Snapshot(), metadata client.get_snapshot( request, @@ -12819,6 +12928,7 @@ def test_get_snapshot_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_snapshot_rest_bad_request( @@ -12974,10 +13084,14 @@ def test_create_snapshot_rest_interceptors(null_interceptor): ), mock.patch.object( transports.CloudFilestoreManagerRestInterceptor, "post_create_snapshot" ) as post, mock.patch.object( + transports.CloudFilestoreManagerRestInterceptor, + "post_create_snapshot_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudFilestoreManagerRestInterceptor, "pre_create_snapshot" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_filestore_service.CreateSnapshotRequest.pb( cloud_filestore_service.CreateSnapshotRequest() ) @@ -13001,6 +13115,7 @@ def test_create_snapshot_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_snapshot( request, @@ -13012,6 +13127,7 @@ def test_create_snapshot_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_snapshot_rest_bad_request( @@ -13096,10 +13212,14 @@ def test_delete_snapshot_rest_interceptors(null_interceptor): ), mock.patch.object( transports.CloudFilestoreManagerRestInterceptor, "post_delete_snapshot" ) as post, mock.patch.object( + transports.CloudFilestoreManagerRestInterceptor, + "post_delete_snapshot_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudFilestoreManagerRestInterceptor, "pre_delete_snapshot" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_filestore_service.DeleteSnapshotRequest.pb( cloud_filestore_service.DeleteSnapshotRequest() ) @@ -13123,6 +13243,7 @@ def test_delete_snapshot_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_snapshot( request, @@ -13134,6 +13255,7 @@ def test_delete_snapshot_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_snapshot_rest_bad_request( @@ -13297,10 +13419,14 @@ def test_update_snapshot_rest_interceptors(null_interceptor): ), mock.patch.object( transports.CloudFilestoreManagerRestInterceptor, "post_update_snapshot" ) as post, mock.patch.object( + transports.CloudFilestoreManagerRestInterceptor, + "post_update_snapshot_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudFilestoreManagerRestInterceptor, "pre_update_snapshot" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_filestore_service.UpdateSnapshotRequest.pb( cloud_filestore_service.UpdateSnapshotRequest() ) @@ -13324,6 +13450,7 @@ def test_update_snapshot_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.update_snapshot( request, @@ -13335,6 +13462,7 @@ def test_update_snapshot_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_backups_rest_bad_request( @@ -13421,10 +13549,14 @@ def test_list_backups_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudFilestoreManagerRestInterceptor, "post_list_backups" ) as post, mock.patch.object( + transports.CloudFilestoreManagerRestInterceptor, + "post_list_backups_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudFilestoreManagerRestInterceptor, "pre_list_backups" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_filestore_service.ListBackupsRequest.pb( cloud_filestore_service.ListBackupsRequest() ) @@ -13450,6 +13582,10 @@ def test_list_backups_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloud_filestore_service.ListBackupsResponse() + post_with_metadata.return_value = ( + cloud_filestore_service.ListBackupsResponse(), + metadata, + ) client.list_backups( request, @@ -13461,6 +13597,7 @@ def test_list_backups_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_backup_rest_bad_request( @@ -13567,10 +13704,13 @@ def test_get_backup_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudFilestoreManagerRestInterceptor, "post_get_backup" ) as post, mock.patch.object( + transports.CloudFilestoreManagerRestInterceptor, "post_get_backup_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudFilestoreManagerRestInterceptor, "pre_get_backup" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_filestore_service.GetBackupRequest.pb( cloud_filestore_service.GetBackupRequest() ) @@ -13596,6 +13736,7 @@ def test_get_backup_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloud_filestore_service.Backup() + post_with_metadata.return_value = cloud_filestore_service.Backup(), metadata client.get_backup( request, @@ -13607,6 +13748,7 @@ def test_get_backup_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_backup_rest_bad_request( @@ -13770,10 +13912,14 @@ def test_create_backup_rest_interceptors(null_interceptor): ), mock.patch.object( transports.CloudFilestoreManagerRestInterceptor, "post_create_backup" ) as post, mock.patch.object( + transports.CloudFilestoreManagerRestInterceptor, + "post_create_backup_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudFilestoreManagerRestInterceptor, "pre_create_backup" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_filestore_service.CreateBackupRequest.pb( cloud_filestore_service.CreateBackupRequest() ) @@ -13797,6 +13943,7 @@ def test_create_backup_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_backup( request, @@ -13808,6 +13955,7 @@ def test_create_backup_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_backup_rest_bad_request( @@ -13888,10 +14036,14 @@ def test_delete_backup_rest_interceptors(null_interceptor): ), mock.patch.object( transports.CloudFilestoreManagerRestInterceptor, "post_delete_backup" ) as post, mock.patch.object( + transports.CloudFilestoreManagerRestInterceptor, + "post_delete_backup_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudFilestoreManagerRestInterceptor, "pre_delete_backup" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_filestore_service.DeleteBackupRequest.pb( cloud_filestore_service.DeleteBackupRequest() ) @@ -13915,6 +14067,7 @@ def test_delete_backup_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_backup( request, @@ -13926,6 +14079,7 @@ def test_delete_backup_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_backup_rest_bad_request( @@ -14093,10 +14247,14 @@ def test_update_backup_rest_interceptors(null_interceptor): ), mock.patch.object( transports.CloudFilestoreManagerRestInterceptor, "post_update_backup" ) as post, mock.patch.object( + transports.CloudFilestoreManagerRestInterceptor, + "post_update_backup_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudFilestoreManagerRestInterceptor, "pre_update_backup" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_filestore_service.UpdateBackupRequest.pb( cloud_filestore_service.UpdateBackupRequest() ) @@ -14120,6 +14278,7 @@ def test_update_backup_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.update_backup( request, @@ -14131,6 +14290,7 @@ def test_update_backup_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_location_rest_bad_request(request_type=locations_pb2.GetLocationRequest): diff --git a/packages/google-cloud-functions/google/cloud/functions/gapic_version.py b/packages/google-cloud-functions/google/cloud/functions/gapic_version.py index f1337c609ff8..558c8aab67c5 100644 --- a/packages/google-cloud-functions/google/cloud/functions/gapic_version.py +++ b/packages/google-cloud-functions/google/cloud/functions/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.19.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-functions/google/cloud/functions_v1/gapic_version.py b/packages/google-cloud-functions/google/cloud/functions_v1/gapic_version.py index f1337c609ff8..558c8aab67c5 100644 --- a/packages/google-cloud-functions/google/cloud/functions_v1/gapic_version.py +++ b/packages/google-cloud-functions/google/cloud/functions_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.19.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-functions/google/cloud/functions_v1/services/cloud_functions_service/client.py b/packages/google-cloud-functions/google/cloud/functions_v1/services/cloud_functions_service/client.py index 338ce446332c..ddc39973f00f 100644 --- a/packages/google-cloud-functions/google/cloud/functions_v1/services/cloud_functions_service/client.py +++ b/packages/google-cloud-functions/google/cloud/functions_v1/services/cloud_functions_service/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -546,6 +548,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. @@ -2025,16 +2054,20 @@ def list_operations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def get_operation( self, @@ -2080,16 +2113,20 @@ def get_operation( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def list_locations( self, @@ -2135,16 +2172,20 @@ def list_locations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-functions/google/cloud/functions_v1/services/cloud_functions_service/transports/rest.py b/packages/google-cloud-functions/google/cloud/functions_v1/services/cloud_functions_service/transports/rest.py index 1fa2cb722fd6..15860d47d143 100644 --- a/packages/google-cloud-functions/google/cloud/functions_v1/services/cloud_functions_service/transports/rest.py +++ b/packages/google-cloud-functions/google/cloud/functions_v1/services/cloud_functions_service/transports/rest.py @@ -183,12 +183,35 @@ def post_call_function( ) -> functions.CallFunctionResponse: """Post-rpc interceptor for call_function - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_call_function_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudFunctionsService server but before - it is returned to user code. + it is returned to user code. This `post_call_function` interceptor runs + before the `post_call_function_with_metadata` interceptor. """ return response + def post_call_function_with_metadata( + self, + response: functions.CallFunctionResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[functions.CallFunctionResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for call_function + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudFunctionsService server but before it is returned to user code. + + We recommend only using this `post_call_function_with_metadata` + interceptor in new development instead of the `post_call_function` interceptor. + When both interceptors are used, this `post_call_function_with_metadata` interceptor runs after the + `post_call_function` interceptor. The (possibly modified) response returned by + `post_call_function` will be passed to + `post_call_function_with_metadata`. + """ + return response, metadata + def pre_create_function( self, request: functions.CreateFunctionRequest, @@ -208,12 +231,35 @@ def post_create_function( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_function - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_function_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudFunctionsService server but before - it is returned to user code. + it is returned to user code. This `post_create_function` interceptor runs + before the `post_create_function_with_metadata` interceptor. """ return response + def post_create_function_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_function + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudFunctionsService server but before it is returned to user code. + + We recommend only using this `post_create_function_with_metadata` + interceptor in new development instead of the `post_create_function` interceptor. + When both interceptors are used, this `post_create_function_with_metadata` interceptor runs after the + `post_create_function` interceptor. The (possibly modified) response returned by + `post_create_function` will be passed to + `post_create_function_with_metadata`. + """ + return response, metadata + def pre_delete_function( self, request: functions.DeleteFunctionRequest, @@ -233,12 +279,35 @@ def post_delete_function( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_function - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_function_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudFunctionsService server but before - it is returned to user code. + it is returned to user code. This `post_delete_function` interceptor runs + before the `post_delete_function_with_metadata` interceptor. """ return response + def post_delete_function_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_function + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudFunctionsService server but before it is returned to user code. + + We recommend only using this `post_delete_function_with_metadata` + interceptor in new development instead of the `post_delete_function` interceptor. + When both interceptors are used, this `post_delete_function_with_metadata` interceptor runs after the + `post_delete_function` interceptor. The (possibly modified) response returned by + `post_delete_function` will be passed to + `post_delete_function_with_metadata`. + """ + return response, metadata + def pre_generate_download_url( self, request: functions.GenerateDownloadUrlRequest, @@ -258,12 +327,37 @@ def post_generate_download_url( ) -> functions.GenerateDownloadUrlResponse: """Post-rpc interceptor for generate_download_url - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_generate_download_url_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudFunctionsService server but before - it is returned to user code. + it is returned to user code. This `post_generate_download_url` interceptor runs + before the `post_generate_download_url_with_metadata` interceptor. """ return response + def post_generate_download_url_with_metadata( + self, + response: functions.GenerateDownloadUrlResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + functions.GenerateDownloadUrlResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for generate_download_url + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudFunctionsService server but before it is returned to user code. + + We recommend only using this `post_generate_download_url_with_metadata` + interceptor in new development instead of the `post_generate_download_url` interceptor. + When both interceptors are used, this `post_generate_download_url_with_metadata` interceptor runs after the + `post_generate_download_url` interceptor. The (possibly modified) response returned by + `post_generate_download_url` will be passed to + `post_generate_download_url_with_metadata`. + """ + return response, metadata + def pre_generate_upload_url( self, request: functions.GenerateUploadUrlRequest, @@ -283,12 +377,37 @@ def post_generate_upload_url( ) -> functions.GenerateUploadUrlResponse: """Post-rpc interceptor for generate_upload_url - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_generate_upload_url_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudFunctionsService server but before - it is returned to user code. + it is returned to user code. This `post_generate_upload_url` interceptor runs + before the `post_generate_upload_url_with_metadata` interceptor. """ return response + def post_generate_upload_url_with_metadata( + self, + response: functions.GenerateUploadUrlResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + functions.GenerateUploadUrlResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for generate_upload_url + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudFunctionsService server but before it is returned to user code. + + We recommend only using this `post_generate_upload_url_with_metadata` + interceptor in new development instead of the `post_generate_upload_url` interceptor. + When both interceptors are used, this `post_generate_upload_url_with_metadata` interceptor runs after the + `post_generate_upload_url` interceptor. The (possibly modified) response returned by + `post_generate_upload_url` will be passed to + `post_generate_upload_url_with_metadata`. + """ + return response, metadata + def pre_get_function( self, request: functions.GetFunctionRequest, @@ -306,12 +425,35 @@ def post_get_function( ) -> functions.CloudFunction: """Post-rpc interceptor for get_function - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_function_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudFunctionsService server but before - it is returned to user code. + it is returned to user code. This `post_get_function` interceptor runs + before the `post_get_function_with_metadata` interceptor. """ return response + def post_get_function_with_metadata( + self, + response: functions.CloudFunction, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[functions.CloudFunction, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_function + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudFunctionsService server but before it is returned to user code. + + We recommend only using this `post_get_function_with_metadata` + interceptor in new development instead of the `post_get_function` interceptor. + When both interceptors are used, this `post_get_function_with_metadata` interceptor runs after the + `post_get_function` interceptor. The (possibly modified) response returned by + `post_get_function` will be passed to + `post_get_function_with_metadata`. + """ + return response, metadata + def pre_get_iam_policy( self, request: iam_policy_pb2.GetIamPolicyRequest, @@ -329,12 +471,35 @@ def pre_get_iam_policy( def post_get_iam_policy(self, response: policy_pb2.Policy) -> policy_pb2.Policy: """Post-rpc interceptor for get_iam_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_iam_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudFunctionsService server but before - it is returned to user code. + it is returned to user code. This `post_get_iam_policy` interceptor runs + before the `post_get_iam_policy_with_metadata` interceptor. """ return response + def post_get_iam_policy_with_metadata( + self, + response: policy_pb2.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[policy_pb2.Policy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_iam_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudFunctionsService server but before it is returned to user code. + + We recommend only using this `post_get_iam_policy_with_metadata` + interceptor in new development instead of the `post_get_iam_policy` interceptor. + When both interceptors are used, this `post_get_iam_policy_with_metadata` interceptor runs after the + `post_get_iam_policy` interceptor. The (possibly modified) response returned by + `post_get_iam_policy` will be passed to + `post_get_iam_policy_with_metadata`. + """ + return response, metadata + def pre_list_functions( self, request: functions.ListFunctionsRequest, @@ -352,12 +517,37 @@ def post_list_functions( ) -> functions.ListFunctionsResponse: """Post-rpc interceptor for list_functions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_functions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudFunctionsService server but before - it is returned to user code. + it is returned to user code. This `post_list_functions` interceptor runs + before the `post_list_functions_with_metadata` interceptor. """ return response + def post_list_functions_with_metadata( + self, + response: functions.ListFunctionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + functions.ListFunctionsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_functions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudFunctionsService server but before it is returned to user code. + + We recommend only using this `post_list_functions_with_metadata` + interceptor in new development instead of the `post_list_functions` interceptor. + When both interceptors are used, this `post_list_functions_with_metadata` interceptor runs after the + `post_list_functions` interceptor. The (possibly modified) response returned by + `post_list_functions` will be passed to + `post_list_functions_with_metadata`. + """ + return response, metadata + def pre_set_iam_policy( self, request: iam_policy_pb2.SetIamPolicyRequest, @@ -375,12 +565,35 @@ def pre_set_iam_policy( def post_set_iam_policy(self, response: policy_pb2.Policy) -> policy_pb2.Policy: """Post-rpc interceptor for set_iam_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_iam_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudFunctionsService server but before - it is returned to user code. + it is returned to user code. This `post_set_iam_policy` interceptor runs + before the `post_set_iam_policy_with_metadata` interceptor. """ return response + def post_set_iam_policy_with_metadata( + self, + response: policy_pb2.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[policy_pb2.Policy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_iam_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudFunctionsService server but before it is returned to user code. + + We recommend only using this `post_set_iam_policy_with_metadata` + interceptor in new development instead of the `post_set_iam_policy` interceptor. + When both interceptors are used, this `post_set_iam_policy_with_metadata` interceptor runs after the + `post_set_iam_policy` interceptor. The (possibly modified) response returned by + `post_set_iam_policy` will be passed to + `post_set_iam_policy_with_metadata`. + """ + return response, metadata + def pre_test_iam_permissions( self, request: iam_policy_pb2.TestIamPermissionsRequest, @@ -401,12 +614,38 @@ def post_test_iam_permissions( ) -> iam_policy_pb2.TestIamPermissionsResponse: """Post-rpc interceptor for test_iam_permissions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_test_iam_permissions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudFunctionsService server but before - it is returned to user code. + it is returned to user code. This `post_test_iam_permissions` interceptor runs + before the `post_test_iam_permissions_with_metadata` interceptor. """ return response + def post_test_iam_permissions_with_metadata( + self, + response: iam_policy_pb2.TestIamPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + iam_policy_pb2.TestIamPermissionsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for test_iam_permissions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudFunctionsService server but before it is returned to user code. + + We recommend only using this `post_test_iam_permissions_with_metadata` + interceptor in new development instead of the `post_test_iam_permissions` interceptor. + When both interceptors are used, this `post_test_iam_permissions_with_metadata` interceptor runs after the + `post_test_iam_permissions` interceptor. The (possibly modified) response returned by + `post_test_iam_permissions` will be passed to + `post_test_iam_permissions_with_metadata`. + """ + return response, metadata + def pre_update_function( self, request: functions.UpdateFunctionRequest, @@ -426,12 +665,35 @@ def post_update_function( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_function - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_function_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudFunctionsService server but before - it is returned to user code. + it is returned to user code. This `post_update_function` interceptor runs + before the `post_update_function_with_metadata` interceptor. """ return response + def post_update_function_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_function + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudFunctionsService server but before it is returned to user code. + + We recommend only using this `post_update_function_with_metadata` + interceptor in new development instead of the `post_update_function` interceptor. + When both interceptors are used, this `post_update_function_with_metadata` interceptor runs after the + `post_update_function` interceptor. The (possibly modified) response returned by + `post_update_function` will be passed to + `post_update_function_with_metadata`. + """ + return response, metadata + def pre_list_locations( self, request: locations_pb2.ListLocationsRequest, @@ -760,6 +1022,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_call_function(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_call_function_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -908,6 +1174,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_function(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_function_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1050,6 +1320,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_function(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_function_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1201,6 +1475,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_generate_download_url(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_generate_download_url_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1354,6 +1632,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_generate_upload_url(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_generate_upload_url_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1501,6 +1783,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_function(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_function_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1717,6 +2003,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_iam_policy(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_iam_policy_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1858,6 +2148,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_functions(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_functions_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2080,6 +2374,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_iam_policy(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_iam_policy_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2231,6 +2529,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_test_iam_permissions(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_test_iam_permissions_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2379,6 +2681,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_function(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_function_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-functions/google/cloud/functions_v2/gapic_version.py b/packages/google-cloud-functions/google/cloud/functions_v2/gapic_version.py index f1337c609ff8..558c8aab67c5 100644 --- a/packages/google-cloud-functions/google/cloud/functions_v2/gapic_version.py +++ b/packages/google-cloud-functions/google/cloud/functions_v2/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.19.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-functions/google/cloud/functions_v2/services/function_service/client.py b/packages/google-cloud-functions/google/cloud/functions_v2/services/function_service/client.py index b64e1bc3073c..863515105970 100644 --- a/packages/google-cloud-functions/google/cloud/functions_v2/services/function_service/client.py +++ b/packages/google-cloud-functions/google/cloud/functions_v2/services/function_service/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -699,6 +701,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. @@ -1885,16 +1914,20 @@ def list_operations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def get_operation( self, @@ -1940,16 +1973,20 @@ def get_operation( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def set_iam_policy( self, @@ -2061,16 +2098,20 @@ def set_iam_policy( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def get_iam_policy( self, @@ -2183,16 +2224,20 @@ def get_iam_policy( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def test_iam_permissions( self, @@ -2243,16 +2288,20 @@ def test_iam_permissions( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def list_locations( self, @@ -2298,16 +2347,20 @@ def list_locations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-functions/google/cloud/functions_v2/services/function_service/transports/rest.py b/packages/google-cloud-functions/google/cloud/functions_v2/services/function_service/transports/rest.py index 94b2adba6a04..0d4059bbc2c8 100644 --- a/packages/google-cloud-functions/google/cloud/functions_v2/services/function_service/transports/rest.py +++ b/packages/google-cloud-functions/google/cloud/functions_v2/services/function_service/transports/rest.py @@ -161,12 +161,35 @@ def post_create_function( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_function - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_function_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the FunctionService server but before - it is returned to user code. + it is returned to user code. This `post_create_function` interceptor runs + before the `post_create_function_with_metadata` interceptor. """ return response + def post_create_function_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_function + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the FunctionService server but before it is returned to user code. + + We recommend only using this `post_create_function_with_metadata` + interceptor in new development instead of the `post_create_function` interceptor. + When both interceptors are used, this `post_create_function_with_metadata` interceptor runs after the + `post_create_function` interceptor. The (possibly modified) response returned by + `post_create_function` will be passed to + `post_create_function_with_metadata`. + """ + return response, metadata + def pre_delete_function( self, request: functions.DeleteFunctionRequest, @@ -186,12 +209,35 @@ def post_delete_function( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_function - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_function_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the FunctionService server but before - it is returned to user code. + it is returned to user code. This `post_delete_function` interceptor runs + before the `post_delete_function_with_metadata` interceptor. """ return response + def post_delete_function_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_function + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the FunctionService server but before it is returned to user code. + + We recommend only using this `post_delete_function_with_metadata` + interceptor in new development instead of the `post_delete_function` interceptor. + When both interceptors are used, this `post_delete_function_with_metadata` interceptor runs after the + `post_delete_function` interceptor. The (possibly modified) response returned by + `post_delete_function` will be passed to + `post_delete_function_with_metadata`. + """ + return response, metadata + def pre_generate_download_url( self, request: functions.GenerateDownloadUrlRequest, @@ -211,12 +257,37 @@ def post_generate_download_url( ) -> functions.GenerateDownloadUrlResponse: """Post-rpc interceptor for generate_download_url - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_generate_download_url_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the FunctionService server but before - it is returned to user code. + it is returned to user code. This `post_generate_download_url` interceptor runs + before the `post_generate_download_url_with_metadata` interceptor. """ return response + def post_generate_download_url_with_metadata( + self, + response: functions.GenerateDownloadUrlResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + functions.GenerateDownloadUrlResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for generate_download_url + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the FunctionService server but before it is returned to user code. + + We recommend only using this `post_generate_download_url_with_metadata` + interceptor in new development instead of the `post_generate_download_url` interceptor. + When both interceptors are used, this `post_generate_download_url_with_metadata` interceptor runs after the + `post_generate_download_url` interceptor. The (possibly modified) response returned by + `post_generate_download_url` will be passed to + `post_generate_download_url_with_metadata`. + """ + return response, metadata + def pre_generate_upload_url( self, request: functions.GenerateUploadUrlRequest, @@ -236,12 +307,37 @@ def post_generate_upload_url( ) -> functions.GenerateUploadUrlResponse: """Post-rpc interceptor for generate_upload_url - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_generate_upload_url_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the FunctionService server but before - it is returned to user code. + it is returned to user code. This `post_generate_upload_url` interceptor runs + before the `post_generate_upload_url_with_metadata` interceptor. """ return response + def post_generate_upload_url_with_metadata( + self, + response: functions.GenerateUploadUrlResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + functions.GenerateUploadUrlResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for generate_upload_url + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the FunctionService server but before it is returned to user code. + + We recommend only using this `post_generate_upload_url_with_metadata` + interceptor in new development instead of the `post_generate_upload_url` interceptor. + When both interceptors are used, this `post_generate_upload_url_with_metadata` interceptor runs after the + `post_generate_upload_url` interceptor. The (possibly modified) response returned by + `post_generate_upload_url` will be passed to + `post_generate_upload_url_with_metadata`. + """ + return response, metadata + def pre_get_function( self, request: functions.GetFunctionRequest, @@ -257,12 +353,35 @@ def pre_get_function( def post_get_function(self, response: functions.Function) -> functions.Function: """Post-rpc interceptor for get_function - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_function_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the FunctionService server but before - it is returned to user code. + it is returned to user code. This `post_get_function` interceptor runs + before the `post_get_function_with_metadata` interceptor. """ return response + def post_get_function_with_metadata( + self, + response: functions.Function, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[functions.Function, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_function + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the FunctionService server but before it is returned to user code. + + We recommend only using this `post_get_function_with_metadata` + interceptor in new development instead of the `post_get_function` interceptor. + When both interceptors are used, this `post_get_function_with_metadata` interceptor runs after the + `post_get_function` interceptor. The (possibly modified) response returned by + `post_get_function` will be passed to + `post_get_function_with_metadata`. + """ + return response, metadata + def pre_list_functions( self, request: functions.ListFunctionsRequest, @@ -280,12 +399,37 @@ def post_list_functions( ) -> functions.ListFunctionsResponse: """Post-rpc interceptor for list_functions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_functions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the FunctionService server but before - it is returned to user code. + it is returned to user code. This `post_list_functions` interceptor runs + before the `post_list_functions_with_metadata` interceptor. """ return response + def post_list_functions_with_metadata( + self, + response: functions.ListFunctionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + functions.ListFunctionsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_functions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the FunctionService server but before it is returned to user code. + + We recommend only using this `post_list_functions_with_metadata` + interceptor in new development instead of the `post_list_functions` interceptor. + When both interceptors are used, this `post_list_functions_with_metadata` interceptor runs after the + `post_list_functions` interceptor. The (possibly modified) response returned by + `post_list_functions` will be passed to + `post_list_functions_with_metadata`. + """ + return response, metadata + def pre_list_runtimes( self, request: functions.ListRuntimesRequest, @@ -303,12 +447,35 @@ def post_list_runtimes( ) -> functions.ListRuntimesResponse: """Post-rpc interceptor for list_runtimes - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_runtimes_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the FunctionService server but before - it is returned to user code. + it is returned to user code. This `post_list_runtimes` interceptor runs + before the `post_list_runtimes_with_metadata` interceptor. """ return response + def post_list_runtimes_with_metadata( + self, + response: functions.ListRuntimesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[functions.ListRuntimesResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_runtimes + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the FunctionService server but before it is returned to user code. + + We recommend only using this `post_list_runtimes_with_metadata` + interceptor in new development instead of the `post_list_runtimes` interceptor. + When both interceptors are used, this `post_list_runtimes_with_metadata` interceptor runs after the + `post_list_runtimes` interceptor. The (possibly modified) response returned by + `post_list_runtimes` will be passed to + `post_list_runtimes_with_metadata`. + """ + return response, metadata + def pre_update_function( self, request: functions.UpdateFunctionRequest, @@ -328,12 +495,35 @@ def post_update_function( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_function - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_function_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the FunctionService server but before - it is returned to user code. + it is returned to user code. This `post_update_function` interceptor runs + before the `post_update_function_with_metadata` interceptor. """ return response + def post_update_function_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_function + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the FunctionService server but before it is returned to user code. + + We recommend only using this `post_update_function_with_metadata` + interceptor in new development instead of the `post_update_function` interceptor. + When both interceptors are used, this `post_update_function_with_metadata` interceptor runs after the + `post_update_function` interceptor. The (possibly modified) response returned by + `post_update_function` will be passed to + `post_update_function_with_metadata`. + """ + return response, metadata + def pre_list_locations( self, request: locations_pb2.ListLocationsRequest, @@ -738,6 +928,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_function(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_function_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -879,6 +1073,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_function(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_function_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1028,6 +1226,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_generate_download_url(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_generate_download_url_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1179,6 +1381,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_generate_upload_url(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_generate_upload_url_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1325,6 +1531,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_function(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_function_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1465,6 +1675,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_functions(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_functions_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1605,6 +1819,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_runtimes(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_runtimes_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1752,6 +1970,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_function(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_function_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-functions/samples/generated_samples/snippet_metadata_google.cloud.functions.v1.json b/packages/google-cloud-functions/samples/generated_samples/snippet_metadata_google.cloud.functions.v1.json index 23ca7290d59e..7051120dab3b 100644 --- a/packages/google-cloud-functions/samples/generated_samples/snippet_metadata_google.cloud.functions.v1.json +++ b/packages/google-cloud-functions/samples/generated_samples/snippet_metadata_google.cloud.functions.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-functions", - "version": "1.19.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-functions/samples/generated_samples/snippet_metadata_google.cloud.functions.v2.json b/packages/google-cloud-functions/samples/generated_samples/snippet_metadata_google.cloud.functions.v2.json index 1ff5f17e7a51..eea3a0edf2a1 100644 --- a/packages/google-cloud-functions/samples/generated_samples/snippet_metadata_google.cloud.functions.v2.json +++ b/packages/google-cloud-functions/samples/generated_samples/snippet_metadata_google.cloud.functions.v2.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-functions", - "version": "1.19.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-functions/tests/unit/gapic/functions_v1/test_cloud_functions_service.py b/packages/google-cloud-functions/tests/unit/gapic/functions_v1/test_cloud_functions_service.py index fe0d1b2df197..c3441a30fd75 100644 --- a/packages/google-cloud-functions/tests/unit/gapic/functions_v1/test_cloud_functions_service.py +++ b/packages/google-cloud-functions/tests/unit/gapic/functions_v1/test_cloud_functions_service.py @@ -79,6 +79,13 @@ ) from google.cloud.functions_v1.types import functions, operations +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -354,6 +361,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = CloudFunctionsServiceClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=["foo"]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + if show_cred_info: + assert error.details == ["foo", CRED_INFO_STRING] + else: + assert error.details == ["foo"] + + +@pytest.mark.parametrize("error_code", [401, 403, 404, 500]) +def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code): + cred = mock.Mock([]) + assert not hasattr(cred, "get_cred_info") + client = CloudFunctionsServiceClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -6889,10 +6939,14 @@ def test_list_functions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudFunctionsServiceRestInterceptor, "post_list_functions" ) as post, mock.patch.object( + transports.CloudFunctionsServiceRestInterceptor, + "post_list_functions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudFunctionsServiceRestInterceptor, "pre_list_functions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = functions.ListFunctionsRequest.pb(functions.ListFunctionsRequest()) transcode.return_value = { "method": "post", @@ -6916,6 +6970,7 @@ def test_list_functions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = functions.ListFunctionsResponse() + post_with_metadata.return_value = functions.ListFunctionsResponse(), metadata client.list_functions( request, @@ -6927,6 +6982,7 @@ def test_list_functions_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_function_rest_bad_request(request_type=functions.GetFunctionRequest): @@ -7060,10 +7116,14 @@ def test_get_function_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudFunctionsServiceRestInterceptor, "post_get_function" ) as post, mock.patch.object( + transports.CloudFunctionsServiceRestInterceptor, + "post_get_function_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudFunctionsServiceRestInterceptor, "pre_get_function" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = functions.GetFunctionRequest.pb(functions.GetFunctionRequest()) transcode.return_value = { "method": "post", @@ -7085,6 +7145,7 @@ def test_get_function_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = functions.CloudFunction() + post_with_metadata.return_value = functions.CloudFunction(), metadata client.get_function( request, @@ -7096,6 +7157,7 @@ def test_get_function_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_function_rest_bad_request(request_type=functions.CreateFunctionRequest): @@ -7298,10 +7360,14 @@ def test_create_function_rest_interceptors(null_interceptor): ), mock.patch.object( transports.CloudFunctionsServiceRestInterceptor, "post_create_function" ) as post, mock.patch.object( + transports.CloudFunctionsServiceRestInterceptor, + "post_create_function_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudFunctionsServiceRestInterceptor, "pre_create_function" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = functions.CreateFunctionRequest.pb( functions.CreateFunctionRequest() ) @@ -7325,6 +7391,7 @@ def test_create_function_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_function( request, @@ -7336,6 +7403,7 @@ def test_create_function_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_function_rest_bad_request(request_type=functions.UpdateFunctionRequest): @@ -7542,10 +7610,14 @@ def test_update_function_rest_interceptors(null_interceptor): ), mock.patch.object( transports.CloudFunctionsServiceRestInterceptor, "post_update_function" ) as post, mock.patch.object( + transports.CloudFunctionsServiceRestInterceptor, + "post_update_function_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudFunctionsServiceRestInterceptor, "pre_update_function" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = functions.UpdateFunctionRequest.pb( functions.UpdateFunctionRequest() ) @@ -7569,6 +7641,7 @@ def test_update_function_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.update_function( request, @@ -7580,6 +7653,7 @@ def test_update_function_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_function_rest_bad_request(request_type=functions.DeleteFunctionRequest): @@ -7658,10 +7732,14 @@ def test_delete_function_rest_interceptors(null_interceptor): ), mock.patch.object( transports.CloudFunctionsServiceRestInterceptor, "post_delete_function" ) as post, mock.patch.object( + transports.CloudFunctionsServiceRestInterceptor, + "post_delete_function_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudFunctionsServiceRestInterceptor, "pre_delete_function" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = functions.DeleteFunctionRequest.pb( functions.DeleteFunctionRequest() ) @@ -7685,6 +7763,7 @@ def test_delete_function_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_function( request, @@ -7696,6 +7775,7 @@ def test_delete_function_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_call_function_rest_bad_request(request_type=functions.CallFunctionRequest): @@ -7782,10 +7862,14 @@ def test_call_function_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudFunctionsServiceRestInterceptor, "post_call_function" ) as post, mock.patch.object( + transports.CloudFunctionsServiceRestInterceptor, + "post_call_function_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudFunctionsServiceRestInterceptor, "pre_call_function" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = functions.CallFunctionRequest.pb(functions.CallFunctionRequest()) transcode.return_value = { "method": "post", @@ -7809,6 +7893,7 @@ def test_call_function_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = functions.CallFunctionResponse() + post_with_metadata.return_value = functions.CallFunctionResponse(), metadata client.call_function( request, @@ -7820,6 +7905,7 @@ def test_call_function_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_generate_upload_url_rest_bad_request( @@ -7904,10 +7990,14 @@ def test_generate_upload_url_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudFunctionsServiceRestInterceptor, "post_generate_upload_url" ) as post, mock.patch.object( + transports.CloudFunctionsServiceRestInterceptor, + "post_generate_upload_url_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudFunctionsServiceRestInterceptor, "pre_generate_upload_url" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = functions.GenerateUploadUrlRequest.pb( functions.GenerateUploadUrlRequest() ) @@ -7933,6 +8023,10 @@ def test_generate_upload_url_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = functions.GenerateUploadUrlResponse() + post_with_metadata.return_value = ( + functions.GenerateUploadUrlResponse(), + metadata, + ) client.generate_upload_url( request, @@ -7944,6 +8038,7 @@ def test_generate_upload_url_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_generate_download_url_rest_bad_request( @@ -8028,10 +8123,14 @@ def test_generate_download_url_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudFunctionsServiceRestInterceptor, "post_generate_download_url" ) as post, mock.patch.object( + transports.CloudFunctionsServiceRestInterceptor, + "post_generate_download_url_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudFunctionsServiceRestInterceptor, "pre_generate_download_url" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = functions.GenerateDownloadUrlRequest.pb( functions.GenerateDownloadUrlRequest() ) @@ -8057,6 +8156,10 @@ def test_generate_download_url_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = functions.GenerateDownloadUrlResponse() + post_with_metadata.return_value = ( + functions.GenerateDownloadUrlResponse(), + metadata, + ) client.generate_download_url( request, @@ -8068,6 +8171,7 @@ def test_generate_download_url_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_iam_policy_rest_bad_request( @@ -8151,10 +8255,14 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudFunctionsServiceRestInterceptor, "post_set_iam_policy" ) as post, mock.patch.object( + transports.CloudFunctionsServiceRestInterceptor, + "post_set_iam_policy_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudFunctionsServiceRestInterceptor, "pre_set_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.SetIamPolicyRequest() transcode.return_value = { "method": "post", @@ -8176,6 +8284,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = policy_pb2.Policy() + post_with_metadata.return_value = policy_pb2.Policy(), metadata client.set_iam_policy( request, @@ -8187,6 +8296,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_iam_policy_rest_bad_request( @@ -8270,10 +8380,14 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudFunctionsServiceRestInterceptor, "post_get_iam_policy" ) as post, mock.patch.object( + transports.CloudFunctionsServiceRestInterceptor, + "post_get_iam_policy_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudFunctionsServiceRestInterceptor, "pre_get_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.GetIamPolicyRequest() transcode.return_value = { "method": "post", @@ -8295,6 +8409,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = policy_pb2.Policy() + post_with_metadata.return_value = policy_pb2.Policy(), metadata client.get_iam_policy( request, @@ -8306,6 +8421,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_test_iam_permissions_rest_bad_request( @@ -8387,10 +8503,14 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudFunctionsServiceRestInterceptor, "post_test_iam_permissions" ) as post, mock.patch.object( + transports.CloudFunctionsServiceRestInterceptor, + "post_test_iam_permissions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudFunctionsServiceRestInterceptor, "pre_test_iam_permissions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.TestIamPermissionsRequest() transcode.return_value = { "method": "post", @@ -8414,6 +8534,10 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = iam_policy_pb2.TestIamPermissionsResponse() + post_with_metadata.return_value = ( + iam_policy_pb2.TestIamPermissionsResponse(), + metadata, + ) client.test_iam_permissions( request, @@ -8425,6 +8549,7 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_locations_rest_bad_request( diff --git a/packages/google-cloud-functions/tests/unit/gapic/functions_v2/test_function_service.py b/packages/google-cloud-functions/tests/unit/gapic/functions_v2/test_function_service.py index c0d372f29107..4427ef0ac3a5 100644 --- a/packages/google-cloud-functions/tests/unit/gapic/functions_v2/test_function_service.py +++ b/packages/google-cloud-functions/tests/unit/gapic/functions_v2/test_function_service.py @@ -77,6 +77,13 @@ ) from google.cloud.functions_v2.types import functions +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -335,6 +342,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = FunctionServiceClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=["foo"]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + if show_cred_info: + assert error.details == ["foo", CRED_INFO_STRING] + else: + assert error.details == ["foo"] + + +@pytest.mark.parametrize("error_code", [401, 403, 404, 500]) +def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code): + cred = mock.Mock([]) + assert not hasattr(cred, "get_cred_info") + client = FunctionServiceClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -5836,10 +5886,13 @@ def test_get_function_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.FunctionServiceRestInterceptor, "post_get_function" ) as post, mock.patch.object( + transports.FunctionServiceRestInterceptor, "post_get_function_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.FunctionServiceRestInterceptor, "pre_get_function" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = functions.GetFunctionRequest.pb(functions.GetFunctionRequest()) transcode.return_value = { "method": "post", @@ -5861,6 +5914,7 @@ def test_get_function_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = functions.Function() + post_with_metadata.return_value = functions.Function(), metadata client.get_function( request, @@ -5872,6 +5926,7 @@ def test_get_function_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_functions_rest_bad_request(request_type=functions.ListFunctionsRequest): @@ -5956,10 +6011,13 @@ def test_list_functions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.FunctionServiceRestInterceptor, "post_list_functions" ) as post, mock.patch.object( + transports.FunctionServiceRestInterceptor, "post_list_functions_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.FunctionServiceRestInterceptor, "pre_list_functions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = functions.ListFunctionsRequest.pb(functions.ListFunctionsRequest()) transcode.return_value = { "method": "post", @@ -5983,6 +6041,7 @@ def test_list_functions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = functions.ListFunctionsResponse() + post_with_metadata.return_value = functions.ListFunctionsResponse(), metadata client.list_functions( request, @@ -5994,6 +6053,7 @@ def test_list_functions_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_function_rest_bad_request(request_type=functions.CreateFunctionRequest): @@ -6241,10 +6301,13 @@ def test_create_function_rest_interceptors(null_interceptor): ), mock.patch.object( transports.FunctionServiceRestInterceptor, "post_create_function" ) as post, mock.patch.object( + transports.FunctionServiceRestInterceptor, "post_create_function_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.FunctionServiceRestInterceptor, "pre_create_function" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = functions.CreateFunctionRequest.pb( functions.CreateFunctionRequest() ) @@ -6268,6 +6331,7 @@ def test_create_function_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_function( request, @@ -6279,6 +6343,7 @@ def test_create_function_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_function_rest_bad_request(request_type=functions.UpdateFunctionRequest): @@ -6530,10 +6595,13 @@ def test_update_function_rest_interceptors(null_interceptor): ), mock.patch.object( transports.FunctionServiceRestInterceptor, "post_update_function" ) as post, mock.patch.object( + transports.FunctionServiceRestInterceptor, "post_update_function_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.FunctionServiceRestInterceptor, "pre_update_function" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = functions.UpdateFunctionRequest.pb( functions.UpdateFunctionRequest() ) @@ -6557,6 +6625,7 @@ def test_update_function_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.update_function( request, @@ -6568,6 +6637,7 @@ def test_update_function_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_function_rest_bad_request(request_type=functions.DeleteFunctionRequest): @@ -6646,10 +6716,13 @@ def test_delete_function_rest_interceptors(null_interceptor): ), mock.patch.object( transports.FunctionServiceRestInterceptor, "post_delete_function" ) as post, mock.patch.object( + transports.FunctionServiceRestInterceptor, "post_delete_function_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.FunctionServiceRestInterceptor, "pre_delete_function" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = functions.DeleteFunctionRequest.pb( functions.DeleteFunctionRequest() ) @@ -6673,6 +6746,7 @@ def test_delete_function_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_function( request, @@ -6684,6 +6758,7 @@ def test_delete_function_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_generate_upload_url_rest_bad_request( @@ -6768,10 +6843,14 @@ def test_generate_upload_url_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.FunctionServiceRestInterceptor, "post_generate_upload_url" ) as post, mock.patch.object( + transports.FunctionServiceRestInterceptor, + "post_generate_upload_url_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.FunctionServiceRestInterceptor, "pre_generate_upload_url" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = functions.GenerateUploadUrlRequest.pb( functions.GenerateUploadUrlRequest() ) @@ -6797,6 +6876,10 @@ def test_generate_upload_url_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = functions.GenerateUploadUrlResponse() + post_with_metadata.return_value = ( + functions.GenerateUploadUrlResponse(), + metadata, + ) client.generate_upload_url( request, @@ -6808,6 +6891,7 @@ def test_generate_upload_url_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_generate_download_url_rest_bad_request( @@ -6892,10 +6976,14 @@ def test_generate_download_url_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.FunctionServiceRestInterceptor, "post_generate_download_url" ) as post, mock.patch.object( + transports.FunctionServiceRestInterceptor, + "post_generate_download_url_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.FunctionServiceRestInterceptor, "pre_generate_download_url" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = functions.GenerateDownloadUrlRequest.pb( functions.GenerateDownloadUrlRequest() ) @@ -6921,6 +7009,10 @@ def test_generate_download_url_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = functions.GenerateDownloadUrlResponse() + post_with_metadata.return_value = ( + functions.GenerateDownloadUrlResponse(), + metadata, + ) client.generate_download_url( request, @@ -6932,6 +7024,7 @@ def test_generate_download_url_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_runtimes_rest_bad_request(request_type=functions.ListRuntimesRequest): @@ -7011,10 +7104,13 @@ def test_list_runtimes_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.FunctionServiceRestInterceptor, "post_list_runtimes" ) as post, mock.patch.object( + transports.FunctionServiceRestInterceptor, "post_list_runtimes_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.FunctionServiceRestInterceptor, "pre_list_runtimes" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = functions.ListRuntimesRequest.pb(functions.ListRuntimesRequest()) transcode.return_value = { "method": "post", @@ -7038,6 +7134,7 @@ def test_list_runtimes_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = functions.ListRuntimesResponse() + post_with_metadata.return_value = functions.ListRuntimesResponse(), metadata client.list_runtimes( request, @@ -7049,6 +7146,7 @@ def test_list_runtimes_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_locations_rest_bad_request( diff --git a/packages/google-cloud-gdchardwaremanagement/google/cloud/gdchardwaremanagement/gapic_version.py b/packages/google-cloud-gdchardwaremanagement/google/cloud/gdchardwaremanagement/gapic_version.py index f8ea948a9c30..558c8aab67c5 100644 --- a/packages/google-cloud-gdchardwaremanagement/google/cloud/gdchardwaremanagement/gapic_version.py +++ b/packages/google-cloud-gdchardwaremanagement/google/cloud/gdchardwaremanagement/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.1.9" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-gdchardwaremanagement/google/cloud/gdchardwaremanagement_v1alpha/gapic_version.py b/packages/google-cloud-gdchardwaremanagement/google/cloud/gdchardwaremanagement_v1alpha/gapic_version.py index f8ea948a9c30..558c8aab67c5 100644 --- a/packages/google-cloud-gdchardwaremanagement/google/cloud/gdchardwaremanagement_v1alpha/gapic_version.py +++ b/packages/google-cloud-gdchardwaremanagement/google/cloud/gdchardwaremanagement_v1alpha/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.1.9" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-gdchardwaremanagement/google/cloud/gdchardwaremanagement_v1alpha/services/gdc_hardware_management/client.py b/packages/google-cloud-gdchardwaremanagement/google/cloud/gdchardwaremanagement_v1alpha/services/gdc_hardware_management/client.py index 4dc6254247cb..effea1d094ae 100644 --- a/packages/google-cloud-gdchardwaremanagement/google/cloud/gdchardwaremanagement_v1alpha/services/gdc_hardware_management/client.py +++ b/packages/google-cloud-gdchardwaremanagement/google/cloud/gdchardwaremanagement_v1alpha/services/gdc_hardware_management/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -657,6 +659,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. @@ -5316,16 +5345,20 @@ def list_operations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def get_operation( self, @@ -5371,16 +5404,20 @@ def get_operation( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def delete_operation( self, @@ -5537,16 +5574,20 @@ def get_location( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def list_locations( self, @@ -5592,16 +5633,20 @@ def list_locations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-gdchardwaremanagement/google/cloud/gdchardwaremanagement_v1alpha/services/gdc_hardware_management/transports/rest.py b/packages/google-cloud-gdchardwaremanagement/google/cloud/gdchardwaremanagement_v1alpha/services/gdc_hardware_management/transports/rest.py index 3687ef86b9c3..7929bc4eee30 100644 --- a/packages/google-cloud-gdchardwaremanagement/google/cloud/gdchardwaremanagement_v1alpha/services/gdc_hardware_management/transports/rest.py +++ b/packages/google-cloud-gdchardwaremanagement/google/cloud/gdchardwaremanagement_v1alpha/services/gdc_hardware_management/transports/rest.py @@ -373,12 +373,35 @@ def post_create_comment( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_comment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_comment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GDCHardwareManagement server but before - it is returned to user code. + it is returned to user code. This `post_create_comment` interceptor runs + before the `post_create_comment_with_metadata` interceptor. """ return response + def post_create_comment_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_comment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GDCHardwareManagement server but before it is returned to user code. + + We recommend only using this `post_create_comment_with_metadata` + interceptor in new development instead of the `post_create_comment` interceptor. + When both interceptors are used, this `post_create_comment_with_metadata` interceptor runs after the + `post_create_comment` interceptor. The (possibly modified) response returned by + `post_create_comment` will be passed to + `post_create_comment_with_metadata`. + """ + return response, metadata + def pre_create_hardware( self, request: service.CreateHardwareRequest, @@ -396,12 +419,35 @@ def post_create_hardware( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_hardware - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_hardware_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GDCHardwareManagement server but before - it is returned to user code. + it is returned to user code. This `post_create_hardware` interceptor runs + before the `post_create_hardware_with_metadata` interceptor. """ return response + def post_create_hardware_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_hardware + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GDCHardwareManagement server but before it is returned to user code. + + We recommend only using this `post_create_hardware_with_metadata` + interceptor in new development instead of the `post_create_hardware` interceptor. + When both interceptors are used, this `post_create_hardware_with_metadata` interceptor runs after the + `post_create_hardware` interceptor. The (possibly modified) response returned by + `post_create_hardware` will be passed to + `post_create_hardware_with_metadata`. + """ + return response, metadata + def pre_create_hardware_group( self, request: service.CreateHardwareGroupRequest, @@ -421,12 +467,35 @@ def post_create_hardware_group( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_hardware_group - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_hardware_group_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GDCHardwareManagement server but before - it is returned to user code. + it is returned to user code. This `post_create_hardware_group` interceptor runs + before the `post_create_hardware_group_with_metadata` interceptor. """ return response + def post_create_hardware_group_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_hardware_group + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GDCHardwareManagement server but before it is returned to user code. + + We recommend only using this `post_create_hardware_group_with_metadata` + interceptor in new development instead of the `post_create_hardware_group` interceptor. + When both interceptors are used, this `post_create_hardware_group_with_metadata` interceptor runs after the + `post_create_hardware_group` interceptor. The (possibly modified) response returned by + `post_create_hardware_group` will be passed to + `post_create_hardware_group_with_metadata`. + """ + return response, metadata + def pre_create_order( self, request: service.CreateOrderRequest, @@ -444,12 +513,35 @@ def post_create_order( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_order - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_order_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GDCHardwareManagement server but before - it is returned to user code. + it is returned to user code. This `post_create_order` interceptor runs + before the `post_create_order_with_metadata` interceptor. """ return response + def post_create_order_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_order + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GDCHardwareManagement server but before it is returned to user code. + + We recommend only using this `post_create_order_with_metadata` + interceptor in new development instead of the `post_create_order` interceptor. + When both interceptors are used, this `post_create_order_with_metadata` interceptor runs after the + `post_create_order` interceptor. The (possibly modified) response returned by + `post_create_order` will be passed to + `post_create_order_with_metadata`. + """ + return response, metadata + def pre_create_site( self, request: service.CreateSiteRequest, @@ -467,12 +559,35 @@ def post_create_site( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_site - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_site_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GDCHardwareManagement server but before - it is returned to user code. + it is returned to user code. This `post_create_site` interceptor runs + before the `post_create_site_with_metadata` interceptor. """ return response + def post_create_site_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_site + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GDCHardwareManagement server but before it is returned to user code. + + We recommend only using this `post_create_site_with_metadata` + interceptor in new development instead of the `post_create_site` interceptor. + When both interceptors are used, this `post_create_site_with_metadata` interceptor runs after the + `post_create_site` interceptor. The (possibly modified) response returned by + `post_create_site` will be passed to + `post_create_site_with_metadata`. + """ + return response, metadata + def pre_create_zone( self, request: service.CreateZoneRequest, @@ -490,12 +605,35 @@ def post_create_zone( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_zone - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_zone_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GDCHardwareManagement server but before - it is returned to user code. + it is returned to user code. This `post_create_zone` interceptor runs + before the `post_create_zone_with_metadata` interceptor. """ return response + def post_create_zone_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_zone + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GDCHardwareManagement server but before it is returned to user code. + + We recommend only using this `post_create_zone_with_metadata` + interceptor in new development instead of the `post_create_zone` interceptor. + When both interceptors are used, this `post_create_zone_with_metadata` interceptor runs after the + `post_create_zone` interceptor. The (possibly modified) response returned by + `post_create_zone` will be passed to + `post_create_zone_with_metadata`. + """ + return response, metadata + def pre_delete_hardware( self, request: service.DeleteHardwareRequest, @@ -513,12 +651,35 @@ def post_delete_hardware( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_hardware - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_hardware_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GDCHardwareManagement server but before - it is returned to user code. + it is returned to user code. This `post_delete_hardware` interceptor runs + before the `post_delete_hardware_with_metadata` interceptor. """ return response + def post_delete_hardware_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_hardware + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GDCHardwareManagement server but before it is returned to user code. + + We recommend only using this `post_delete_hardware_with_metadata` + interceptor in new development instead of the `post_delete_hardware` interceptor. + When both interceptors are used, this `post_delete_hardware_with_metadata` interceptor runs after the + `post_delete_hardware` interceptor. The (possibly modified) response returned by + `post_delete_hardware` will be passed to + `post_delete_hardware_with_metadata`. + """ + return response, metadata + def pre_delete_hardware_group( self, request: service.DeleteHardwareGroupRequest, @@ -538,12 +699,35 @@ def post_delete_hardware_group( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_hardware_group - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_hardware_group_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GDCHardwareManagement server but before - it is returned to user code. + it is returned to user code. This `post_delete_hardware_group` interceptor runs + before the `post_delete_hardware_group_with_metadata` interceptor. """ return response + def post_delete_hardware_group_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_hardware_group + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GDCHardwareManagement server but before it is returned to user code. + + We recommend only using this `post_delete_hardware_group_with_metadata` + interceptor in new development instead of the `post_delete_hardware_group` interceptor. + When both interceptors are used, this `post_delete_hardware_group_with_metadata` interceptor runs after the + `post_delete_hardware_group` interceptor. The (possibly modified) response returned by + `post_delete_hardware_group` will be passed to + `post_delete_hardware_group_with_metadata`. + """ + return response, metadata + def pre_delete_order( self, request: service.DeleteOrderRequest, @@ -561,12 +745,35 @@ def post_delete_order( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_order - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_order_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GDCHardwareManagement server but before - it is returned to user code. + it is returned to user code. This `post_delete_order` interceptor runs + before the `post_delete_order_with_metadata` interceptor. """ return response + def post_delete_order_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_order + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GDCHardwareManagement server but before it is returned to user code. + + We recommend only using this `post_delete_order_with_metadata` + interceptor in new development instead of the `post_delete_order` interceptor. + When both interceptors are used, this `post_delete_order_with_metadata` interceptor runs after the + `post_delete_order` interceptor. The (possibly modified) response returned by + `post_delete_order` will be passed to + `post_delete_order_with_metadata`. + """ + return response, metadata + def pre_delete_site( self, request: service.DeleteSiteRequest, @@ -584,12 +791,35 @@ def post_delete_site( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_site - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_site_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GDCHardwareManagement server but before - it is returned to user code. + it is returned to user code. This `post_delete_site` interceptor runs + before the `post_delete_site_with_metadata` interceptor. """ return response + def post_delete_site_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_site + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GDCHardwareManagement server but before it is returned to user code. + + We recommend only using this `post_delete_site_with_metadata` + interceptor in new development instead of the `post_delete_site` interceptor. + When both interceptors are used, this `post_delete_site_with_metadata` interceptor runs after the + `post_delete_site` interceptor. The (possibly modified) response returned by + `post_delete_site` will be passed to + `post_delete_site_with_metadata`. + """ + return response, metadata + def pre_delete_zone( self, request: service.DeleteZoneRequest, @@ -607,12 +837,35 @@ def post_delete_zone( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_zone - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_zone_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GDCHardwareManagement server but before - it is returned to user code. + it is returned to user code. This `post_delete_zone` interceptor runs + before the `post_delete_zone_with_metadata` interceptor. """ return response + def post_delete_zone_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_zone + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GDCHardwareManagement server but before it is returned to user code. + + We recommend only using this `post_delete_zone_with_metadata` + interceptor in new development instead of the `post_delete_zone` interceptor. + When both interceptors are used, this `post_delete_zone_with_metadata` interceptor runs after the + `post_delete_zone` interceptor. The (possibly modified) response returned by + `post_delete_zone` will be passed to + `post_delete_zone_with_metadata`. + """ + return response, metadata + def pre_get_change_log_entry( self, request: service.GetChangeLogEntryRequest, @@ -632,12 +885,35 @@ def post_get_change_log_entry( ) -> resources.ChangeLogEntry: """Post-rpc interceptor for get_change_log_entry - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_change_log_entry_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GDCHardwareManagement server but before - it is returned to user code. + it is returned to user code. This `post_get_change_log_entry` interceptor runs + before the `post_get_change_log_entry_with_metadata` interceptor. """ return response + def post_get_change_log_entry_with_metadata( + self, + response: resources.ChangeLogEntry, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.ChangeLogEntry, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_change_log_entry + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GDCHardwareManagement server but before it is returned to user code. + + We recommend only using this `post_get_change_log_entry_with_metadata` + interceptor in new development instead of the `post_get_change_log_entry` interceptor. + When both interceptors are used, this `post_get_change_log_entry_with_metadata` interceptor runs after the + `post_get_change_log_entry` interceptor. The (possibly modified) response returned by + `post_get_change_log_entry` will be passed to + `post_get_change_log_entry_with_metadata`. + """ + return response, metadata + def pre_get_comment( self, request: service.GetCommentRequest, @@ -653,12 +929,35 @@ def pre_get_comment( def post_get_comment(self, response: resources.Comment) -> resources.Comment: """Post-rpc interceptor for get_comment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_comment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GDCHardwareManagement server but before - it is returned to user code. + it is returned to user code. This `post_get_comment` interceptor runs + before the `post_get_comment_with_metadata` interceptor. """ return response + def post_get_comment_with_metadata( + self, + response: resources.Comment, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.Comment, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_comment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GDCHardwareManagement server but before it is returned to user code. + + We recommend only using this `post_get_comment_with_metadata` + interceptor in new development instead of the `post_get_comment` interceptor. + When both interceptors are used, this `post_get_comment_with_metadata` interceptor runs after the + `post_get_comment` interceptor. The (possibly modified) response returned by + `post_get_comment` will be passed to + `post_get_comment_with_metadata`. + """ + return response, metadata + def pre_get_hardware( self, request: service.GetHardwareRequest, @@ -674,12 +973,35 @@ def pre_get_hardware( def post_get_hardware(self, response: resources.Hardware) -> resources.Hardware: """Post-rpc interceptor for get_hardware - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_hardware_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GDCHardwareManagement server but before - it is returned to user code. + it is returned to user code. This `post_get_hardware` interceptor runs + before the `post_get_hardware_with_metadata` interceptor. """ return response + def post_get_hardware_with_metadata( + self, + response: resources.Hardware, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.Hardware, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_hardware + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GDCHardwareManagement server but before it is returned to user code. + + We recommend only using this `post_get_hardware_with_metadata` + interceptor in new development instead of the `post_get_hardware` interceptor. + When both interceptors are used, this `post_get_hardware_with_metadata` interceptor runs after the + `post_get_hardware` interceptor. The (possibly modified) response returned by + `post_get_hardware` will be passed to + `post_get_hardware_with_metadata`. + """ + return response, metadata + def pre_get_hardware_group( self, request: service.GetHardwareGroupRequest, @@ -699,12 +1021,35 @@ def post_get_hardware_group( ) -> resources.HardwareGroup: """Post-rpc interceptor for get_hardware_group - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_hardware_group_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GDCHardwareManagement server but before - it is returned to user code. + it is returned to user code. This `post_get_hardware_group` interceptor runs + before the `post_get_hardware_group_with_metadata` interceptor. """ return response + def post_get_hardware_group_with_metadata( + self, + response: resources.HardwareGroup, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.HardwareGroup, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_hardware_group + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GDCHardwareManagement server but before it is returned to user code. + + We recommend only using this `post_get_hardware_group_with_metadata` + interceptor in new development instead of the `post_get_hardware_group` interceptor. + When both interceptors are used, this `post_get_hardware_group_with_metadata` interceptor runs after the + `post_get_hardware_group` interceptor. The (possibly modified) response returned by + `post_get_hardware_group` will be passed to + `post_get_hardware_group_with_metadata`. + """ + return response, metadata + def pre_get_order( self, request: service.GetOrderRequest, @@ -720,12 +1065,35 @@ def pre_get_order( def post_get_order(self, response: resources.Order) -> resources.Order: """Post-rpc interceptor for get_order - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_order_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GDCHardwareManagement server but before - it is returned to user code. + it is returned to user code. This `post_get_order` interceptor runs + before the `post_get_order_with_metadata` interceptor. """ return response + def post_get_order_with_metadata( + self, + response: resources.Order, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.Order, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_order + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GDCHardwareManagement server but before it is returned to user code. + + We recommend only using this `post_get_order_with_metadata` + interceptor in new development instead of the `post_get_order` interceptor. + When both interceptors are used, this `post_get_order_with_metadata` interceptor runs after the + `post_get_order` interceptor. The (possibly modified) response returned by + `post_get_order` will be passed to + `post_get_order_with_metadata`. + """ + return response, metadata + def pre_get_site( self, request: service.GetSiteRequest, @@ -741,12 +1109,35 @@ def pre_get_site( def post_get_site(self, response: resources.Site) -> resources.Site: """Post-rpc interceptor for get_site - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_site_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GDCHardwareManagement server but before - it is returned to user code. + it is returned to user code. This `post_get_site` interceptor runs + before the `post_get_site_with_metadata` interceptor. """ return response + def post_get_site_with_metadata( + self, + response: resources.Site, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.Site, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_site + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GDCHardwareManagement server but before it is returned to user code. + + We recommend only using this `post_get_site_with_metadata` + interceptor in new development instead of the `post_get_site` interceptor. + When both interceptors are used, this `post_get_site_with_metadata` interceptor runs after the + `post_get_site` interceptor. The (possibly modified) response returned by + `post_get_site` will be passed to + `post_get_site_with_metadata`. + """ + return response, metadata + def pre_get_sku( self, request: service.GetSkuRequest, @@ -762,12 +1153,33 @@ def pre_get_sku( def post_get_sku(self, response: resources.Sku) -> resources.Sku: """Post-rpc interceptor for get_sku - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_sku_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GDCHardwareManagement server but before - it is returned to user code. + it is returned to user code. This `post_get_sku` interceptor runs + before the `post_get_sku_with_metadata` interceptor. """ return response + def post_get_sku_with_metadata( + self, response: resources.Sku, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[resources.Sku, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_sku + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GDCHardwareManagement server but before it is returned to user code. + + We recommend only using this `post_get_sku_with_metadata` + interceptor in new development instead of the `post_get_sku` interceptor. + When both interceptors are used, this `post_get_sku_with_metadata` interceptor runs after the + `post_get_sku` interceptor. The (possibly modified) response returned by + `post_get_sku` will be passed to + `post_get_sku_with_metadata`. + """ + return response, metadata + def pre_get_zone( self, request: service.GetZoneRequest, @@ -783,12 +1195,35 @@ def pre_get_zone( def post_get_zone(self, response: resources.Zone) -> resources.Zone: """Post-rpc interceptor for get_zone - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_zone_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GDCHardwareManagement server but before - it is returned to user code. + it is returned to user code. This `post_get_zone` interceptor runs + before the `post_get_zone_with_metadata` interceptor. """ return response + def post_get_zone_with_metadata( + self, + response: resources.Zone, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.Zone, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_zone + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GDCHardwareManagement server but before it is returned to user code. + + We recommend only using this `post_get_zone_with_metadata` + interceptor in new development instead of the `post_get_zone` interceptor. + When both interceptors are used, this `post_get_zone_with_metadata` interceptor runs after the + `post_get_zone` interceptor. The (possibly modified) response returned by + `post_get_zone` will be passed to + `post_get_zone_with_metadata`. + """ + return response, metadata + def pre_list_change_log_entries( self, request: service.ListChangeLogEntriesRequest, @@ -808,12 +1243,37 @@ def post_list_change_log_entries( ) -> service.ListChangeLogEntriesResponse: """Post-rpc interceptor for list_change_log_entries - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_change_log_entries_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GDCHardwareManagement server but before - it is returned to user code. + it is returned to user code. This `post_list_change_log_entries` interceptor runs + before the `post_list_change_log_entries_with_metadata` interceptor. """ return response + def post_list_change_log_entries_with_metadata( + self, + response: service.ListChangeLogEntriesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service.ListChangeLogEntriesResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_change_log_entries + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GDCHardwareManagement server but before it is returned to user code. + + We recommend only using this `post_list_change_log_entries_with_metadata` + interceptor in new development instead of the `post_list_change_log_entries` interceptor. + When both interceptors are used, this `post_list_change_log_entries_with_metadata` interceptor runs after the + `post_list_change_log_entries` interceptor. The (possibly modified) response returned by + `post_list_change_log_entries` will be passed to + `post_list_change_log_entries_with_metadata`. + """ + return response, metadata + def pre_list_comments( self, request: service.ListCommentsRequest, @@ -831,12 +1291,35 @@ def post_list_comments( ) -> service.ListCommentsResponse: """Post-rpc interceptor for list_comments - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_comments_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GDCHardwareManagement server but before - it is returned to user code. + it is returned to user code. This `post_list_comments` interceptor runs + before the `post_list_comments_with_metadata` interceptor. """ return response + def post_list_comments_with_metadata( + self, + response: service.ListCommentsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.ListCommentsResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_comments + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GDCHardwareManagement server but before it is returned to user code. + + We recommend only using this `post_list_comments_with_metadata` + interceptor in new development instead of the `post_list_comments` interceptor. + When both interceptors are used, this `post_list_comments_with_metadata` interceptor runs after the + `post_list_comments` interceptor. The (possibly modified) response returned by + `post_list_comments` will be passed to + `post_list_comments_with_metadata`. + """ + return response, metadata + def pre_list_hardware( self, request: service.ListHardwareRequest, @@ -854,12 +1337,35 @@ def post_list_hardware( ) -> service.ListHardwareResponse: """Post-rpc interceptor for list_hardware - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_hardware_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GDCHardwareManagement server but before - it is returned to user code. + it is returned to user code. This `post_list_hardware` interceptor runs + before the `post_list_hardware_with_metadata` interceptor. """ return response + def post_list_hardware_with_metadata( + self, + response: service.ListHardwareResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.ListHardwareResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_hardware + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GDCHardwareManagement server but before it is returned to user code. + + We recommend only using this `post_list_hardware_with_metadata` + interceptor in new development instead of the `post_list_hardware` interceptor. + When both interceptors are used, this `post_list_hardware_with_metadata` interceptor runs after the + `post_list_hardware` interceptor. The (possibly modified) response returned by + `post_list_hardware` will be passed to + `post_list_hardware_with_metadata`. + """ + return response, metadata + def pre_list_hardware_groups( self, request: service.ListHardwareGroupsRequest, @@ -879,12 +1385,37 @@ def post_list_hardware_groups( ) -> service.ListHardwareGroupsResponse: """Post-rpc interceptor for list_hardware_groups - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_hardware_groups_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GDCHardwareManagement server but before - it is returned to user code. + it is returned to user code. This `post_list_hardware_groups` interceptor runs + before the `post_list_hardware_groups_with_metadata` interceptor. """ return response + def post_list_hardware_groups_with_metadata( + self, + response: service.ListHardwareGroupsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service.ListHardwareGroupsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_hardware_groups + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GDCHardwareManagement server but before it is returned to user code. + + We recommend only using this `post_list_hardware_groups_with_metadata` + interceptor in new development instead of the `post_list_hardware_groups` interceptor. + When both interceptors are used, this `post_list_hardware_groups_with_metadata` interceptor runs after the + `post_list_hardware_groups` interceptor. The (possibly modified) response returned by + `post_list_hardware_groups` will be passed to + `post_list_hardware_groups_with_metadata`. + """ + return response, metadata + def pre_list_orders( self, request: service.ListOrdersRequest, @@ -902,12 +1433,35 @@ def post_list_orders( ) -> service.ListOrdersResponse: """Post-rpc interceptor for list_orders - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_orders_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GDCHardwareManagement server but before - it is returned to user code. + it is returned to user code. This `post_list_orders` interceptor runs + before the `post_list_orders_with_metadata` interceptor. """ return response + def post_list_orders_with_metadata( + self, + response: service.ListOrdersResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.ListOrdersResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_orders + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GDCHardwareManagement server but before it is returned to user code. + + We recommend only using this `post_list_orders_with_metadata` + interceptor in new development instead of the `post_list_orders` interceptor. + When both interceptors are used, this `post_list_orders_with_metadata` interceptor runs after the + `post_list_orders` interceptor. The (possibly modified) response returned by + `post_list_orders` will be passed to + `post_list_orders_with_metadata`. + """ + return response, metadata + def pre_list_sites( self, request: service.ListSitesRequest, @@ -925,12 +1479,35 @@ def post_list_sites( ) -> service.ListSitesResponse: """Post-rpc interceptor for list_sites - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_sites_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GDCHardwareManagement server but before - it is returned to user code. + it is returned to user code. This `post_list_sites` interceptor runs + before the `post_list_sites_with_metadata` interceptor. """ return response + def post_list_sites_with_metadata( + self, + response: service.ListSitesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.ListSitesResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_sites + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GDCHardwareManagement server but before it is returned to user code. + + We recommend only using this `post_list_sites_with_metadata` + interceptor in new development instead of the `post_list_sites` interceptor. + When both interceptors are used, this `post_list_sites_with_metadata` interceptor runs after the + `post_list_sites` interceptor. The (possibly modified) response returned by + `post_list_sites` will be passed to + `post_list_sites_with_metadata`. + """ + return response, metadata + def pre_list_skus( self, request: service.ListSkusRequest, @@ -948,12 +1525,35 @@ def post_list_skus( ) -> service.ListSkusResponse: """Post-rpc interceptor for list_skus - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_skus_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GDCHardwareManagement server but before - it is returned to user code. + it is returned to user code. This `post_list_skus` interceptor runs + before the `post_list_skus_with_metadata` interceptor. """ return response + def post_list_skus_with_metadata( + self, + response: service.ListSkusResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.ListSkusResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_skus + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GDCHardwareManagement server but before it is returned to user code. + + We recommend only using this `post_list_skus_with_metadata` + interceptor in new development instead of the `post_list_skus` interceptor. + When both interceptors are used, this `post_list_skus_with_metadata` interceptor runs after the + `post_list_skus` interceptor. The (possibly modified) response returned by + `post_list_skus` will be passed to + `post_list_skus_with_metadata`. + """ + return response, metadata + def pre_list_zones( self, request: service.ListZonesRequest, @@ -971,12 +1571,35 @@ def post_list_zones( ) -> service.ListZonesResponse: """Post-rpc interceptor for list_zones - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_zones_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GDCHardwareManagement server but before - it is returned to user code. + it is returned to user code. This `post_list_zones` interceptor runs + before the `post_list_zones_with_metadata` interceptor. """ return response + def post_list_zones_with_metadata( + self, + response: service.ListZonesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.ListZonesResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_zones + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GDCHardwareManagement server but before it is returned to user code. + + We recommend only using this `post_list_zones_with_metadata` + interceptor in new development instead of the `post_list_zones` interceptor. + When both interceptors are used, this `post_list_zones_with_metadata` interceptor runs after the + `post_list_zones` interceptor. The (possibly modified) response returned by + `post_list_zones` will be passed to + `post_list_zones_with_metadata`. + """ + return response, metadata + def pre_record_action_on_comment( self, request: service.RecordActionOnCommentRequest, @@ -996,12 +1619,35 @@ def post_record_action_on_comment( ) -> resources.Comment: """Post-rpc interceptor for record_action_on_comment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_record_action_on_comment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GDCHardwareManagement server but before - it is returned to user code. + it is returned to user code. This `post_record_action_on_comment` interceptor runs + before the `post_record_action_on_comment_with_metadata` interceptor. """ return response + def post_record_action_on_comment_with_metadata( + self, + response: resources.Comment, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.Comment, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for record_action_on_comment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GDCHardwareManagement server but before it is returned to user code. + + We recommend only using this `post_record_action_on_comment_with_metadata` + interceptor in new development instead of the `post_record_action_on_comment` interceptor. + When both interceptors are used, this `post_record_action_on_comment_with_metadata` interceptor runs after the + `post_record_action_on_comment` interceptor. The (possibly modified) response returned by + `post_record_action_on_comment` will be passed to + `post_record_action_on_comment_with_metadata`. + """ + return response, metadata + def pre_signal_zone_state( self, request: service.SignalZoneStateRequest, @@ -1019,12 +1665,35 @@ def post_signal_zone_state( ) -> operations_pb2.Operation: """Post-rpc interceptor for signal_zone_state - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_signal_zone_state_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GDCHardwareManagement server but before - it is returned to user code. + it is returned to user code. This `post_signal_zone_state` interceptor runs + before the `post_signal_zone_state_with_metadata` interceptor. """ return response + def post_signal_zone_state_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for signal_zone_state + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GDCHardwareManagement server but before it is returned to user code. + + We recommend only using this `post_signal_zone_state_with_metadata` + interceptor in new development instead of the `post_signal_zone_state` interceptor. + When both interceptors are used, this `post_signal_zone_state_with_metadata` interceptor runs after the + `post_signal_zone_state` interceptor. The (possibly modified) response returned by + `post_signal_zone_state` will be passed to + `post_signal_zone_state_with_metadata`. + """ + return response, metadata + def pre_submit_order( self, request: service.SubmitOrderRequest, @@ -1042,12 +1711,35 @@ def post_submit_order( ) -> operations_pb2.Operation: """Post-rpc interceptor for submit_order - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_submit_order_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GDCHardwareManagement server but before - it is returned to user code. + it is returned to user code. This `post_submit_order` interceptor runs + before the `post_submit_order_with_metadata` interceptor. """ return response + def post_submit_order_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for submit_order + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GDCHardwareManagement server but before it is returned to user code. + + We recommend only using this `post_submit_order_with_metadata` + interceptor in new development instead of the `post_submit_order` interceptor. + When both interceptors are used, this `post_submit_order_with_metadata` interceptor runs after the + `post_submit_order` interceptor. The (possibly modified) response returned by + `post_submit_order` will be passed to + `post_submit_order_with_metadata`. + """ + return response, metadata + def pre_update_hardware( self, request: service.UpdateHardwareRequest, @@ -1065,12 +1757,35 @@ def post_update_hardware( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_hardware - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_hardware_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GDCHardwareManagement server but before - it is returned to user code. + it is returned to user code. This `post_update_hardware` interceptor runs + before the `post_update_hardware_with_metadata` interceptor. """ return response + def post_update_hardware_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_hardware + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GDCHardwareManagement server but before it is returned to user code. + + We recommend only using this `post_update_hardware_with_metadata` + interceptor in new development instead of the `post_update_hardware` interceptor. + When both interceptors are used, this `post_update_hardware_with_metadata` interceptor runs after the + `post_update_hardware` interceptor. The (possibly modified) response returned by + `post_update_hardware` will be passed to + `post_update_hardware_with_metadata`. + """ + return response, metadata + def pre_update_hardware_group( self, request: service.UpdateHardwareGroupRequest, @@ -1090,12 +1805,35 @@ def post_update_hardware_group( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_hardware_group - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_hardware_group_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GDCHardwareManagement server but before - it is returned to user code. + it is returned to user code. This `post_update_hardware_group` interceptor runs + before the `post_update_hardware_group_with_metadata` interceptor. """ return response + def post_update_hardware_group_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_hardware_group + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GDCHardwareManagement server but before it is returned to user code. + + We recommend only using this `post_update_hardware_group_with_metadata` + interceptor in new development instead of the `post_update_hardware_group` interceptor. + When both interceptors are used, this `post_update_hardware_group_with_metadata` interceptor runs after the + `post_update_hardware_group` interceptor. The (possibly modified) response returned by + `post_update_hardware_group` will be passed to + `post_update_hardware_group_with_metadata`. + """ + return response, metadata + def pre_update_order( self, request: service.UpdateOrderRequest, @@ -1113,12 +1851,35 @@ def post_update_order( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_order - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_order_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GDCHardwareManagement server but before - it is returned to user code. + it is returned to user code. This `post_update_order` interceptor runs + before the `post_update_order_with_metadata` interceptor. """ return response + def post_update_order_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_order + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GDCHardwareManagement server but before it is returned to user code. + + We recommend only using this `post_update_order_with_metadata` + interceptor in new development instead of the `post_update_order` interceptor. + When both interceptors are used, this `post_update_order_with_metadata` interceptor runs after the + `post_update_order` interceptor. The (possibly modified) response returned by + `post_update_order` will be passed to + `post_update_order_with_metadata`. + """ + return response, metadata + def pre_update_site( self, request: service.UpdateSiteRequest, @@ -1136,12 +1897,35 @@ def post_update_site( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_site - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_site_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GDCHardwareManagement server but before - it is returned to user code. + it is returned to user code. This `post_update_site` interceptor runs + before the `post_update_site_with_metadata` interceptor. """ return response + def post_update_site_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_site + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GDCHardwareManagement server but before it is returned to user code. + + We recommend only using this `post_update_site_with_metadata` + interceptor in new development instead of the `post_update_site` interceptor. + When both interceptors are used, this `post_update_site_with_metadata` interceptor runs after the + `post_update_site` interceptor. The (possibly modified) response returned by + `post_update_site` will be passed to + `post_update_site_with_metadata`. + """ + return response, metadata + def pre_update_zone( self, request: service.UpdateZoneRequest, @@ -1159,12 +1943,35 @@ def post_update_zone( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_zone - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_zone_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GDCHardwareManagement server but before - it is returned to user code. + it is returned to user code. This `post_update_zone` interceptor runs + before the `post_update_zone_with_metadata` interceptor. """ return response + def post_update_zone_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_zone + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GDCHardwareManagement server but before it is returned to user code. + + We recommend only using this `post_update_zone_with_metadata` + interceptor in new development instead of the `post_update_zone` interceptor. + When both interceptors are used, this `post_update_zone_with_metadata` interceptor runs after the + `post_update_zone` interceptor. The (possibly modified) response returned by + `post_update_zone` will be passed to + `post_update_zone_with_metadata`. + """ + return response, metadata + def pre_get_location( self, request: locations_pb2.GetLocationRequest, @@ -1577,6 +2384,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_comment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_comment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1725,6 +2536,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_hardware(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_hardware_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1877,6 +2692,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_hardware_group(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_hardware_group_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2025,6 +2844,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_order(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_order_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2173,6 +2996,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_site(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_site_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2321,6 +3148,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_zone(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_zone_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2463,6 +3294,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_hardware(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_hardware_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2609,6 +3444,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_hardware_group(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_hardware_group_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2751,6 +3590,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_order(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_order_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2893,6 +3736,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_site(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_site_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3035,6 +3882,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_zone(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_zone_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3182,6 +4033,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_change_log_entry(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_change_log_entry_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3323,6 +4178,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_comment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_comment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3466,6 +4325,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_hardware(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_hardware_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3614,6 +4477,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_hardware_group(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_hardware_group_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3755,6 +4622,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_order(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_order_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3898,6 +4769,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_site(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_site_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4041,6 +4916,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_sku(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_sku_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4182,6 +5061,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_zone(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_zone_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4327,6 +5210,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_change_log_entries(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_change_log_entries_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4470,6 +5357,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_comments(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_comments_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4611,6 +5502,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_hardware(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_hardware_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4756,6 +5651,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_hardware_groups(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_hardware_groups_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4899,6 +5798,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_orders(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_orders_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5040,6 +5943,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_sites(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_sites_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5181,6 +6088,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_skus(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_skus_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5322,6 +6233,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_zones(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_zones_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5474,6 +6389,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_record_action_on_comment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_record_action_on_comment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5627,6 +6546,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_signal_zone_state(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_signal_zone_state_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5775,6 +6698,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_submit_order(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_submit_order_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5923,6 +6850,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_hardware(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_hardware_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6075,6 +7006,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_hardware_group(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_hardware_group_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6223,6 +7158,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_order(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_order_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6371,6 +7310,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_site(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_site_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6519,6 +7462,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_zone(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_zone_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-gdchardwaremanagement/samples/generated_samples/snippet_metadata_google.cloud.gdchardwaremanagement.v1alpha.json b/packages/google-cloud-gdchardwaremanagement/samples/generated_samples/snippet_metadata_google.cloud.gdchardwaremanagement.v1alpha.json index f140f2290e72..15bbbc60243a 100644 --- a/packages/google-cloud-gdchardwaremanagement/samples/generated_samples/snippet_metadata_google.cloud.gdchardwaremanagement.v1alpha.json +++ b/packages/google-cloud-gdchardwaremanagement/samples/generated_samples/snippet_metadata_google.cloud.gdchardwaremanagement.v1alpha.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-gdchardwaremanagement", - "version": "0.1.9" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-gdchardwaremanagement/tests/unit/gapic/gdchardwaremanagement_v1alpha/test_gdc_hardware_management.py b/packages/google-cloud-gdchardwaremanagement/tests/unit/gapic/gdchardwaremanagement_v1alpha/test_gdc_hardware_management.py index 7dbb7ddae2a9..f810ff2f674f 100644 --- a/packages/google-cloud-gdchardwaremanagement/tests/unit/gapic/gdchardwaremanagement_v1alpha/test_gdc_hardware_management.py +++ b/packages/google-cloud-gdchardwaremanagement/tests/unit/gapic/gdchardwaremanagement_v1alpha/test_gdc_hardware_management.py @@ -79,6 +79,13 @@ ) from google.cloud.gdchardwaremanagement_v1alpha.types import resources, service +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -354,6 +361,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = GDCHardwareManagementClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=["foo"]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + if show_cred_info: + assert error.details == ["foo", CRED_INFO_STRING] + else: + assert error.details == ["foo"] + + +@pytest.mark.parametrize("error_code", [401, 403, 404, 500]) +def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code): + cred = mock.Mock([]) + assert not hasattr(cred, "get_cred_info") + client = GDCHardwareManagementClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -23747,10 +23797,14 @@ def test_list_orders_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "post_list_orders" ) as post, mock.patch.object( + transports.GDCHardwareManagementRestInterceptor, + "post_list_orders_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "pre_list_orders" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListOrdersRequest.pb(service.ListOrdersRequest()) transcode.return_value = { "method": "post", @@ -23772,6 +23826,7 @@ def test_list_orders_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListOrdersResponse() + post_with_metadata.return_value = service.ListOrdersResponse(), metadata client.list_orders( request, @@ -23783,6 +23838,7 @@ def test_list_orders_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_order_rest_bad_request(request_type=service.GetOrderRequest): @@ -23881,10 +23937,13 @@ def test_get_order_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "post_get_order" ) as post, mock.patch.object( + transports.GDCHardwareManagementRestInterceptor, "post_get_order_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "pre_get_order" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetOrderRequest.pb(service.GetOrderRequest()) transcode.return_value = { "method": "post", @@ -23906,6 +23965,7 @@ def test_get_order_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Order() + post_with_metadata.return_value = resources.Order(), metadata client.get_order( request, @@ -23917,6 +23977,7 @@ def test_get_order_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_order_rest_bad_request(request_type=service.CreateOrderRequest): @@ -24123,10 +24184,14 @@ def test_create_order_rest_interceptors(null_interceptor): ), mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "post_create_order" ) as post, mock.patch.object( + transports.GDCHardwareManagementRestInterceptor, + "post_create_order_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "pre_create_order" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateOrderRequest.pb(service.CreateOrderRequest()) transcode.return_value = { "method": "post", @@ -24148,6 +24213,7 @@ def test_create_order_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_order( request, @@ -24159,6 +24225,7 @@ def test_create_order_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_order_rest_bad_request(request_type=service.UpdateOrderRequest): @@ -24369,10 +24436,14 @@ def test_update_order_rest_interceptors(null_interceptor): ), mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "post_update_order" ) as post, mock.patch.object( + transports.GDCHardwareManagementRestInterceptor, + "post_update_order_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "pre_update_order" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.UpdateOrderRequest.pb(service.UpdateOrderRequest()) transcode.return_value = { "method": "post", @@ -24394,6 +24465,7 @@ def test_update_order_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.update_order( request, @@ -24405,6 +24477,7 @@ def test_update_order_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_order_rest_bad_request(request_type=service.DeleteOrderRequest): @@ -24483,10 +24556,14 @@ def test_delete_order_rest_interceptors(null_interceptor): ), mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "post_delete_order" ) as post, mock.patch.object( + transports.GDCHardwareManagementRestInterceptor, + "post_delete_order_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "pre_delete_order" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.DeleteOrderRequest.pb(service.DeleteOrderRequest()) transcode.return_value = { "method": "post", @@ -24508,6 +24585,7 @@ def test_delete_order_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_order( request, @@ -24519,6 +24597,7 @@ def test_delete_order_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_submit_order_rest_bad_request(request_type=service.SubmitOrderRequest): @@ -24597,10 +24676,14 @@ def test_submit_order_rest_interceptors(null_interceptor): ), mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "post_submit_order" ) as post, mock.patch.object( + transports.GDCHardwareManagementRestInterceptor, + "post_submit_order_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "pre_submit_order" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.SubmitOrderRequest.pb(service.SubmitOrderRequest()) transcode.return_value = { "method": "post", @@ -24622,6 +24705,7 @@ def test_submit_order_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.submit_order( request, @@ -24633,6 +24717,7 @@ def test_submit_order_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_sites_rest_bad_request(request_type=service.ListSitesRequest): @@ -24717,10 +24802,13 @@ def test_list_sites_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "post_list_sites" ) as post, mock.patch.object( + transports.GDCHardwareManagementRestInterceptor, "post_list_sites_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "pre_list_sites" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListSitesRequest.pb(service.ListSitesRequest()) transcode.return_value = { "method": "post", @@ -24742,6 +24830,7 @@ def test_list_sites_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListSitesResponse() + post_with_metadata.return_value = service.ListSitesResponse(), metadata client.list_sites( request, @@ -24753,6 +24842,7 @@ def test_list_sites_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_site_rest_bad_request(request_type=service.GetSiteRequest): @@ -24845,10 +24935,13 @@ def test_get_site_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "post_get_site" ) as post, mock.patch.object( + transports.GDCHardwareManagementRestInterceptor, "post_get_site_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "pre_get_site" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetSiteRequest.pb(service.GetSiteRequest()) transcode.return_value = { "method": "post", @@ -24870,6 +24963,7 @@ def test_get_site_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Site() + post_with_metadata.return_value = resources.Site(), metadata client.get_site( request, @@ -24881,6 +24975,7 @@ def test_get_site_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_site_rest_bad_request(request_type=service.CreateSiteRequest): @@ -25076,10 +25171,14 @@ def test_create_site_rest_interceptors(null_interceptor): ), mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "post_create_site" ) as post, mock.patch.object( + transports.GDCHardwareManagementRestInterceptor, + "post_create_site_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "pre_create_site" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateSiteRequest.pb(service.CreateSiteRequest()) transcode.return_value = { "method": "post", @@ -25101,6 +25200,7 @@ def test_create_site_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_site( request, @@ -25112,6 +25212,7 @@ def test_create_site_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_site_rest_bad_request(request_type=service.UpdateSiteRequest): @@ -25311,10 +25412,14 @@ def test_update_site_rest_interceptors(null_interceptor): ), mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "post_update_site" ) as post, mock.patch.object( + transports.GDCHardwareManagementRestInterceptor, + "post_update_site_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "pre_update_site" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.UpdateSiteRequest.pb(service.UpdateSiteRequest()) transcode.return_value = { "method": "post", @@ -25336,6 +25441,7 @@ def test_update_site_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.update_site( request, @@ -25347,6 +25453,7 @@ def test_update_site_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_site_rest_bad_request(request_type=service.DeleteSiteRequest): @@ -25425,10 +25532,14 @@ def test_delete_site_rest_interceptors(null_interceptor): ), mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "post_delete_site" ) as post, mock.patch.object( + transports.GDCHardwareManagementRestInterceptor, + "post_delete_site_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "pre_delete_site" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.DeleteSiteRequest.pb(service.DeleteSiteRequest()) transcode.return_value = { "method": "post", @@ -25450,6 +25561,7 @@ def test_delete_site_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_site( request, @@ -25461,6 +25573,7 @@ def test_delete_site_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_hardware_groups_rest_bad_request( @@ -25547,10 +25660,14 @@ def test_list_hardware_groups_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "post_list_hardware_groups" ) as post, mock.patch.object( + transports.GDCHardwareManagementRestInterceptor, + "post_list_hardware_groups_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "pre_list_hardware_groups" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListHardwareGroupsRequest.pb( service.ListHardwareGroupsRequest() ) @@ -25576,6 +25693,7 @@ def test_list_hardware_groups_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListHardwareGroupsResponse() + post_with_metadata.return_value = service.ListHardwareGroupsResponse(), metadata client.list_hardware_groups( request, @@ -25587,6 +25705,7 @@ def test_list_hardware_groups_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_hardware_group_rest_bad_request( @@ -25683,10 +25802,14 @@ def test_get_hardware_group_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "post_get_hardware_group" ) as post, mock.patch.object( + transports.GDCHardwareManagementRestInterceptor, + "post_get_hardware_group_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "pre_get_hardware_group" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetHardwareGroupRequest.pb( service.GetHardwareGroupRequest() ) @@ -25710,6 +25833,7 @@ def test_get_hardware_group_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.HardwareGroup() + post_with_metadata.return_value = resources.HardwareGroup(), metadata client.get_hardware_group( request, @@ -25721,6 +25845,7 @@ def test_get_hardware_group_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_hardware_group_rest_bad_request( @@ -25884,10 +26009,14 @@ def test_create_hardware_group_rest_interceptors(null_interceptor): ), mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "post_create_hardware_group" ) as post, mock.patch.object( + transports.GDCHardwareManagementRestInterceptor, + "post_create_hardware_group_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "pre_create_hardware_group" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateHardwareGroupRequest.pb( service.CreateHardwareGroupRequest() ) @@ -25911,6 +26040,7 @@ def test_create_hardware_group_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_hardware_group( request, @@ -25922,6 +26052,7 @@ def test_create_hardware_group_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_hardware_group_rest_bad_request( @@ -26093,10 +26224,14 @@ def test_update_hardware_group_rest_interceptors(null_interceptor): ), mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "post_update_hardware_group" ) as post, mock.patch.object( + transports.GDCHardwareManagementRestInterceptor, + "post_update_hardware_group_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "pre_update_hardware_group" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.UpdateHardwareGroupRequest.pb( service.UpdateHardwareGroupRequest() ) @@ -26120,6 +26255,7 @@ def test_update_hardware_group_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.update_hardware_group( request, @@ -26131,6 +26267,7 @@ def test_update_hardware_group_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_hardware_group_rest_bad_request( @@ -26215,10 +26352,14 @@ def test_delete_hardware_group_rest_interceptors(null_interceptor): ), mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "post_delete_hardware_group" ) as post, mock.patch.object( + transports.GDCHardwareManagementRestInterceptor, + "post_delete_hardware_group_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "pre_delete_hardware_group" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.DeleteHardwareGroupRequest.pb( service.DeleteHardwareGroupRequest() ) @@ -26242,6 +26383,7 @@ def test_delete_hardware_group_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_hardware_group( request, @@ -26253,6 +26395,7 @@ def test_delete_hardware_group_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_hardware_rest_bad_request(request_type=service.ListHardwareRequest): @@ -26337,10 +26480,14 @@ def test_list_hardware_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "post_list_hardware" ) as post, mock.patch.object( + transports.GDCHardwareManagementRestInterceptor, + "post_list_hardware_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "pre_list_hardware" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListHardwareRequest.pb(service.ListHardwareRequest()) transcode.return_value = { "method": "post", @@ -26364,6 +26511,7 @@ def test_list_hardware_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListHardwareResponse() + post_with_metadata.return_value = service.ListHardwareResponse(), metadata client.list_hardware( request, @@ -26375,6 +26523,7 @@ def test_list_hardware_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_hardware_rest_bad_request(request_type=service.GetHardwareRequest): @@ -26471,10 +26620,14 @@ def test_get_hardware_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "post_get_hardware" ) as post, mock.patch.object( + transports.GDCHardwareManagementRestInterceptor, + "post_get_hardware_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "pre_get_hardware" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetHardwareRequest.pb(service.GetHardwareRequest()) transcode.return_value = { "method": "post", @@ -26496,6 +26649,7 @@ def test_get_hardware_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Hardware() + post_with_metadata.return_value = resources.Hardware(), metadata client.get_hardware( request, @@ -26507,6 +26661,7 @@ def test_get_hardware_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_hardware_rest_bad_request(request_type=service.CreateHardwareRequest): @@ -26714,10 +26869,14 @@ def test_create_hardware_rest_interceptors(null_interceptor): ), mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "post_create_hardware" ) as post, mock.patch.object( + transports.GDCHardwareManagementRestInterceptor, + "post_create_hardware_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "pre_create_hardware" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateHardwareRequest.pb(service.CreateHardwareRequest()) transcode.return_value = { "method": "post", @@ -26739,6 +26898,7 @@ def test_create_hardware_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_hardware( request, @@ -26750,6 +26910,7 @@ def test_create_hardware_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_hardware_rest_bad_request(request_type=service.UpdateHardwareRequest): @@ -26961,10 +27122,14 @@ def test_update_hardware_rest_interceptors(null_interceptor): ), mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "post_update_hardware" ) as post, mock.patch.object( + transports.GDCHardwareManagementRestInterceptor, + "post_update_hardware_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "pre_update_hardware" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.UpdateHardwareRequest.pb(service.UpdateHardwareRequest()) transcode.return_value = { "method": "post", @@ -26986,6 +27151,7 @@ def test_update_hardware_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.update_hardware( request, @@ -26997,6 +27163,7 @@ def test_update_hardware_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_hardware_rest_bad_request(request_type=service.DeleteHardwareRequest): @@ -27075,10 +27242,14 @@ def test_delete_hardware_rest_interceptors(null_interceptor): ), mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "post_delete_hardware" ) as post, mock.patch.object( + transports.GDCHardwareManagementRestInterceptor, + "post_delete_hardware_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "pre_delete_hardware" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.DeleteHardwareRequest.pb(service.DeleteHardwareRequest()) transcode.return_value = { "method": "post", @@ -27100,6 +27271,7 @@ def test_delete_hardware_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_hardware( request, @@ -27111,6 +27283,7 @@ def test_delete_hardware_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_comments_rest_bad_request(request_type=service.ListCommentsRequest): @@ -27195,10 +27368,14 @@ def test_list_comments_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "post_list_comments" ) as post, mock.patch.object( + transports.GDCHardwareManagementRestInterceptor, + "post_list_comments_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "pre_list_comments" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListCommentsRequest.pb(service.ListCommentsRequest()) transcode.return_value = { "method": "post", @@ -27222,6 +27399,7 @@ def test_list_comments_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListCommentsResponse() + post_with_metadata.return_value = service.ListCommentsResponse(), metadata client.list_comments( request, @@ -27233,6 +27411,7 @@ def test_list_comments_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_comment_rest_bad_request(request_type=service.GetCommentRequest): @@ -27325,10 +27504,14 @@ def test_get_comment_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "post_get_comment" ) as post, mock.patch.object( + transports.GDCHardwareManagementRestInterceptor, + "post_get_comment_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "pre_get_comment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetCommentRequest.pb(service.GetCommentRequest()) transcode.return_value = { "method": "post", @@ -27350,6 +27533,7 @@ def test_get_comment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Comment() + post_with_metadata.return_value = resources.Comment(), metadata client.get_comment( request, @@ -27361,6 +27545,7 @@ def test_get_comment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_comment_rest_bad_request(request_type=service.CreateCommentRequest): @@ -27515,10 +27700,14 @@ def test_create_comment_rest_interceptors(null_interceptor): ), mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "post_create_comment" ) as post, mock.patch.object( + transports.GDCHardwareManagementRestInterceptor, + "post_create_comment_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "pre_create_comment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateCommentRequest.pb(service.CreateCommentRequest()) transcode.return_value = { "method": "post", @@ -27540,6 +27729,7 @@ def test_create_comment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_comment( request, @@ -27551,6 +27741,7 @@ def test_create_comment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_record_action_on_comment_rest_bad_request( @@ -27645,10 +27836,14 @@ def test_record_action_on_comment_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "post_record_action_on_comment" ) as post, mock.patch.object( + transports.GDCHardwareManagementRestInterceptor, + "post_record_action_on_comment_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "pre_record_action_on_comment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.RecordActionOnCommentRequest.pb( service.RecordActionOnCommentRequest() ) @@ -27672,6 +27867,7 @@ def test_record_action_on_comment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Comment() + post_with_metadata.return_value = resources.Comment(), metadata client.record_action_on_comment( request, @@ -27683,6 +27879,7 @@ def test_record_action_on_comment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_change_log_entries_rest_bad_request( @@ -27769,10 +27966,14 @@ def test_list_change_log_entries_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "post_list_change_log_entries" ) as post, mock.patch.object( + transports.GDCHardwareManagementRestInterceptor, + "post_list_change_log_entries_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "pre_list_change_log_entries" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListChangeLogEntriesRequest.pb( service.ListChangeLogEntriesRequest() ) @@ -27798,6 +27999,10 @@ def test_list_change_log_entries_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListChangeLogEntriesResponse() + post_with_metadata.return_value = ( + service.ListChangeLogEntriesResponse(), + metadata, + ) client.list_change_log_entries( request, @@ -27809,6 +28014,7 @@ def test_list_change_log_entries_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_change_log_entry_rest_bad_request( @@ -27899,10 +28105,14 @@ def test_get_change_log_entry_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "post_get_change_log_entry" ) as post, mock.patch.object( + transports.GDCHardwareManagementRestInterceptor, + "post_get_change_log_entry_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "pre_get_change_log_entry" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetChangeLogEntryRequest.pb( service.GetChangeLogEntryRequest() ) @@ -27926,6 +28136,7 @@ def test_get_change_log_entry_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.ChangeLogEntry() + post_with_metadata.return_value = resources.ChangeLogEntry(), metadata client.get_change_log_entry( request, @@ -27937,6 +28148,7 @@ def test_get_change_log_entry_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_skus_rest_bad_request(request_type=service.ListSkusRequest): @@ -28021,10 +28233,13 @@ def test_list_skus_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "post_list_skus" ) as post, mock.patch.object( + transports.GDCHardwareManagementRestInterceptor, "post_list_skus_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "pre_list_skus" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListSkusRequest.pb(service.ListSkusRequest()) transcode.return_value = { "method": "post", @@ -28046,6 +28261,7 @@ def test_list_skus_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListSkusResponse() + post_with_metadata.return_value = service.ListSkusResponse(), metadata client.list_skus( request, @@ -28057,6 +28273,7 @@ def test_list_skus_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_sku_rest_bad_request(request_type=service.GetSkuRequest): @@ -28151,10 +28368,13 @@ def test_get_sku_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "post_get_sku" ) as post, mock.patch.object( + transports.GDCHardwareManagementRestInterceptor, "post_get_sku_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "pre_get_sku" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetSkuRequest.pb(service.GetSkuRequest()) transcode.return_value = { "method": "post", @@ -28176,6 +28396,7 @@ def test_get_sku_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Sku() + post_with_metadata.return_value = resources.Sku(), metadata client.get_sku( request, @@ -28187,6 +28408,7 @@ def test_get_sku_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_zones_rest_bad_request(request_type=service.ListZonesRequest): @@ -28271,10 +28493,13 @@ def test_list_zones_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "post_list_zones" ) as post, mock.patch.object( + transports.GDCHardwareManagementRestInterceptor, "post_list_zones_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "pre_list_zones" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListZonesRequest.pb(service.ListZonesRequest()) transcode.return_value = { "method": "post", @@ -28296,6 +28521,7 @@ def test_list_zones_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListZonesResponse() + post_with_metadata.return_value = service.ListZonesResponse(), metadata client.list_zones( request, @@ -28307,6 +28533,7 @@ def test_list_zones_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_zone_rest_bad_request(request_type=service.GetZoneRequest): @@ -28402,10 +28629,13 @@ def test_get_zone_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "post_get_zone" ) as post, mock.patch.object( + transports.GDCHardwareManagementRestInterceptor, "post_get_zone_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "pre_get_zone" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetZoneRequest.pb(service.GetZoneRequest()) transcode.return_value = { "method": "post", @@ -28427,6 +28657,7 @@ def test_get_zone_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Zone() + post_with_metadata.return_value = resources.Zone(), metadata client.get_zone( request, @@ -28438,6 +28669,7 @@ def test_get_zone_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_zone_rest_bad_request(request_type=service.CreateZoneRequest): @@ -28637,10 +28869,14 @@ def test_create_zone_rest_interceptors(null_interceptor): ), mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "post_create_zone" ) as post, mock.patch.object( + transports.GDCHardwareManagementRestInterceptor, + "post_create_zone_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "pre_create_zone" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateZoneRequest.pb(service.CreateZoneRequest()) transcode.return_value = { "method": "post", @@ -28662,6 +28898,7 @@ def test_create_zone_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_zone( request, @@ -28673,6 +28910,7 @@ def test_create_zone_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_zone_rest_bad_request(request_type=service.UpdateZoneRequest): @@ -28876,10 +29114,14 @@ def test_update_zone_rest_interceptors(null_interceptor): ), mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "post_update_zone" ) as post, mock.patch.object( + transports.GDCHardwareManagementRestInterceptor, + "post_update_zone_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "pre_update_zone" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.UpdateZoneRequest.pb(service.UpdateZoneRequest()) transcode.return_value = { "method": "post", @@ -28901,6 +29143,7 @@ def test_update_zone_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.update_zone( request, @@ -28912,6 +29155,7 @@ def test_update_zone_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_zone_rest_bad_request(request_type=service.DeleteZoneRequest): @@ -28990,10 +29234,14 @@ def test_delete_zone_rest_interceptors(null_interceptor): ), mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "post_delete_zone" ) as post, mock.patch.object( + transports.GDCHardwareManagementRestInterceptor, + "post_delete_zone_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "pre_delete_zone" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.DeleteZoneRequest.pb(service.DeleteZoneRequest()) transcode.return_value = { "method": "post", @@ -29015,6 +29263,7 @@ def test_delete_zone_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_zone( request, @@ -29026,6 +29275,7 @@ def test_delete_zone_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_signal_zone_state_rest_bad_request( @@ -29106,10 +29356,14 @@ def test_signal_zone_state_rest_interceptors(null_interceptor): ), mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "post_signal_zone_state" ) as post, mock.patch.object( + transports.GDCHardwareManagementRestInterceptor, + "post_signal_zone_state_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GDCHardwareManagementRestInterceptor, "pre_signal_zone_state" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.SignalZoneStateRequest.pb(service.SignalZoneStateRequest()) transcode.return_value = { "method": "post", @@ -29131,6 +29385,7 @@ def test_signal_zone_state_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.signal_zone_state( request, @@ -29142,6 +29397,7 @@ def test_signal_zone_state_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_location_rest_bad_request(request_type=locations_pb2.GetLocationRequest): diff --git a/packages/google-cloud-gke-backup/google/cloud/gke_backup/gapic_version.py b/packages/google-cloud-gke-backup/google/cloud/gke_backup/gapic_version.py index 0f3dcb10f73a..558c8aab67c5 100644 --- a/packages/google-cloud-gke-backup/google/cloud/gke_backup/gapic_version.py +++ b/packages/google-cloud-gke-backup/google/cloud/gke_backup/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.5.14" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-gke-backup/google/cloud/gke_backup_v1/gapic_version.py b/packages/google-cloud-gke-backup/google/cloud/gke_backup_v1/gapic_version.py index 0f3dcb10f73a..558c8aab67c5 100644 --- a/packages/google-cloud-gke-backup/google/cloud/gke_backup_v1/gapic_version.py +++ b/packages/google-cloud-gke-backup/google/cloud/gke_backup_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.5.14" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-gke-backup/google/cloud/gke_backup_v1/services/backup_for_gke/client.py b/packages/google-cloud-gke-backup/google/cloud/gke_backup_v1/services/backup_for_gke/client.py index 81546677aa41..41300044f0b3 100644 --- a/packages/google-cloud-gke-backup/google/cloud/gke_backup_v1/services/backup_for_gke/client.py +++ b/packages/google-cloud-gke-backup/google/cloud/gke_backup_v1/services/backup_for_gke/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -674,6 +676,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. @@ -4088,16 +4117,20 @@ def list_operations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def get_operation( self, @@ -4143,16 +4176,20 @@ def get_operation( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def delete_operation( self, @@ -4375,16 +4412,20 @@ def set_iam_policy( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def get_iam_policy( self, @@ -4497,16 +4538,20 @@ def get_iam_policy( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def test_iam_permissions( self, @@ -4557,16 +4602,20 @@ def test_iam_permissions( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def get_location( self, @@ -4612,16 +4661,20 @@ def get_location( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def list_locations( self, @@ -4667,16 +4720,20 @@ def list_locations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-gke-backup/google/cloud/gke_backup_v1/services/backup_for_gke/transports/rest.py b/packages/google-cloud-gke-backup/google/cloud/gke_backup_v1/services/backup_for_gke/transports/rest.py index 501b63887084..46690fbf9119 100644 --- a/packages/google-cloud-gke-backup/google/cloud/gke_backup_v1/services/backup_for_gke/transports/rest.py +++ b/packages/google-cloud-gke-backup/google/cloud/gke_backup_v1/services/backup_for_gke/transports/rest.py @@ -302,12 +302,35 @@ def post_create_backup( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_backup - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_backup_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BackupForGKE server but before - it is returned to user code. + it is returned to user code. This `post_create_backup` interceptor runs + before the `post_create_backup_with_metadata` interceptor. """ return response + def post_create_backup_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_backup + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BackupForGKE server but before it is returned to user code. + + We recommend only using this `post_create_backup_with_metadata` + interceptor in new development instead of the `post_create_backup` interceptor. + When both interceptors are used, this `post_create_backup_with_metadata` interceptor runs after the + `post_create_backup` interceptor. The (possibly modified) response returned by + `post_create_backup` will be passed to + `post_create_backup_with_metadata`. + """ + return response, metadata + def pre_create_backup_plan( self, request: gkebackup.CreateBackupPlanRequest, @@ -327,12 +350,35 @@ def post_create_backup_plan( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_backup_plan - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_backup_plan_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BackupForGKE server but before - it is returned to user code. + it is returned to user code. This `post_create_backup_plan` interceptor runs + before the `post_create_backup_plan_with_metadata` interceptor. """ return response + def post_create_backup_plan_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_backup_plan + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BackupForGKE server but before it is returned to user code. + + We recommend only using this `post_create_backup_plan_with_metadata` + interceptor in new development instead of the `post_create_backup_plan` interceptor. + When both interceptors are used, this `post_create_backup_plan_with_metadata` interceptor runs after the + `post_create_backup_plan` interceptor. The (possibly modified) response returned by + `post_create_backup_plan` will be passed to + `post_create_backup_plan_with_metadata`. + """ + return response, metadata + def pre_create_restore( self, request: gkebackup.CreateRestoreRequest, @@ -350,12 +396,35 @@ def post_create_restore( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_restore - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_restore_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BackupForGKE server but before - it is returned to user code. + it is returned to user code. This `post_create_restore` interceptor runs + before the `post_create_restore_with_metadata` interceptor. """ return response + def post_create_restore_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_restore + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BackupForGKE server but before it is returned to user code. + + We recommend only using this `post_create_restore_with_metadata` + interceptor in new development instead of the `post_create_restore` interceptor. + When both interceptors are used, this `post_create_restore_with_metadata` interceptor runs after the + `post_create_restore` interceptor. The (possibly modified) response returned by + `post_create_restore` will be passed to + `post_create_restore_with_metadata`. + """ + return response, metadata + def pre_create_restore_plan( self, request: gkebackup.CreateRestorePlanRequest, @@ -375,12 +444,35 @@ def post_create_restore_plan( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_restore_plan - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_restore_plan_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BackupForGKE server but before - it is returned to user code. + it is returned to user code. This `post_create_restore_plan` interceptor runs + before the `post_create_restore_plan_with_metadata` interceptor. """ return response + def post_create_restore_plan_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_restore_plan + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BackupForGKE server but before it is returned to user code. + + We recommend only using this `post_create_restore_plan_with_metadata` + interceptor in new development instead of the `post_create_restore_plan` interceptor. + When both interceptors are used, this `post_create_restore_plan_with_metadata` interceptor runs after the + `post_create_restore_plan` interceptor. The (possibly modified) response returned by + `post_create_restore_plan` will be passed to + `post_create_restore_plan_with_metadata`. + """ + return response, metadata + def pre_delete_backup( self, request: gkebackup.DeleteBackupRequest, @@ -398,12 +490,35 @@ def post_delete_backup( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_backup - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_backup_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BackupForGKE server but before - it is returned to user code. + it is returned to user code. This `post_delete_backup` interceptor runs + before the `post_delete_backup_with_metadata` interceptor. """ return response + def post_delete_backup_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_backup + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BackupForGKE server but before it is returned to user code. + + We recommend only using this `post_delete_backup_with_metadata` + interceptor in new development instead of the `post_delete_backup` interceptor. + When both interceptors are used, this `post_delete_backup_with_metadata` interceptor runs after the + `post_delete_backup` interceptor. The (possibly modified) response returned by + `post_delete_backup` will be passed to + `post_delete_backup_with_metadata`. + """ + return response, metadata + def pre_delete_backup_plan( self, request: gkebackup.DeleteBackupPlanRequest, @@ -423,12 +538,35 @@ def post_delete_backup_plan( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_backup_plan - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_backup_plan_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BackupForGKE server but before - it is returned to user code. + it is returned to user code. This `post_delete_backup_plan` interceptor runs + before the `post_delete_backup_plan_with_metadata` interceptor. """ return response + def post_delete_backup_plan_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_backup_plan + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BackupForGKE server but before it is returned to user code. + + We recommend only using this `post_delete_backup_plan_with_metadata` + interceptor in new development instead of the `post_delete_backup_plan` interceptor. + When both interceptors are used, this `post_delete_backup_plan_with_metadata` interceptor runs after the + `post_delete_backup_plan` interceptor. The (possibly modified) response returned by + `post_delete_backup_plan` will be passed to + `post_delete_backup_plan_with_metadata`. + """ + return response, metadata + def pre_delete_restore( self, request: gkebackup.DeleteRestoreRequest, @@ -446,12 +584,35 @@ def post_delete_restore( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_restore - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_restore_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BackupForGKE server but before - it is returned to user code. + it is returned to user code. This `post_delete_restore` interceptor runs + before the `post_delete_restore_with_metadata` interceptor. """ return response + def post_delete_restore_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_restore + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BackupForGKE server but before it is returned to user code. + + We recommend only using this `post_delete_restore_with_metadata` + interceptor in new development instead of the `post_delete_restore` interceptor. + When both interceptors are used, this `post_delete_restore_with_metadata` interceptor runs after the + `post_delete_restore` interceptor. The (possibly modified) response returned by + `post_delete_restore` will be passed to + `post_delete_restore_with_metadata`. + """ + return response, metadata + def pre_delete_restore_plan( self, request: gkebackup.DeleteRestorePlanRequest, @@ -471,12 +632,35 @@ def post_delete_restore_plan( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_restore_plan - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_restore_plan_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BackupForGKE server but before - it is returned to user code. + it is returned to user code. This `post_delete_restore_plan` interceptor runs + before the `post_delete_restore_plan_with_metadata` interceptor. """ return response + def post_delete_restore_plan_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_restore_plan + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BackupForGKE server but before it is returned to user code. + + We recommend only using this `post_delete_restore_plan_with_metadata` + interceptor in new development instead of the `post_delete_restore_plan` interceptor. + When both interceptors are used, this `post_delete_restore_plan_with_metadata` interceptor runs after the + `post_delete_restore_plan` interceptor. The (possibly modified) response returned by + `post_delete_restore_plan` will be passed to + `post_delete_restore_plan_with_metadata`. + """ + return response, metadata + def pre_get_backup( self, request: gkebackup.GetBackupRequest, @@ -492,12 +676,33 @@ def pre_get_backup( def post_get_backup(self, response: backup.Backup) -> backup.Backup: """Post-rpc interceptor for get_backup - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_backup_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BackupForGKE server but before - it is returned to user code. + it is returned to user code. This `post_get_backup` interceptor runs + before the `post_get_backup_with_metadata` interceptor. """ return response + def post_get_backup_with_metadata( + self, response: backup.Backup, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[backup.Backup, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_backup + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BackupForGKE server but before it is returned to user code. + + We recommend only using this `post_get_backup_with_metadata` + interceptor in new development instead of the `post_get_backup` interceptor. + When both interceptors are used, this `post_get_backup_with_metadata` interceptor runs after the + `post_get_backup` interceptor. The (possibly modified) response returned by + `post_get_backup` will be passed to + `post_get_backup_with_metadata`. + """ + return response, metadata + def pre_get_backup_index_download_url( self, request: gkebackup.GetBackupIndexDownloadUrlRequest, @@ -518,12 +723,38 @@ def post_get_backup_index_download_url( ) -> gkebackup.GetBackupIndexDownloadUrlResponse: """Post-rpc interceptor for get_backup_index_download_url - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_backup_index_download_url_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BackupForGKE server but before - it is returned to user code. + it is returned to user code. This `post_get_backup_index_download_url` interceptor runs + before the `post_get_backup_index_download_url_with_metadata` interceptor. """ return response + def post_get_backup_index_download_url_with_metadata( + self, + response: gkebackup.GetBackupIndexDownloadUrlResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + gkebackup.GetBackupIndexDownloadUrlResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for get_backup_index_download_url + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BackupForGKE server but before it is returned to user code. + + We recommend only using this `post_get_backup_index_download_url_with_metadata` + interceptor in new development instead of the `post_get_backup_index_download_url` interceptor. + When both interceptors are used, this `post_get_backup_index_download_url_with_metadata` interceptor runs after the + `post_get_backup_index_download_url` interceptor. The (possibly modified) response returned by + `post_get_backup_index_download_url` will be passed to + `post_get_backup_index_download_url_with_metadata`. + """ + return response, metadata + def pre_get_backup_plan( self, request: gkebackup.GetBackupPlanRequest, @@ -541,12 +772,35 @@ def post_get_backup_plan( ) -> backup_plan.BackupPlan: """Post-rpc interceptor for get_backup_plan - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_backup_plan_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BackupForGKE server but before - it is returned to user code. + it is returned to user code. This `post_get_backup_plan` interceptor runs + before the `post_get_backup_plan_with_metadata` interceptor. """ return response + def post_get_backup_plan_with_metadata( + self, + response: backup_plan.BackupPlan, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[backup_plan.BackupPlan, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_backup_plan + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BackupForGKE server but before it is returned to user code. + + We recommend only using this `post_get_backup_plan_with_metadata` + interceptor in new development instead of the `post_get_backup_plan` interceptor. + When both interceptors are used, this `post_get_backup_plan_with_metadata` interceptor runs after the + `post_get_backup_plan` interceptor. The (possibly modified) response returned by + `post_get_backup_plan` will be passed to + `post_get_backup_plan_with_metadata`. + """ + return response, metadata + def pre_get_restore( self, request: gkebackup.GetRestoreRequest, @@ -562,12 +816,35 @@ def pre_get_restore( def post_get_restore(self, response: restore.Restore) -> restore.Restore: """Post-rpc interceptor for get_restore - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_restore_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BackupForGKE server but before - it is returned to user code. + it is returned to user code. This `post_get_restore` interceptor runs + before the `post_get_restore_with_metadata` interceptor. """ return response + def post_get_restore_with_metadata( + self, + response: restore.Restore, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[restore.Restore, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_restore + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BackupForGKE server but before it is returned to user code. + + We recommend only using this `post_get_restore_with_metadata` + interceptor in new development instead of the `post_get_restore` interceptor. + When both interceptors are used, this `post_get_restore_with_metadata` interceptor runs after the + `post_get_restore` interceptor. The (possibly modified) response returned by + `post_get_restore` will be passed to + `post_get_restore_with_metadata`. + """ + return response, metadata + def pre_get_restore_plan( self, request: gkebackup.GetRestorePlanRequest, @@ -587,12 +864,35 @@ def post_get_restore_plan( ) -> restore_plan.RestorePlan: """Post-rpc interceptor for get_restore_plan - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_restore_plan_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BackupForGKE server but before - it is returned to user code. + it is returned to user code. This `post_get_restore_plan` interceptor runs + before the `post_get_restore_plan_with_metadata` interceptor. """ return response + def post_get_restore_plan_with_metadata( + self, + response: restore_plan.RestorePlan, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[restore_plan.RestorePlan, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_restore_plan + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BackupForGKE server but before it is returned to user code. + + We recommend only using this `post_get_restore_plan_with_metadata` + interceptor in new development instead of the `post_get_restore_plan` interceptor. + When both interceptors are used, this `post_get_restore_plan_with_metadata` interceptor runs after the + `post_get_restore_plan` interceptor. The (possibly modified) response returned by + `post_get_restore_plan` will be passed to + `post_get_restore_plan_with_metadata`. + """ + return response, metadata + def pre_get_volume_backup( self, request: gkebackup.GetVolumeBackupRequest, @@ -612,12 +912,35 @@ def post_get_volume_backup( ) -> volume.VolumeBackup: """Post-rpc interceptor for get_volume_backup - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_volume_backup_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BackupForGKE server but before - it is returned to user code. + it is returned to user code. This `post_get_volume_backup` interceptor runs + before the `post_get_volume_backup_with_metadata` interceptor. """ return response + def post_get_volume_backup_with_metadata( + self, + response: volume.VolumeBackup, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[volume.VolumeBackup, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_volume_backup + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BackupForGKE server but before it is returned to user code. + + We recommend only using this `post_get_volume_backup_with_metadata` + interceptor in new development instead of the `post_get_volume_backup` interceptor. + When both interceptors are used, this `post_get_volume_backup_with_metadata` interceptor runs after the + `post_get_volume_backup` interceptor. The (possibly modified) response returned by + `post_get_volume_backup` will be passed to + `post_get_volume_backup_with_metadata`. + """ + return response, metadata + def pre_get_volume_restore( self, request: gkebackup.GetVolumeRestoreRequest, @@ -637,12 +960,35 @@ def post_get_volume_restore( ) -> volume.VolumeRestore: """Post-rpc interceptor for get_volume_restore - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_volume_restore_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BackupForGKE server but before - it is returned to user code. + it is returned to user code. This `post_get_volume_restore` interceptor runs + before the `post_get_volume_restore_with_metadata` interceptor. """ return response + def post_get_volume_restore_with_metadata( + self, + response: volume.VolumeRestore, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[volume.VolumeRestore, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_volume_restore + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BackupForGKE server but before it is returned to user code. + + We recommend only using this `post_get_volume_restore_with_metadata` + interceptor in new development instead of the `post_get_volume_restore` interceptor. + When both interceptors are used, this `post_get_volume_restore_with_metadata` interceptor runs after the + `post_get_volume_restore` interceptor. The (possibly modified) response returned by + `post_get_volume_restore` will be passed to + `post_get_volume_restore_with_metadata`. + """ + return response, metadata + def pre_list_backup_plans( self, request: gkebackup.ListBackupPlansRequest, @@ -662,12 +1008,37 @@ def post_list_backup_plans( ) -> gkebackup.ListBackupPlansResponse: """Post-rpc interceptor for list_backup_plans - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_backup_plans_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BackupForGKE server but before - it is returned to user code. + it is returned to user code. This `post_list_backup_plans` interceptor runs + before the `post_list_backup_plans_with_metadata` interceptor. """ return response + def post_list_backup_plans_with_metadata( + self, + response: gkebackup.ListBackupPlansResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + gkebackup.ListBackupPlansResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_backup_plans + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BackupForGKE server but before it is returned to user code. + + We recommend only using this `post_list_backup_plans_with_metadata` + interceptor in new development instead of the `post_list_backup_plans` interceptor. + When both interceptors are used, this `post_list_backup_plans_with_metadata` interceptor runs after the + `post_list_backup_plans` interceptor. The (possibly modified) response returned by + `post_list_backup_plans` will be passed to + `post_list_backup_plans_with_metadata`. + """ + return response, metadata + def pre_list_backups( self, request: gkebackup.ListBackupsRequest, @@ -685,12 +1056,35 @@ def post_list_backups( ) -> gkebackup.ListBackupsResponse: """Post-rpc interceptor for list_backups - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_backups_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BackupForGKE server but before - it is returned to user code. + it is returned to user code. This `post_list_backups` interceptor runs + before the `post_list_backups_with_metadata` interceptor. """ return response + def post_list_backups_with_metadata( + self, + response: gkebackup.ListBackupsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gkebackup.ListBackupsResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_backups + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BackupForGKE server but before it is returned to user code. + + We recommend only using this `post_list_backups_with_metadata` + interceptor in new development instead of the `post_list_backups` interceptor. + When both interceptors are used, this `post_list_backups_with_metadata` interceptor runs after the + `post_list_backups` interceptor. The (possibly modified) response returned by + `post_list_backups` will be passed to + `post_list_backups_with_metadata`. + """ + return response, metadata + def pre_list_restore_plans( self, request: gkebackup.ListRestorePlansRequest, @@ -710,12 +1104,37 @@ def post_list_restore_plans( ) -> gkebackup.ListRestorePlansResponse: """Post-rpc interceptor for list_restore_plans - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_restore_plans_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BackupForGKE server but before - it is returned to user code. + it is returned to user code. This `post_list_restore_plans` interceptor runs + before the `post_list_restore_plans_with_metadata` interceptor. """ return response + def post_list_restore_plans_with_metadata( + self, + response: gkebackup.ListRestorePlansResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + gkebackup.ListRestorePlansResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_restore_plans + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BackupForGKE server but before it is returned to user code. + + We recommend only using this `post_list_restore_plans_with_metadata` + interceptor in new development instead of the `post_list_restore_plans` interceptor. + When both interceptors are used, this `post_list_restore_plans_with_metadata` interceptor runs after the + `post_list_restore_plans` interceptor. The (possibly modified) response returned by + `post_list_restore_plans` will be passed to + `post_list_restore_plans_with_metadata`. + """ + return response, metadata + def pre_list_restores( self, request: gkebackup.ListRestoresRequest, @@ -733,12 +1152,35 @@ def post_list_restores( ) -> gkebackup.ListRestoresResponse: """Post-rpc interceptor for list_restores - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_restores_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BackupForGKE server but before - it is returned to user code. + it is returned to user code. This `post_list_restores` interceptor runs + before the `post_list_restores_with_metadata` interceptor. """ return response + def post_list_restores_with_metadata( + self, + response: gkebackup.ListRestoresResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gkebackup.ListRestoresResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_restores + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BackupForGKE server but before it is returned to user code. + + We recommend only using this `post_list_restores_with_metadata` + interceptor in new development instead of the `post_list_restores` interceptor. + When both interceptors are used, this `post_list_restores_with_metadata` interceptor runs after the + `post_list_restores` interceptor. The (possibly modified) response returned by + `post_list_restores` will be passed to + `post_list_restores_with_metadata`. + """ + return response, metadata + def pre_list_volume_backups( self, request: gkebackup.ListVolumeBackupsRequest, @@ -758,12 +1200,37 @@ def post_list_volume_backups( ) -> gkebackup.ListVolumeBackupsResponse: """Post-rpc interceptor for list_volume_backups - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_volume_backups_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BackupForGKE server but before - it is returned to user code. + it is returned to user code. This `post_list_volume_backups` interceptor runs + before the `post_list_volume_backups_with_metadata` interceptor. """ return response + def post_list_volume_backups_with_metadata( + self, + response: gkebackup.ListVolumeBackupsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + gkebackup.ListVolumeBackupsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_volume_backups + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BackupForGKE server but before it is returned to user code. + + We recommend only using this `post_list_volume_backups_with_metadata` + interceptor in new development instead of the `post_list_volume_backups` interceptor. + When both interceptors are used, this `post_list_volume_backups_with_metadata` interceptor runs after the + `post_list_volume_backups` interceptor. The (possibly modified) response returned by + `post_list_volume_backups` will be passed to + `post_list_volume_backups_with_metadata`. + """ + return response, metadata + def pre_list_volume_restores( self, request: gkebackup.ListVolumeRestoresRequest, @@ -783,12 +1250,37 @@ def post_list_volume_restores( ) -> gkebackup.ListVolumeRestoresResponse: """Post-rpc interceptor for list_volume_restores - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_volume_restores_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BackupForGKE server but before - it is returned to user code. + it is returned to user code. This `post_list_volume_restores` interceptor runs + before the `post_list_volume_restores_with_metadata` interceptor. """ return response + def post_list_volume_restores_with_metadata( + self, + response: gkebackup.ListVolumeRestoresResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + gkebackup.ListVolumeRestoresResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_volume_restores + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BackupForGKE server but before it is returned to user code. + + We recommend only using this `post_list_volume_restores_with_metadata` + interceptor in new development instead of the `post_list_volume_restores` interceptor. + When both interceptors are used, this `post_list_volume_restores_with_metadata` interceptor runs after the + `post_list_volume_restores` interceptor. The (possibly modified) response returned by + `post_list_volume_restores` will be passed to + `post_list_volume_restores_with_metadata`. + """ + return response, metadata + def pre_update_backup( self, request: gkebackup.UpdateBackupRequest, @@ -806,12 +1298,35 @@ def post_update_backup( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_backup - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_backup_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BackupForGKE server but before - it is returned to user code. + it is returned to user code. This `post_update_backup` interceptor runs + before the `post_update_backup_with_metadata` interceptor. """ return response + def post_update_backup_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_backup + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BackupForGKE server but before it is returned to user code. + + We recommend only using this `post_update_backup_with_metadata` + interceptor in new development instead of the `post_update_backup` interceptor. + When both interceptors are used, this `post_update_backup_with_metadata` interceptor runs after the + `post_update_backup` interceptor. The (possibly modified) response returned by + `post_update_backup` will be passed to + `post_update_backup_with_metadata`. + """ + return response, metadata + def pre_update_backup_plan( self, request: gkebackup.UpdateBackupPlanRequest, @@ -831,12 +1346,35 @@ def post_update_backup_plan( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_backup_plan - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_backup_plan_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BackupForGKE server but before - it is returned to user code. + it is returned to user code. This `post_update_backup_plan` interceptor runs + before the `post_update_backup_plan_with_metadata` interceptor. """ return response + def post_update_backup_plan_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_backup_plan + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BackupForGKE server but before it is returned to user code. + + We recommend only using this `post_update_backup_plan_with_metadata` + interceptor in new development instead of the `post_update_backup_plan` interceptor. + When both interceptors are used, this `post_update_backup_plan_with_metadata` interceptor runs after the + `post_update_backup_plan` interceptor. The (possibly modified) response returned by + `post_update_backup_plan` will be passed to + `post_update_backup_plan_with_metadata`. + """ + return response, metadata + def pre_update_restore( self, request: gkebackup.UpdateRestoreRequest, @@ -854,12 +1392,35 @@ def post_update_restore( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_restore - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_restore_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BackupForGKE server but before - it is returned to user code. + it is returned to user code. This `post_update_restore` interceptor runs + before the `post_update_restore_with_metadata` interceptor. """ return response + def post_update_restore_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_restore + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BackupForGKE server but before it is returned to user code. + + We recommend only using this `post_update_restore_with_metadata` + interceptor in new development instead of the `post_update_restore` interceptor. + When both interceptors are used, this `post_update_restore_with_metadata` interceptor runs after the + `post_update_restore` interceptor. The (possibly modified) response returned by + `post_update_restore` will be passed to + `post_update_restore_with_metadata`. + """ + return response, metadata + def pre_update_restore_plan( self, request: gkebackup.UpdateRestorePlanRequest, @@ -879,12 +1440,35 @@ def post_update_restore_plan( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_restore_plan - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_restore_plan_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BackupForGKE server but before - it is returned to user code. + it is returned to user code. This `post_update_restore_plan` interceptor runs + before the `post_update_restore_plan_with_metadata` interceptor. """ return response + def post_update_restore_plan_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_restore_plan + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BackupForGKE server but before it is returned to user code. + + We recommend only using this `post_update_restore_plan_with_metadata` + interceptor in new development instead of the `post_update_restore_plan` interceptor. + When both interceptors are used, this `post_update_restore_plan_with_metadata` interceptor runs after the + `post_update_restore_plan` interceptor. The (possibly modified) response returned by + `post_update_restore_plan` will be passed to + `post_update_restore_plan_with_metadata`. + """ + return response, metadata + def pre_get_location( self, request: locations_pb2.GetLocationRequest, @@ -1374,6 +1958,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_backup(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_backup_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1523,6 +2111,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_backup_plan(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_backup_plan_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1670,6 +2262,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_restore(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_restore_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1820,6 +2416,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_restore_plan(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_restore_plan_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1963,6 +2563,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_backup(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_backup_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2106,6 +2710,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_backup_plan(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_backup_plan_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2247,6 +2855,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_restore(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_restore_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2391,6 +3003,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_restore_plan(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_restore_plan_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2542,6 +3158,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_backup(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_backup_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2691,6 +3311,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_backup_index_download_url(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_get_backup_index_download_url_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2835,6 +3462,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_backup_plan(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_backup_plan_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2983,6 +3614,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_restore(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_restore_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3129,6 +3764,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_restore_plan(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_restore_plan_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3276,6 +3915,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_volume_backup(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_volume_backup_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3420,6 +4063,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_volume_restore(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_volume_restore_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3562,6 +4209,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_backup_plans(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_backup_plans_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3708,6 +4359,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_backups(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_backups_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3852,6 +4507,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_restore_plans(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_restore_plans_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3996,6 +4655,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_restores(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_restores_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4141,6 +4804,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_volume_backups(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_volume_backups_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4288,6 +4955,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_volume_restores(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_volume_restores_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4441,6 +5112,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_backup(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_backup_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4590,6 +5265,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_backup_plan(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_backup_plan_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4737,6 +5416,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_restore(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_restore_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4887,6 +5570,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_restore_plan(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_restore_plan_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-gke-backup/samples/generated_samples/snippet_metadata_google.cloud.gkebackup.v1.json b/packages/google-cloud-gke-backup/samples/generated_samples/snippet_metadata_google.cloud.gkebackup.v1.json index 5bb20f5d0447..ae88d4785854 100644 --- a/packages/google-cloud-gke-backup/samples/generated_samples/snippet_metadata_google.cloud.gkebackup.v1.json +++ b/packages/google-cloud-gke-backup/samples/generated_samples/snippet_metadata_google.cloud.gkebackup.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-gke-backup", - "version": "0.5.14" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-gke-backup/tests/unit/gapic/gke_backup_v1/test_backup_for_gke.py b/packages/google-cloud-gke-backup/tests/unit/gapic/gke_backup_v1/test_backup_for_gke.py index 09b5c43fbd45..d8d7ffc73421 100644 --- a/packages/google-cloud-gke-backup/tests/unit/gapic/gke_backup_v1/test_backup_for_gke.py +++ b/packages/google-cloud-gke-backup/tests/unit/gapic/gke_backup_v1/test_backup_for_gke.py @@ -90,6 +90,13 @@ from google.cloud.gke_backup_v1.types import restore_plan as gcg_restore_plan from google.cloud.gke_backup_v1.types import volume +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -333,6 +340,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = BackupForGKEClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=["foo"]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + if show_cred_info: + assert error.details == ["foo", CRED_INFO_STRING] + else: + assert error.details == ["foo"] + + +@pytest.mark.parametrize("error_code", [401, 403, 404, 500]) +def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code): + cred = mock.Mock([]) + assert not hasattr(cred, "get_cred_info") + client = BackupForGKEClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -17803,10 +17853,13 @@ def test_create_backup_plan_rest_interceptors(null_interceptor): ), mock.patch.object( transports.BackupForGKERestInterceptor, "post_create_backup_plan" ) as post, mock.patch.object( + transports.BackupForGKERestInterceptor, "post_create_backup_plan_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.BackupForGKERestInterceptor, "pre_create_backup_plan" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = gkebackup.CreateBackupPlanRequest.pb( gkebackup.CreateBackupPlanRequest() ) @@ -17830,6 +17883,7 @@ def test_create_backup_plan_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_backup_plan( request, @@ -17841,6 +17895,7 @@ def test_create_backup_plan_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_backup_plans_rest_bad_request( @@ -17927,10 +17982,13 @@ def test_list_backup_plans_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BackupForGKERestInterceptor, "post_list_backup_plans" ) as post, mock.patch.object( + transports.BackupForGKERestInterceptor, "post_list_backup_plans_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.BackupForGKERestInterceptor, "pre_list_backup_plans" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = gkebackup.ListBackupPlansRequest.pb( gkebackup.ListBackupPlansRequest() ) @@ -17956,6 +18014,7 @@ def test_list_backup_plans_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gkebackup.ListBackupPlansResponse() + post_with_metadata.return_value = gkebackup.ListBackupPlansResponse(), metadata client.list_backup_plans( request, @@ -17967,6 +18026,7 @@ def test_list_backup_plans_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_backup_plan_rest_bad_request(request_type=gkebackup.GetBackupPlanRequest): @@ -18069,10 +18129,13 @@ def test_get_backup_plan_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BackupForGKERestInterceptor, "post_get_backup_plan" ) as post, mock.patch.object( + transports.BackupForGKERestInterceptor, "post_get_backup_plan_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.BackupForGKERestInterceptor, "pre_get_backup_plan" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = gkebackup.GetBackupPlanRequest.pb(gkebackup.GetBackupPlanRequest()) transcode.return_value = { "method": "post", @@ -18094,6 +18157,7 @@ def test_get_backup_plan_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = backup_plan.BackupPlan() + post_with_metadata.return_value = backup_plan.BackupPlan(), metadata client.get_backup_plan( request, @@ -18105,6 +18169,7 @@ def test_get_backup_plan_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_backup_plan_rest_bad_request( @@ -18324,10 +18389,13 @@ def test_update_backup_plan_rest_interceptors(null_interceptor): ), mock.patch.object( transports.BackupForGKERestInterceptor, "post_update_backup_plan" ) as post, mock.patch.object( + transports.BackupForGKERestInterceptor, "post_update_backup_plan_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.BackupForGKERestInterceptor, "pre_update_backup_plan" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = gkebackup.UpdateBackupPlanRequest.pb( gkebackup.UpdateBackupPlanRequest() ) @@ -18351,6 +18419,7 @@ def test_update_backup_plan_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.update_backup_plan( request, @@ -18362,6 +18431,7 @@ def test_update_backup_plan_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_backup_plan_rest_bad_request( @@ -18442,10 +18512,13 @@ def test_delete_backup_plan_rest_interceptors(null_interceptor): ), mock.patch.object( transports.BackupForGKERestInterceptor, "post_delete_backup_plan" ) as post, mock.patch.object( + transports.BackupForGKERestInterceptor, "post_delete_backup_plan_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.BackupForGKERestInterceptor, "pre_delete_backup_plan" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = gkebackup.DeleteBackupPlanRequest.pb( gkebackup.DeleteBackupPlanRequest() ) @@ -18469,6 +18542,7 @@ def test_delete_backup_plan_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_backup_plan( request, @@ -18480,6 +18554,7 @@ def test_delete_backup_plan_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_backup_rest_bad_request(request_type=gkebackup.CreateBackupRequest): @@ -18665,10 +18740,13 @@ def test_create_backup_rest_interceptors(null_interceptor): ), mock.patch.object( transports.BackupForGKERestInterceptor, "post_create_backup" ) as post, mock.patch.object( + transports.BackupForGKERestInterceptor, "post_create_backup_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.BackupForGKERestInterceptor, "pre_create_backup" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = gkebackup.CreateBackupRequest.pb(gkebackup.CreateBackupRequest()) transcode.return_value = { "method": "post", @@ -18690,6 +18768,7 @@ def test_create_backup_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_backup( request, @@ -18701,6 +18780,7 @@ def test_create_backup_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_backups_rest_bad_request(request_type=gkebackup.ListBackupsRequest): @@ -18783,10 +18863,13 @@ def test_list_backups_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BackupForGKERestInterceptor, "post_list_backups" ) as post, mock.patch.object( + transports.BackupForGKERestInterceptor, "post_list_backups_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.BackupForGKERestInterceptor, "pre_list_backups" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = gkebackup.ListBackupsRequest.pb(gkebackup.ListBackupsRequest()) transcode.return_value = { "method": "post", @@ -18810,6 +18893,7 @@ def test_list_backups_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gkebackup.ListBackupsResponse() + post_with_metadata.return_value = gkebackup.ListBackupsResponse(), metadata client.list_backups( request, @@ -18821,6 +18905,7 @@ def test_list_backups_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_backup_rest_bad_request(request_type=gkebackup.GetBackupRequest): @@ -18940,10 +19025,13 @@ def test_get_backup_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BackupForGKERestInterceptor, "post_get_backup" ) as post, mock.patch.object( + transports.BackupForGKERestInterceptor, "post_get_backup_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.BackupForGKERestInterceptor, "pre_get_backup" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = gkebackup.GetBackupRequest.pb(gkebackup.GetBackupRequest()) transcode.return_value = { "method": "post", @@ -18965,6 +19053,7 @@ def test_get_backup_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = backup.Backup() + post_with_metadata.return_value = backup.Backup(), metadata client.get_backup( request, @@ -18976,6 +19065,7 @@ def test_get_backup_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_backup_rest_bad_request(request_type=gkebackup.UpdateBackupRequest): @@ -19169,10 +19259,13 @@ def test_update_backup_rest_interceptors(null_interceptor): ), mock.patch.object( transports.BackupForGKERestInterceptor, "post_update_backup" ) as post, mock.patch.object( + transports.BackupForGKERestInterceptor, "post_update_backup_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.BackupForGKERestInterceptor, "pre_update_backup" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = gkebackup.UpdateBackupRequest.pb(gkebackup.UpdateBackupRequest()) transcode.return_value = { "method": "post", @@ -19194,6 +19287,7 @@ def test_update_backup_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.update_backup( request, @@ -19205,6 +19299,7 @@ def test_update_backup_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_backup_rest_bad_request(request_type=gkebackup.DeleteBackupRequest): @@ -19287,10 +19382,13 @@ def test_delete_backup_rest_interceptors(null_interceptor): ), mock.patch.object( transports.BackupForGKERestInterceptor, "post_delete_backup" ) as post, mock.patch.object( + transports.BackupForGKERestInterceptor, "post_delete_backup_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.BackupForGKERestInterceptor, "pre_delete_backup" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = gkebackup.DeleteBackupRequest.pb(gkebackup.DeleteBackupRequest()) transcode.return_value = { "method": "post", @@ -19312,6 +19410,7 @@ def test_delete_backup_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_backup( request, @@ -19323,6 +19422,7 @@ def test_delete_backup_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_volume_backups_rest_bad_request( @@ -19411,10 +19511,13 @@ def test_list_volume_backups_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BackupForGKERestInterceptor, "post_list_volume_backups" ) as post, mock.patch.object( + transports.BackupForGKERestInterceptor, "post_list_volume_backups_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.BackupForGKERestInterceptor, "pre_list_volume_backups" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = gkebackup.ListVolumeBackupsRequest.pb( gkebackup.ListVolumeBackupsRequest() ) @@ -19440,6 +19543,10 @@ def test_list_volume_backups_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gkebackup.ListVolumeBackupsResponse() + post_with_metadata.return_value = ( + gkebackup.ListVolumeBackupsResponse(), + metadata, + ) client.list_volume_backups( request, @@ -19451,6 +19558,7 @@ def test_list_volume_backups_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_volume_backup_rest_bad_request( @@ -19557,10 +19665,13 @@ def test_get_volume_backup_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BackupForGKERestInterceptor, "post_get_volume_backup" ) as post, mock.patch.object( + transports.BackupForGKERestInterceptor, "post_get_volume_backup_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.BackupForGKERestInterceptor, "pre_get_volume_backup" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = gkebackup.GetVolumeBackupRequest.pb( gkebackup.GetVolumeBackupRequest() ) @@ -19584,6 +19695,7 @@ def test_get_volume_backup_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = volume.VolumeBackup() + post_with_metadata.return_value = volume.VolumeBackup(), metadata client.get_volume_backup( request, @@ -19595,6 +19707,7 @@ def test_get_volume_backup_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_restore_plan_rest_bad_request( @@ -19816,10 +19929,13 @@ def test_create_restore_plan_rest_interceptors(null_interceptor): ), mock.patch.object( transports.BackupForGKERestInterceptor, "post_create_restore_plan" ) as post, mock.patch.object( + transports.BackupForGKERestInterceptor, "post_create_restore_plan_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.BackupForGKERestInterceptor, "pre_create_restore_plan" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = gkebackup.CreateRestorePlanRequest.pb( gkebackup.CreateRestorePlanRequest() ) @@ -19843,6 +19959,7 @@ def test_create_restore_plan_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_restore_plan( request, @@ -19854,6 +19971,7 @@ def test_create_restore_plan_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_restore_plans_rest_bad_request( @@ -19940,10 +20058,13 @@ def test_list_restore_plans_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BackupForGKERestInterceptor, "post_list_restore_plans" ) as post, mock.patch.object( + transports.BackupForGKERestInterceptor, "post_list_restore_plans_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.BackupForGKERestInterceptor, "pre_list_restore_plans" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = gkebackup.ListRestorePlansRequest.pb( gkebackup.ListRestorePlansRequest() ) @@ -19969,6 +20090,7 @@ def test_list_restore_plans_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gkebackup.ListRestorePlansResponse() + post_with_metadata.return_value = gkebackup.ListRestorePlansResponse(), metadata client.list_restore_plans( request, @@ -19980,6 +20102,7 @@ def test_list_restore_plans_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_restore_plan_rest_bad_request( @@ -20078,10 +20201,13 @@ def test_get_restore_plan_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BackupForGKERestInterceptor, "post_get_restore_plan" ) as post, mock.patch.object( + transports.BackupForGKERestInterceptor, "post_get_restore_plan_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.BackupForGKERestInterceptor, "pre_get_restore_plan" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = gkebackup.GetRestorePlanRequest.pb( gkebackup.GetRestorePlanRequest() ) @@ -20105,6 +20231,7 @@ def test_get_restore_plan_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = restore_plan.RestorePlan() + post_with_metadata.return_value = restore_plan.RestorePlan(), metadata client.get_restore_plan( request, @@ -20116,6 +20243,7 @@ def test_get_restore_plan_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_restore_plan_rest_bad_request( @@ -20345,10 +20473,13 @@ def test_update_restore_plan_rest_interceptors(null_interceptor): ), mock.patch.object( transports.BackupForGKERestInterceptor, "post_update_restore_plan" ) as post, mock.patch.object( + transports.BackupForGKERestInterceptor, "post_update_restore_plan_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.BackupForGKERestInterceptor, "pre_update_restore_plan" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = gkebackup.UpdateRestorePlanRequest.pb( gkebackup.UpdateRestorePlanRequest() ) @@ -20372,6 +20503,7 @@ def test_update_restore_plan_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.update_restore_plan( request, @@ -20383,6 +20515,7 @@ def test_update_restore_plan_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_restore_plan_rest_bad_request( @@ -20463,10 +20596,13 @@ def test_delete_restore_plan_rest_interceptors(null_interceptor): ), mock.patch.object( transports.BackupForGKERestInterceptor, "post_delete_restore_plan" ) as post, mock.patch.object( + transports.BackupForGKERestInterceptor, "post_delete_restore_plan_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.BackupForGKERestInterceptor, "pre_delete_restore_plan" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = gkebackup.DeleteRestorePlanRequest.pb( gkebackup.DeleteRestorePlanRequest() ) @@ -20490,6 +20626,7 @@ def test_delete_restore_plan_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_restore_plan( request, @@ -20501,6 +20638,7 @@ def test_delete_restore_plan_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_restore_rest_bad_request(request_type=gkebackup.CreateRestoreRequest): @@ -20737,10 +20875,13 @@ def test_create_restore_rest_interceptors(null_interceptor): ), mock.patch.object( transports.BackupForGKERestInterceptor, "post_create_restore" ) as post, mock.patch.object( + transports.BackupForGKERestInterceptor, "post_create_restore_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.BackupForGKERestInterceptor, "pre_create_restore" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = gkebackup.CreateRestoreRequest.pb(gkebackup.CreateRestoreRequest()) transcode.return_value = { "method": "post", @@ -20762,6 +20903,7 @@ def test_create_restore_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_restore( request, @@ -20773,6 +20915,7 @@ def test_create_restore_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_restores_rest_bad_request(request_type=gkebackup.ListRestoresRequest): @@ -20857,10 +21000,13 @@ def test_list_restores_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BackupForGKERestInterceptor, "post_list_restores" ) as post, mock.patch.object( + transports.BackupForGKERestInterceptor, "post_list_restores_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.BackupForGKERestInterceptor, "pre_list_restores" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = gkebackup.ListRestoresRequest.pb(gkebackup.ListRestoresRequest()) transcode.return_value = { "method": "post", @@ -20884,6 +21030,7 @@ def test_list_restores_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gkebackup.ListRestoresResponse() + post_with_metadata.return_value = gkebackup.ListRestoresResponse(), metadata client.list_restores( request, @@ -20895,6 +21042,7 @@ def test_list_restores_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_restore_rest_bad_request(request_type=gkebackup.GetRestoreRequest): @@ -21003,10 +21151,13 @@ def test_get_restore_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BackupForGKERestInterceptor, "post_get_restore" ) as post, mock.patch.object( + transports.BackupForGKERestInterceptor, "post_get_restore_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.BackupForGKERestInterceptor, "pre_get_restore" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = gkebackup.GetRestoreRequest.pb(gkebackup.GetRestoreRequest()) transcode.return_value = { "method": "post", @@ -21028,6 +21179,7 @@ def test_get_restore_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = restore.Restore() + post_with_metadata.return_value = restore.Restore(), metadata client.get_restore( request, @@ -21039,6 +21191,7 @@ def test_get_restore_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_restore_rest_bad_request(request_type=gkebackup.UpdateRestoreRequest): @@ -21283,10 +21436,13 @@ def test_update_restore_rest_interceptors(null_interceptor): ), mock.patch.object( transports.BackupForGKERestInterceptor, "post_update_restore" ) as post, mock.patch.object( + transports.BackupForGKERestInterceptor, "post_update_restore_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.BackupForGKERestInterceptor, "pre_update_restore" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = gkebackup.UpdateRestoreRequest.pb(gkebackup.UpdateRestoreRequest()) transcode.return_value = { "method": "post", @@ -21308,6 +21464,7 @@ def test_update_restore_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.update_restore( request, @@ -21319,6 +21476,7 @@ def test_update_restore_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_restore_rest_bad_request(request_type=gkebackup.DeleteRestoreRequest): @@ -21401,10 +21559,13 @@ def test_delete_restore_rest_interceptors(null_interceptor): ), mock.patch.object( transports.BackupForGKERestInterceptor, "post_delete_restore" ) as post, mock.patch.object( + transports.BackupForGKERestInterceptor, "post_delete_restore_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.BackupForGKERestInterceptor, "pre_delete_restore" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = gkebackup.DeleteRestoreRequest.pb(gkebackup.DeleteRestoreRequest()) transcode.return_value = { "method": "post", @@ -21426,6 +21587,7 @@ def test_delete_restore_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_restore( request, @@ -21437,6 +21599,7 @@ def test_delete_restore_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_volume_restores_rest_bad_request( @@ -21525,10 +21688,14 @@ def test_list_volume_restores_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BackupForGKERestInterceptor, "post_list_volume_restores" ) as post, mock.patch.object( + transports.BackupForGKERestInterceptor, + "post_list_volume_restores_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.BackupForGKERestInterceptor, "pre_list_volume_restores" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = gkebackup.ListVolumeRestoresRequest.pb( gkebackup.ListVolumeRestoresRequest() ) @@ -21554,6 +21721,10 @@ def test_list_volume_restores_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gkebackup.ListVolumeRestoresResponse() + post_with_metadata.return_value = ( + gkebackup.ListVolumeRestoresResponse(), + metadata, + ) client.list_volume_restores( request, @@ -21565,6 +21736,7 @@ def test_list_volume_restores_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_volume_restore_rest_bad_request( @@ -21667,10 +21839,13 @@ def test_get_volume_restore_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BackupForGKERestInterceptor, "post_get_volume_restore" ) as post, mock.patch.object( + transports.BackupForGKERestInterceptor, "post_get_volume_restore_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.BackupForGKERestInterceptor, "pre_get_volume_restore" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = gkebackup.GetVolumeRestoreRequest.pb( gkebackup.GetVolumeRestoreRequest() ) @@ -21694,6 +21869,7 @@ def test_get_volume_restore_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = volume.VolumeRestore() + post_with_metadata.return_value = volume.VolumeRestore(), metadata client.get_volume_restore( request, @@ -21705,6 +21881,7 @@ def test_get_volume_restore_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_backup_index_download_url_rest_bad_request( @@ -21793,10 +21970,14 @@ def test_get_backup_index_download_url_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BackupForGKERestInterceptor, "post_get_backup_index_download_url" ) as post, mock.patch.object( + transports.BackupForGKERestInterceptor, + "post_get_backup_index_download_url_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.BackupForGKERestInterceptor, "pre_get_backup_index_download_url" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = gkebackup.GetBackupIndexDownloadUrlRequest.pb( gkebackup.GetBackupIndexDownloadUrlRequest() ) @@ -21822,6 +22003,10 @@ def test_get_backup_index_download_url_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gkebackup.GetBackupIndexDownloadUrlResponse() + post_with_metadata.return_value = ( + gkebackup.GetBackupIndexDownloadUrlResponse(), + metadata, + ) client.get_backup_index_download_url( request, @@ -21833,6 +22018,7 @@ def test_get_backup_index_download_url_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_location_rest_bad_request(request_type=locations_pb2.GetLocationRequest): diff --git a/packages/google-cloud-gke-connect-gateway/google/cloud/gkeconnect/gateway/gapic_version.py b/packages/google-cloud-gke-connect-gateway/google/cloud/gkeconnect/gateway/gapic_version.py index 1ccbb45b89d1..558c8aab67c5 100644 --- a/packages/google-cloud-gke-connect-gateway/google/cloud/gkeconnect/gateway/gapic_version.py +++ b/packages/google-cloud-gke-connect-gateway/google/cloud/gkeconnect/gateway/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.10.1" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-gke-connect-gateway/google/cloud/gkeconnect/gateway_v1/gapic_version.py b/packages/google-cloud-gke-connect-gateway/google/cloud/gkeconnect/gateway_v1/gapic_version.py index 1ccbb45b89d1..558c8aab67c5 100644 --- a/packages/google-cloud-gke-connect-gateway/google/cloud/gkeconnect/gateway_v1/gapic_version.py +++ b/packages/google-cloud-gke-connect-gateway/google/cloud/gkeconnect/gateway_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.10.1" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-gke-connect-gateway/google/cloud/gkeconnect/gateway_v1/services/gateway_control/client.py b/packages/google-cloud-gke-connect-gateway/google/cloud/gkeconnect/gateway_v1/services/gateway_control/client.py index bf73e65baf23..d779aa2ccb3b 100644 --- a/packages/google-cloud-gke-connect-gateway/google/cloud/gkeconnect/gateway_v1/services/gateway_control/client.py +++ b/packages/google-cloud-gke-connect-gateway/google/cloud/gkeconnect/gateway_v1/services/gateway_control/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -457,6 +459,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. diff --git a/packages/google-cloud-gke-connect-gateway/google/cloud/gkeconnect/gateway_v1/services/gateway_control/transports/rest.py b/packages/google-cloud-gke-connect-gateway/google/cloud/gkeconnect/gateway_v1/services/gateway_control/transports/rest.py index 1650f0577c2e..a5ea07c43dbe 100644 --- a/packages/google-cloud-gke-connect-gateway/google/cloud/gkeconnect/gateway_v1/services/gateway_control/transports/rest.py +++ b/packages/google-cloud-gke-connect-gateway/google/cloud/gkeconnect/gateway_v1/services/gateway_control/transports/rest.py @@ -101,12 +101,37 @@ def post_generate_credentials( ) -> control.GenerateCredentialsResponse: """Post-rpc interceptor for generate_credentials - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_generate_credentials_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GatewayControl server but before - it is returned to user code. + it is returned to user code. This `post_generate_credentials` interceptor runs + before the `post_generate_credentials_with_metadata` interceptor. """ return response + def post_generate_credentials_with_metadata( + self, + response: control.GenerateCredentialsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + control.GenerateCredentialsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for generate_credentials + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GatewayControl server but before it is returned to user code. + + We recommend only using this `post_generate_credentials_with_metadata` + interceptor in new development instead of the `post_generate_credentials` interceptor. + When both interceptors are used, this `post_generate_credentials_with_metadata` interceptor runs after the + `post_generate_credentials` interceptor. The (possibly modified) response returned by + `post_generate_credentials` will be passed to + `post_generate_credentials_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class GatewayControlRestStub: @@ -317,6 +342,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_generate_credentials(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_generate_credentials_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-gke-connect-gateway/google/cloud/gkeconnect/gateway_v1beta1/gapic_version.py b/packages/google-cloud-gke-connect-gateway/google/cloud/gkeconnect/gateway_v1beta1/gapic_version.py index 1ccbb45b89d1..558c8aab67c5 100644 --- a/packages/google-cloud-gke-connect-gateway/google/cloud/gkeconnect/gateway_v1beta1/gapic_version.py +++ b/packages/google-cloud-gke-connect-gateway/google/cloud/gkeconnect/gateway_v1beta1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.10.1" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-gke-connect-gateway/google/cloud/gkeconnect/gateway_v1beta1/services/gateway_control/client.py b/packages/google-cloud-gke-connect-gateway/google/cloud/gkeconnect/gateway_v1beta1/services/gateway_control/client.py index 3b304055fc84..c1e114934db0 100644 --- a/packages/google-cloud-gke-connect-gateway/google/cloud/gkeconnect/gateway_v1beta1/services/gateway_control/client.py +++ b/packages/google-cloud-gke-connect-gateway/google/cloud/gkeconnect/gateway_v1beta1/services/gateway_control/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -457,6 +459,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. diff --git a/packages/google-cloud-gke-connect-gateway/google/cloud/gkeconnect/gateway_v1beta1/services/gateway_control/transports/rest.py b/packages/google-cloud-gke-connect-gateway/google/cloud/gkeconnect/gateway_v1beta1/services/gateway_control/transports/rest.py index ca453da213a7..3537fb393450 100644 --- a/packages/google-cloud-gke-connect-gateway/google/cloud/gkeconnect/gateway_v1beta1/services/gateway_control/transports/rest.py +++ b/packages/google-cloud-gke-connect-gateway/google/cloud/gkeconnect/gateway_v1beta1/services/gateway_control/transports/rest.py @@ -101,12 +101,37 @@ def post_generate_credentials( ) -> control.GenerateCredentialsResponse: """Post-rpc interceptor for generate_credentials - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_generate_credentials_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GatewayControl server but before - it is returned to user code. + it is returned to user code. This `post_generate_credentials` interceptor runs + before the `post_generate_credentials_with_metadata` interceptor. """ return response + def post_generate_credentials_with_metadata( + self, + response: control.GenerateCredentialsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + control.GenerateCredentialsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for generate_credentials + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GatewayControl server but before it is returned to user code. + + We recommend only using this `post_generate_credentials_with_metadata` + interceptor in new development instead of the `post_generate_credentials` interceptor. + When both interceptors are used, this `post_generate_credentials_with_metadata` interceptor runs after the + `post_generate_credentials` interceptor. The (possibly modified) response returned by + `post_generate_credentials` will be passed to + `post_generate_credentials_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class GatewayControlRestStub: @@ -321,6 +346,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_generate_credentials(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_generate_credentials_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-gke-connect-gateway/samples/generated_samples/snippet_metadata_google.cloud.gkeconnect.gateway.v1.json b/packages/google-cloud-gke-connect-gateway/samples/generated_samples/snippet_metadata_google.cloud.gkeconnect.gateway.v1.json index 426a7ec4de6a..0b79030029d0 100644 --- a/packages/google-cloud-gke-connect-gateway/samples/generated_samples/snippet_metadata_google.cloud.gkeconnect.gateway.v1.json +++ b/packages/google-cloud-gke-connect-gateway/samples/generated_samples/snippet_metadata_google.cloud.gkeconnect.gateway.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-gke-connect-gateway", - "version": "0.10.1" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-gke-connect-gateway/samples/generated_samples/snippet_metadata_google.cloud.gkeconnect.gateway.v1beta1.json b/packages/google-cloud-gke-connect-gateway/samples/generated_samples/snippet_metadata_google.cloud.gkeconnect.gateway.v1beta1.json index 66be1a6d4cef..c7165d3a30b5 100644 --- a/packages/google-cloud-gke-connect-gateway/samples/generated_samples/snippet_metadata_google.cloud.gkeconnect.gateway.v1beta1.json +++ b/packages/google-cloud-gke-connect-gateway/samples/generated_samples/snippet_metadata_google.cloud.gkeconnect.gateway.v1beta1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-gke-connect-gateway", - "version": "0.10.1" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-gke-connect-gateway/tests/unit/gapic/gateway_v1/test_gateway_control.py b/packages/google-cloud-gke-connect-gateway/tests/unit/gapic/gateway_v1/test_gateway_control.py index e671b17a415f..86b997e7227c 100644 --- a/packages/google-cloud-gke-connect-gateway/tests/unit/gapic/gateway_v1/test_gateway_control.py +++ b/packages/google-cloud-gke-connect-gateway/tests/unit/gapic/gateway_v1/test_gateway_control.py @@ -58,6 +58,13 @@ ) from google.cloud.gkeconnect.gateway_v1.types import control +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -311,6 +318,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = GatewayControlClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=["foo"]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + if show_cred_info: + assert error.details == ["foo", CRED_INFO_STRING] + else: + assert error.details == ["foo"] + + +@pytest.mark.parametrize("error_code", [401, 403, 404, 500]) +def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code): + cred = mock.Mock([]) + assert not hasattr(cred, "get_cred_info") + client = GatewayControlClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -1203,10 +1253,14 @@ def test_generate_credentials_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GatewayControlRestInterceptor, "post_generate_credentials" ) as post, mock.patch.object( + transports.GatewayControlRestInterceptor, + "post_generate_credentials_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GatewayControlRestInterceptor, "pre_generate_credentials" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = control.GenerateCredentialsRequest.pb( control.GenerateCredentialsRequest() ) @@ -1232,6 +1286,10 @@ def test_generate_credentials_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = control.GenerateCredentialsResponse() + post_with_metadata.return_value = ( + control.GenerateCredentialsResponse(), + metadata, + ) client.generate_credentials( request, @@ -1243,6 +1301,7 @@ def test_generate_credentials_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_initialize_client_w_rest(): diff --git a/packages/google-cloud-gke-connect-gateway/tests/unit/gapic/gateway_v1beta1/test_gateway_control.py b/packages/google-cloud-gke-connect-gateway/tests/unit/gapic/gateway_v1beta1/test_gateway_control.py index 9f83dd709980..88b9101c95fd 100644 --- a/packages/google-cloud-gke-connect-gateway/tests/unit/gapic/gateway_v1beta1/test_gateway_control.py +++ b/packages/google-cloud-gke-connect-gateway/tests/unit/gapic/gateway_v1beta1/test_gateway_control.py @@ -58,6 +58,13 @@ ) from google.cloud.gkeconnect.gateway_v1beta1.types import control +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -311,6 +318,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = GatewayControlClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=["foo"]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + if show_cred_info: + assert error.details == ["foo", CRED_INFO_STRING] + else: + assert error.details == ["foo"] + + +@pytest.mark.parametrize("error_code", [401, 403, 404, 500]) +def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code): + cred = mock.Mock([]) + assert not hasattr(cred, "get_cred_info") + client = GatewayControlClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -1203,10 +1253,14 @@ def test_generate_credentials_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GatewayControlRestInterceptor, "post_generate_credentials" ) as post, mock.patch.object( + transports.GatewayControlRestInterceptor, + "post_generate_credentials_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GatewayControlRestInterceptor, "pre_generate_credentials" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = control.GenerateCredentialsRequest.pb( control.GenerateCredentialsRequest() ) @@ -1232,6 +1286,10 @@ def test_generate_credentials_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = control.GenerateCredentialsResponse() + post_with_metadata.return_value = ( + control.GenerateCredentialsResponse(), + metadata, + ) client.generate_credentials( request, @@ -1243,6 +1301,7 @@ def test_generate_credentials_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_initialize_client_w_rest(): diff --git a/packages/google-cloud-gke-hub/google/cloud/gkehub/gapic_version.py b/packages/google-cloud-gke-hub/google/cloud/gkehub/gapic_version.py index 3e0ea3b28f0a..558c8aab67c5 100644 --- a/packages/google-cloud-gke-hub/google/cloud/gkehub/gapic_version.py +++ b/packages/google-cloud-gke-hub/google/cloud/gkehub/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.16.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/configmanagement_v1/gapic_version.py b/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/configmanagement_v1/gapic_version.py index 3e0ea3b28f0a..558c8aab67c5 100644 --- a/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/configmanagement_v1/gapic_version.py +++ b/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/configmanagement_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.16.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/gapic_version.py b/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/gapic_version.py index 3e0ea3b28f0a..558c8aab67c5 100644 --- a/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/gapic_version.py +++ b/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.16.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/multiclusteringress_v1/gapic_version.py b/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/multiclusteringress_v1/gapic_version.py index 3e0ea3b28f0a..558c8aab67c5 100644 --- a/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/multiclusteringress_v1/gapic_version.py +++ b/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/multiclusteringress_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.16.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/services/gke_hub/client.py b/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/services/gke_hub/client.py index 0ac2de2daecf..29fa98fd5bc9 100644 --- a/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/services/gke_hub/client.py +++ b/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/services/gke_hub/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -529,6 +531,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. diff --git a/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/services/gke_hub/transports/rest.py b/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/services/gke_hub/transports/rest.py index 93bf74b1275f..1cd5d673f042 100644 --- a/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/services/gke_hub/transports/rest.py +++ b/packages/google-cloud-gke-hub/google/cloud/gkehub_v1/services/gke_hub/transports/rest.py @@ -180,12 +180,35 @@ def post_create_feature( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_feature - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_feature_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GkeHub server but before - it is returned to user code. + it is returned to user code. This `post_create_feature` interceptor runs + before the `post_create_feature_with_metadata` interceptor. """ return response + def post_create_feature_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_feature + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GkeHub server but before it is returned to user code. + + We recommend only using this `post_create_feature_with_metadata` + interceptor in new development instead of the `post_create_feature` interceptor. + When both interceptors are used, this `post_create_feature_with_metadata` interceptor runs after the + `post_create_feature` interceptor. The (possibly modified) response returned by + `post_create_feature` will be passed to + `post_create_feature_with_metadata`. + """ + return response, metadata + def pre_create_membership( self, request: service.CreateMembershipRequest, @@ -205,12 +228,35 @@ def post_create_membership( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_membership - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_membership_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GkeHub server but before - it is returned to user code. + it is returned to user code. This `post_create_membership` interceptor runs + before the `post_create_membership_with_metadata` interceptor. """ return response + def post_create_membership_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_membership + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GkeHub server but before it is returned to user code. + + We recommend only using this `post_create_membership_with_metadata` + interceptor in new development instead of the `post_create_membership` interceptor. + When both interceptors are used, this `post_create_membership_with_metadata` interceptor runs after the + `post_create_membership` interceptor. The (possibly modified) response returned by + `post_create_membership` will be passed to + `post_create_membership_with_metadata`. + """ + return response, metadata + def pre_delete_feature( self, request: service.DeleteFeatureRequest, @@ -228,12 +274,35 @@ def post_delete_feature( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_feature - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_feature_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GkeHub server but before - it is returned to user code. + it is returned to user code. This `post_delete_feature` interceptor runs + before the `post_delete_feature_with_metadata` interceptor. """ return response + def post_delete_feature_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_feature + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GkeHub server but before it is returned to user code. + + We recommend only using this `post_delete_feature_with_metadata` + interceptor in new development instead of the `post_delete_feature` interceptor. + When both interceptors are used, this `post_delete_feature_with_metadata` interceptor runs after the + `post_delete_feature` interceptor. The (possibly modified) response returned by + `post_delete_feature` will be passed to + `post_delete_feature_with_metadata`. + """ + return response, metadata + def pre_delete_membership( self, request: service.DeleteMembershipRequest, @@ -253,12 +322,35 @@ def post_delete_membership( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_membership - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_membership_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GkeHub server but before - it is returned to user code. + it is returned to user code. This `post_delete_membership` interceptor runs + before the `post_delete_membership_with_metadata` interceptor. """ return response + def post_delete_membership_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_membership + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GkeHub server but before it is returned to user code. + + We recommend only using this `post_delete_membership_with_metadata` + interceptor in new development instead of the `post_delete_membership` interceptor. + When both interceptors are used, this `post_delete_membership_with_metadata` interceptor runs after the + `post_delete_membership` interceptor. The (possibly modified) response returned by + `post_delete_membership` will be passed to + `post_delete_membership_with_metadata`. + """ + return response, metadata + def pre_generate_connect_manifest( self, request: service.GenerateConnectManifestRequest, @@ -278,12 +370,37 @@ def post_generate_connect_manifest( ) -> service.GenerateConnectManifestResponse: """Post-rpc interceptor for generate_connect_manifest - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_generate_connect_manifest_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GkeHub server but before - it is returned to user code. + it is returned to user code. This `post_generate_connect_manifest` interceptor runs + before the `post_generate_connect_manifest_with_metadata` interceptor. """ return response + def post_generate_connect_manifest_with_metadata( + self, + response: service.GenerateConnectManifestResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service.GenerateConnectManifestResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for generate_connect_manifest + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GkeHub server but before it is returned to user code. + + We recommend only using this `post_generate_connect_manifest_with_metadata` + interceptor in new development instead of the `post_generate_connect_manifest` interceptor. + When both interceptors are used, this `post_generate_connect_manifest_with_metadata` interceptor runs after the + `post_generate_connect_manifest` interceptor. The (possibly modified) response returned by + `post_generate_connect_manifest` will be passed to + `post_generate_connect_manifest_with_metadata`. + """ + return response, metadata + def pre_get_feature( self, request: service.GetFeatureRequest, @@ -299,12 +416,35 @@ def pre_get_feature( def post_get_feature(self, response: feature.Feature) -> feature.Feature: """Post-rpc interceptor for get_feature - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_feature_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GkeHub server but before - it is returned to user code. + it is returned to user code. This `post_get_feature` interceptor runs + before the `post_get_feature_with_metadata` interceptor. """ return response + def post_get_feature_with_metadata( + self, + response: feature.Feature, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[feature.Feature, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_feature + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GkeHub server but before it is returned to user code. + + We recommend only using this `post_get_feature_with_metadata` + interceptor in new development instead of the `post_get_feature` interceptor. + When both interceptors are used, this `post_get_feature_with_metadata` interceptor runs after the + `post_get_feature` interceptor. The (possibly modified) response returned by + `post_get_feature` will be passed to + `post_get_feature_with_metadata`. + """ + return response, metadata + def pre_get_membership( self, request: service.GetMembershipRequest, @@ -322,12 +462,35 @@ def post_get_membership( ) -> membership.Membership: """Post-rpc interceptor for get_membership - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_membership_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GkeHub server but before - it is returned to user code. + it is returned to user code. This `post_get_membership` interceptor runs + before the `post_get_membership_with_metadata` interceptor. """ return response + def post_get_membership_with_metadata( + self, + response: membership.Membership, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[membership.Membership, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_membership + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GkeHub server but before it is returned to user code. + + We recommend only using this `post_get_membership_with_metadata` + interceptor in new development instead of the `post_get_membership` interceptor. + When both interceptors are used, this `post_get_membership_with_metadata` interceptor runs after the + `post_get_membership` interceptor. The (possibly modified) response returned by + `post_get_membership` will be passed to + `post_get_membership_with_metadata`. + """ + return response, metadata + def pre_list_features( self, request: service.ListFeaturesRequest, @@ -345,12 +508,35 @@ def post_list_features( ) -> service.ListFeaturesResponse: """Post-rpc interceptor for list_features - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_features_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GkeHub server but before - it is returned to user code. + it is returned to user code. This `post_list_features` interceptor runs + before the `post_list_features_with_metadata` interceptor. """ return response + def post_list_features_with_metadata( + self, + response: service.ListFeaturesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.ListFeaturesResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_features + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GkeHub server but before it is returned to user code. + + We recommend only using this `post_list_features_with_metadata` + interceptor in new development instead of the `post_list_features` interceptor. + When both interceptors are used, this `post_list_features_with_metadata` interceptor runs after the + `post_list_features` interceptor. The (possibly modified) response returned by + `post_list_features` will be passed to + `post_list_features_with_metadata`. + """ + return response, metadata + def pre_list_memberships( self, request: service.ListMembershipsRequest, @@ -368,12 +554,37 @@ def post_list_memberships( ) -> service.ListMembershipsResponse: """Post-rpc interceptor for list_memberships - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_memberships_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GkeHub server but before - it is returned to user code. + it is returned to user code. This `post_list_memberships` interceptor runs + before the `post_list_memberships_with_metadata` interceptor. """ return response + def post_list_memberships_with_metadata( + self, + response: service.ListMembershipsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service.ListMembershipsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_memberships + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GkeHub server but before it is returned to user code. + + We recommend only using this `post_list_memberships_with_metadata` + interceptor in new development instead of the `post_list_memberships` interceptor. + When both interceptors are used, this `post_list_memberships_with_metadata` interceptor runs after the + `post_list_memberships` interceptor. The (possibly modified) response returned by + `post_list_memberships` will be passed to + `post_list_memberships_with_metadata`. + """ + return response, metadata + def pre_update_feature( self, request: service.UpdateFeatureRequest, @@ -391,12 +602,35 @@ def post_update_feature( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_feature - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_feature_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GkeHub server but before - it is returned to user code. + it is returned to user code. This `post_update_feature` interceptor runs + before the `post_update_feature_with_metadata` interceptor. """ return response + def post_update_feature_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_feature + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GkeHub server but before it is returned to user code. + + We recommend only using this `post_update_feature_with_metadata` + interceptor in new development instead of the `post_update_feature` interceptor. + When both interceptors are used, this `post_update_feature_with_metadata` interceptor runs after the + `post_update_feature` interceptor. The (possibly modified) response returned by + `post_update_feature` will be passed to + `post_update_feature_with_metadata`. + """ + return response, metadata + def pre_update_membership( self, request: service.UpdateMembershipRequest, @@ -416,12 +650,35 @@ def post_update_membership( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_membership - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_membership_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GkeHub server but before - it is returned to user code. + it is returned to user code. This `post_update_membership` interceptor runs + before the `post_update_membership_with_metadata` interceptor. """ return response + def post_update_membership_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_membership + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GkeHub server but before it is returned to user code. + + We recommend only using this `post_update_membership_with_metadata` + interceptor in new development instead of the `post_update_membership` interceptor. + When both interceptors are used, this `post_update_membership_with_metadata` interceptor runs after the + `post_update_membership` interceptor. The (possibly modified) response returned by + `post_update_membership` will be passed to + `post_update_membership_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class GkeHubRestStub: @@ -705,6 +962,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_feature(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_feature_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -861,6 +1122,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_membership(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_membership_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1004,6 +1269,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_feature(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_feature_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1151,6 +1420,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_membership(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_membership_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1297,6 +1570,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_generate_connect_manifest(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_generate_connect_manifest_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1441,6 +1718,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_feature(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_feature_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1585,6 +1866,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_membership(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_membership_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1727,6 +2012,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_features(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_features_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1875,6 +2164,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_memberships(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_memberships_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2024,6 +2317,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_feature(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_feature_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2179,6 +2476,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_membership(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_membership_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-gke-hub/google/cloud/gkehub_v1beta1/gapic_version.py b/packages/google-cloud-gke-hub/google/cloud/gkehub_v1beta1/gapic_version.py index 3e0ea3b28f0a..558c8aab67c5 100644 --- a/packages/google-cloud-gke-hub/google/cloud/gkehub_v1beta1/gapic_version.py +++ b/packages/google-cloud-gke-hub/google/cloud/gkehub_v1beta1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.16.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-gke-hub/google/cloud/gkehub_v1beta1/services/gke_hub_membership_service/client.py b/packages/google-cloud-gke-hub/google/cloud/gkehub_v1beta1/services/gke_hub_membership_service/client.py index 5571143ca50c..8c6b649482fe 100644 --- a/packages/google-cloud-gke-hub/google/cloud/gkehub_v1beta1/services/gke_hub_membership_service/client.py +++ b/packages/google-cloud-gke-hub/google/cloud/gkehub_v1beta1/services/gke_hub_membership_service/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -509,6 +511,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. @@ -1714,16 +1743,20 @@ def list_operations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def get_operation( self, @@ -1769,16 +1802,20 @@ def get_operation( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def delete_operation( self, @@ -2001,16 +2038,20 @@ def set_iam_policy( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def get_iam_policy( self, @@ -2123,16 +2164,20 @@ def get_iam_policy( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def test_iam_permissions( self, @@ -2183,16 +2228,20 @@ def test_iam_permissions( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def get_location( self, @@ -2238,16 +2287,20 @@ def get_location( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def list_locations( self, @@ -2293,16 +2346,20 @@ def list_locations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-gke-hub/google/cloud/gkehub_v1beta1/services/gke_hub_membership_service/transports/rest.py b/packages/google-cloud-gke-hub/google/cloud/gkehub_v1beta1/services/gke_hub_membership_service/transports/rest.py index 70bf55c4c422..39cb5149260e 100644 --- a/packages/google-cloud-gke-hub/google/cloud/gkehub_v1beta1/services/gke_hub_membership_service/transports/rest.py +++ b/packages/google-cloud-gke-hub/google/cloud/gkehub_v1beta1/services/gke_hub_membership_service/transports/rest.py @@ -161,12 +161,35 @@ def post_create_membership( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_membership - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_membership_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GkeHubMembershipService server but before - it is returned to user code. + it is returned to user code. This `post_create_membership` interceptor runs + before the `post_create_membership_with_metadata` interceptor. """ return response + def post_create_membership_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_membership + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GkeHubMembershipService server but before it is returned to user code. + + We recommend only using this `post_create_membership_with_metadata` + interceptor in new development instead of the `post_create_membership` interceptor. + When both interceptors are used, this `post_create_membership_with_metadata` interceptor runs after the + `post_create_membership` interceptor. The (possibly modified) response returned by + `post_create_membership` will be passed to + `post_create_membership_with_metadata`. + """ + return response, metadata + def pre_delete_membership( self, request: membership.DeleteMembershipRequest, @@ -186,12 +209,35 @@ def post_delete_membership( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_membership - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_membership_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GkeHubMembershipService server but before - it is returned to user code. + it is returned to user code. This `post_delete_membership` interceptor runs + before the `post_delete_membership_with_metadata` interceptor. """ return response + def post_delete_membership_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_membership + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GkeHubMembershipService server but before it is returned to user code. + + We recommend only using this `post_delete_membership_with_metadata` + interceptor in new development instead of the `post_delete_membership` interceptor. + When both interceptors are used, this `post_delete_membership_with_metadata` interceptor runs after the + `post_delete_membership` interceptor. The (possibly modified) response returned by + `post_delete_membership` will be passed to + `post_delete_membership_with_metadata`. + """ + return response, metadata + def pre_generate_connect_manifest( self, request: membership.GenerateConnectManifestRequest, @@ -212,12 +258,38 @@ def post_generate_connect_manifest( ) -> membership.GenerateConnectManifestResponse: """Post-rpc interceptor for generate_connect_manifest - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_generate_connect_manifest_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GkeHubMembershipService server but before - it is returned to user code. + it is returned to user code. This `post_generate_connect_manifest` interceptor runs + before the `post_generate_connect_manifest_with_metadata` interceptor. """ return response + def post_generate_connect_manifest_with_metadata( + self, + response: membership.GenerateConnectManifestResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + membership.GenerateConnectManifestResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for generate_connect_manifest + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GkeHubMembershipService server but before it is returned to user code. + + We recommend only using this `post_generate_connect_manifest_with_metadata` + interceptor in new development instead of the `post_generate_connect_manifest` interceptor. + When both interceptors are used, this `post_generate_connect_manifest_with_metadata` interceptor runs after the + `post_generate_connect_manifest` interceptor. The (possibly modified) response returned by + `post_generate_connect_manifest` will be passed to + `post_generate_connect_manifest_with_metadata`. + """ + return response, metadata + def pre_generate_exclusivity_manifest( self, request: membership.GenerateExclusivityManifestRequest, @@ -238,12 +310,38 @@ def post_generate_exclusivity_manifest( ) -> membership.GenerateExclusivityManifestResponse: """Post-rpc interceptor for generate_exclusivity_manifest - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_generate_exclusivity_manifest_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GkeHubMembershipService server but before - it is returned to user code. + it is returned to user code. This `post_generate_exclusivity_manifest` interceptor runs + before the `post_generate_exclusivity_manifest_with_metadata` interceptor. """ return response + def post_generate_exclusivity_manifest_with_metadata( + self, + response: membership.GenerateExclusivityManifestResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + membership.GenerateExclusivityManifestResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for generate_exclusivity_manifest + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GkeHubMembershipService server but before it is returned to user code. + + We recommend only using this `post_generate_exclusivity_manifest_with_metadata` + interceptor in new development instead of the `post_generate_exclusivity_manifest` interceptor. + When both interceptors are used, this `post_generate_exclusivity_manifest_with_metadata` interceptor runs after the + `post_generate_exclusivity_manifest` interceptor. The (possibly modified) response returned by + `post_generate_exclusivity_manifest` will be passed to + `post_generate_exclusivity_manifest_with_metadata`. + """ + return response, metadata + def pre_get_membership( self, request: membership.GetMembershipRequest, @@ -263,12 +361,35 @@ def post_get_membership( ) -> membership.Membership: """Post-rpc interceptor for get_membership - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_membership_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GkeHubMembershipService server but before - it is returned to user code. + it is returned to user code. This `post_get_membership` interceptor runs + before the `post_get_membership_with_metadata` interceptor. """ return response + def post_get_membership_with_metadata( + self, + response: membership.Membership, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[membership.Membership, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_membership + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GkeHubMembershipService server but before it is returned to user code. + + We recommend only using this `post_get_membership_with_metadata` + interceptor in new development instead of the `post_get_membership` interceptor. + When both interceptors are used, this `post_get_membership_with_metadata` interceptor runs after the + `post_get_membership` interceptor. The (possibly modified) response returned by + `post_get_membership` will be passed to + `post_get_membership_with_metadata`. + """ + return response, metadata + def pre_list_memberships( self, request: membership.ListMembershipsRequest, @@ -288,12 +409,37 @@ def post_list_memberships( ) -> membership.ListMembershipsResponse: """Post-rpc interceptor for list_memberships - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_memberships_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GkeHubMembershipService server but before - it is returned to user code. + it is returned to user code. This `post_list_memberships` interceptor runs + before the `post_list_memberships_with_metadata` interceptor. """ return response + def post_list_memberships_with_metadata( + self, + response: membership.ListMembershipsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + membership.ListMembershipsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_memberships + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GkeHubMembershipService server but before it is returned to user code. + + We recommend only using this `post_list_memberships_with_metadata` + interceptor in new development instead of the `post_list_memberships` interceptor. + When both interceptors are used, this `post_list_memberships_with_metadata` interceptor runs after the + `post_list_memberships` interceptor. The (possibly modified) response returned by + `post_list_memberships` will be passed to + `post_list_memberships_with_metadata`. + """ + return response, metadata + def pre_update_membership( self, request: membership.UpdateMembershipRequest, @@ -313,12 +459,35 @@ def post_update_membership( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_membership - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_membership_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GkeHubMembershipService server but before - it is returned to user code. + it is returned to user code. This `post_update_membership` interceptor runs + before the `post_update_membership_with_metadata` interceptor. """ return response + def post_update_membership_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_membership + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GkeHubMembershipService server but before it is returned to user code. + + We recommend only using this `post_update_membership_with_metadata` + interceptor in new development instead of the `post_update_membership` interceptor. + When both interceptors are used, this `post_update_membership_with_metadata` interceptor runs after the + `post_update_membership` interceptor. The (possibly modified) response returned by + `post_update_membership` will be passed to + `post_update_membership_with_metadata`. + """ + return response, metadata + def pre_validate_exclusivity( self, request: membership.ValidateExclusivityRequest, @@ -338,12 +507,37 @@ def post_validate_exclusivity( ) -> membership.ValidateExclusivityResponse: """Post-rpc interceptor for validate_exclusivity - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_validate_exclusivity_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GkeHubMembershipService server but before - it is returned to user code. + it is returned to user code. This `post_validate_exclusivity` interceptor runs + before the `post_validate_exclusivity_with_metadata` interceptor. """ return response + def post_validate_exclusivity_with_metadata( + self, + response: membership.ValidateExclusivityResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + membership.ValidateExclusivityResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for validate_exclusivity + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GkeHubMembershipService server but before it is returned to user code. + + We recommend only using this `post_validate_exclusivity_with_metadata` + interceptor in new development instead of the `post_validate_exclusivity` interceptor. + When both interceptors are used, this `post_validate_exclusivity_with_metadata` interceptor runs after the + `post_validate_exclusivity` interceptor. The (possibly modified) response returned by + `post_validate_exclusivity` will be passed to + `post_validate_exclusivity_with_metadata`. + """ + return response, metadata + def pre_get_location( self, request: locations_pb2.GetLocationRequest, @@ -842,6 +1036,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_membership(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_membership_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -989,6 +1187,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_membership(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_membership_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1137,6 +1339,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_generate_connect_manifest(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_generate_connect_manifest_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1289,6 +1495,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_generate_exclusivity_manifest(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_generate_exclusivity_manifest_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1437,6 +1650,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_membership(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_membership_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1585,6 +1802,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_memberships(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_memberships_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1740,6 +1961,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_membership(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_membership_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1889,6 +2114,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_validate_exclusivity(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_validate_exclusivity_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-gke-hub/samples/generated_samples/snippet_metadata_google.cloud.gkehub.v1.json b/packages/google-cloud-gke-hub/samples/generated_samples/snippet_metadata_google.cloud.gkehub.v1.json index a66564b1700a..0e22653d9aa3 100644 --- a/packages/google-cloud-gke-hub/samples/generated_samples/snippet_metadata_google.cloud.gkehub.v1.json +++ b/packages/google-cloud-gke-hub/samples/generated_samples/snippet_metadata_google.cloud.gkehub.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-gke-hub", - "version": "1.16.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-gke-hub/samples/generated_samples/snippet_metadata_google.cloud.gkehub.v1beta1.json b/packages/google-cloud-gke-hub/samples/generated_samples/snippet_metadata_google.cloud.gkehub.v1beta1.json index fb45110c83ae..c8aed2f9f17d 100644 --- a/packages/google-cloud-gke-hub/samples/generated_samples/snippet_metadata_google.cloud.gkehub.v1beta1.json +++ b/packages/google-cloud-gke-hub/samples/generated_samples/snippet_metadata_google.cloud.gkehub.v1beta1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-gke-hub", - "version": "1.16.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-gke-hub/tests/unit/gapic/gkehub_v1/test_gke_hub.py b/packages/google-cloud-gke-hub/tests/unit/gapic/gkehub_v1/test_gke_hub.py index 2643827165af..6dc315152599 100644 --- a/packages/google-cloud-gke-hub/tests/unit/gapic/gkehub_v1/test_gke_hub.py +++ b/packages/google-cloud-gke-hub/tests/unit/gapic/gkehub_v1/test_gke_hub.py @@ -73,6 +73,13 @@ ) from google.cloud.gkehub_v1.types import feature, membership, service +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -295,6 +302,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = GkeHubClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=["foo"]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + if show_cred_info: + assert error.details == ["foo", CRED_INFO_STRING] + else: + assert error.details == ["foo"] + + +@pytest.mark.parametrize("error_code", [401, 403, 404, 500]) +def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code): + cred = mock.Mock([]) + assert not hasattr(cred, "get_cred_info") + client = GkeHubClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -7649,10 +7699,13 @@ def test_list_memberships_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GkeHubRestInterceptor, "post_list_memberships" ) as post, mock.patch.object( + transports.GkeHubRestInterceptor, "post_list_memberships_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GkeHubRestInterceptor, "pre_list_memberships" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListMembershipsRequest.pb(service.ListMembershipsRequest()) transcode.return_value = { "method": "post", @@ -7676,6 +7729,7 @@ def test_list_memberships_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListMembershipsResponse() + post_with_metadata.return_value = service.ListMembershipsResponse(), metadata client.list_memberships( request, @@ -7687,6 +7741,7 @@ def test_list_memberships_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_features_rest_bad_request(request_type=service.ListFeaturesRequest): @@ -7767,10 +7822,13 @@ def test_list_features_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GkeHubRestInterceptor, "post_list_features" ) as post, mock.patch.object( + transports.GkeHubRestInterceptor, "post_list_features_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GkeHubRestInterceptor, "pre_list_features" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListFeaturesRequest.pb(service.ListFeaturesRequest()) transcode.return_value = { "method": "post", @@ -7794,6 +7852,7 @@ def test_list_features_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListFeaturesResponse() + post_with_metadata.return_value = service.ListFeaturesResponse(), metadata client.list_features( request, @@ -7805,6 +7864,7 @@ def test_list_features_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_membership_rest_bad_request(request_type=service.GetMembershipRequest): @@ -7891,10 +7951,13 @@ def test_get_membership_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GkeHubRestInterceptor, "post_get_membership" ) as post, mock.patch.object( + transports.GkeHubRestInterceptor, "post_get_membership_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GkeHubRestInterceptor, "pre_get_membership" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetMembershipRequest.pb(service.GetMembershipRequest()) transcode.return_value = { "method": "post", @@ -7916,6 +7979,7 @@ def test_get_membership_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = membership.Membership() + post_with_metadata.return_value = membership.Membership(), metadata client.get_membership( request, @@ -7927,6 +7991,7 @@ def test_get_membership_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_feature_rest_bad_request(request_type=service.GetFeatureRequest): @@ -8007,10 +8072,13 @@ def test_get_feature_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GkeHubRestInterceptor, "post_get_feature" ) as post, mock.patch.object( + transports.GkeHubRestInterceptor, "post_get_feature_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GkeHubRestInterceptor, "pre_get_feature" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetFeatureRequest.pb(service.GetFeatureRequest()) transcode.return_value = { "method": "post", @@ -8032,6 +8100,7 @@ def test_get_feature_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = feature.Feature() + post_with_metadata.return_value = feature.Feature(), metadata client.get_feature( request, @@ -8043,6 +8112,7 @@ def test_get_feature_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_membership_rest_bad_request( @@ -8240,10 +8310,13 @@ def test_create_membership_rest_interceptors(null_interceptor): ), mock.patch.object( transports.GkeHubRestInterceptor, "post_create_membership" ) as post, mock.patch.object( + transports.GkeHubRestInterceptor, "post_create_membership_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GkeHubRestInterceptor, "pre_create_membership" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateMembershipRequest.pb( service.CreateMembershipRequest() ) @@ -8267,6 +8340,7 @@ def test_create_membership_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_membership( request, @@ -8278,6 +8352,7 @@ def test_create_membership_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_feature_rest_bad_request(request_type=service.CreateFeatureRequest): @@ -8441,10 +8516,13 @@ def test_create_feature_rest_interceptors(null_interceptor): ), mock.patch.object( transports.GkeHubRestInterceptor, "post_create_feature" ) as post, mock.patch.object( + transports.GkeHubRestInterceptor, "post_create_feature_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GkeHubRestInterceptor, "pre_create_feature" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateFeatureRequest.pb(service.CreateFeatureRequest()) transcode.return_value = { "method": "post", @@ -8466,6 +8544,7 @@ def test_create_feature_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_feature( request, @@ -8477,6 +8556,7 @@ def test_create_feature_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_membership_rest_bad_request( @@ -8555,10 +8635,13 @@ def test_delete_membership_rest_interceptors(null_interceptor): ), mock.patch.object( transports.GkeHubRestInterceptor, "post_delete_membership" ) as post, mock.patch.object( + transports.GkeHubRestInterceptor, "post_delete_membership_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GkeHubRestInterceptor, "pre_delete_membership" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.DeleteMembershipRequest.pb( service.DeleteMembershipRequest() ) @@ -8582,6 +8665,7 @@ def test_delete_membership_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_membership( request, @@ -8593,6 +8677,7 @@ def test_delete_membership_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_feature_rest_bad_request(request_type=service.DeleteFeatureRequest): @@ -8669,10 +8754,13 @@ def test_delete_feature_rest_interceptors(null_interceptor): ), mock.patch.object( transports.GkeHubRestInterceptor, "post_delete_feature" ) as post, mock.patch.object( + transports.GkeHubRestInterceptor, "post_delete_feature_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GkeHubRestInterceptor, "pre_delete_feature" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.DeleteFeatureRequest.pb(service.DeleteFeatureRequest()) transcode.return_value = { "method": "post", @@ -8694,6 +8782,7 @@ def test_delete_feature_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_feature( request, @@ -8705,6 +8794,7 @@ def test_delete_feature_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_membership_rest_bad_request( @@ -8902,10 +8992,13 @@ def test_update_membership_rest_interceptors(null_interceptor): ), mock.patch.object( transports.GkeHubRestInterceptor, "post_update_membership" ) as post, mock.patch.object( + transports.GkeHubRestInterceptor, "post_update_membership_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GkeHubRestInterceptor, "pre_update_membership" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.UpdateMembershipRequest.pb( service.UpdateMembershipRequest() ) @@ -8929,6 +9022,7 @@ def test_update_membership_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.update_membership( request, @@ -8940,6 +9034,7 @@ def test_update_membership_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_feature_rest_bad_request(request_type=service.UpdateFeatureRequest): @@ -9103,10 +9198,13 @@ def test_update_feature_rest_interceptors(null_interceptor): ), mock.patch.object( transports.GkeHubRestInterceptor, "post_update_feature" ) as post, mock.patch.object( + transports.GkeHubRestInterceptor, "post_update_feature_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GkeHubRestInterceptor, "pre_update_feature" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.UpdateFeatureRequest.pb(service.UpdateFeatureRequest()) transcode.return_value = { "method": "post", @@ -9128,6 +9226,7 @@ def test_update_feature_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.update_feature( request, @@ -9139,6 +9238,7 @@ def test_update_feature_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_generate_connect_manifest_rest_bad_request( @@ -9218,10 +9318,13 @@ def test_generate_connect_manifest_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GkeHubRestInterceptor, "post_generate_connect_manifest" ) as post, mock.patch.object( + transports.GkeHubRestInterceptor, "post_generate_connect_manifest_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GkeHubRestInterceptor, "pre_generate_connect_manifest" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GenerateConnectManifestRequest.pb( service.GenerateConnectManifestRequest() ) @@ -9247,6 +9350,10 @@ def test_generate_connect_manifest_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.GenerateConnectManifestResponse() + post_with_metadata.return_value = ( + service.GenerateConnectManifestResponse(), + metadata, + ) client.generate_connect_manifest( request, @@ -9258,6 +9365,7 @@ def test_generate_connect_manifest_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_initialize_client_w_rest(): diff --git a/packages/google-cloud-gke-hub/tests/unit/gapic/gkehub_v1beta1/test_gke_hub_membership_service.py b/packages/google-cloud-gke-hub/tests/unit/gapic/gkehub_v1beta1/test_gke_hub_membership_service.py index 252a41e9047d..0935863daf35 100644 --- a/packages/google-cloud-gke-hub/tests/unit/gapic/gkehub_v1beta1/test_gke_hub_membership_service.py +++ b/packages/google-cloud-gke-hub/tests/unit/gapic/gkehub_v1beta1/test_gke_hub_membership_service.py @@ -78,6 +78,13 @@ ) from google.cloud.gkehub_v1beta1.types import membership +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -353,6 +360,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = GkeHubMembershipServiceClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=["foo"]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + if show_cred_info: + assert error.details == ["foo", CRED_INFO_STRING] + else: + assert error.details == ["foo"] + + +@pytest.mark.parametrize("error_code", [401, 403, 404, 500]) +def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code): + cred = mock.Mock([]) + assert not hasattr(cred, "get_cred_info") + client = GkeHubMembershipServiceClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -5991,10 +6041,14 @@ def test_list_memberships_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GkeHubMembershipServiceRestInterceptor, "post_list_memberships" ) as post, mock.patch.object( + transports.GkeHubMembershipServiceRestInterceptor, + "post_list_memberships_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GkeHubMembershipServiceRestInterceptor, "pre_list_memberships" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = membership.ListMembershipsRequest.pb( membership.ListMembershipsRequest() ) @@ -6020,6 +6074,7 @@ def test_list_memberships_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = membership.ListMembershipsResponse() + post_with_metadata.return_value = membership.ListMembershipsResponse(), metadata client.list_memberships( request, @@ -6031,6 +6086,7 @@ def test_list_memberships_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_membership_rest_bad_request(request_type=membership.GetMembershipRequest): @@ -6123,10 +6179,14 @@ def test_get_membership_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GkeHubMembershipServiceRestInterceptor, "post_get_membership" ) as post, mock.patch.object( + transports.GkeHubMembershipServiceRestInterceptor, + "post_get_membership_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GkeHubMembershipServiceRestInterceptor, "pre_get_membership" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = membership.GetMembershipRequest.pb( membership.GetMembershipRequest() ) @@ -6150,6 +6210,7 @@ def test_get_membership_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = membership.Membership() + post_with_metadata.return_value = membership.Membership(), metadata client.get_membership( request, @@ -6161,6 +6222,7 @@ def test_get_membership_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_membership_rest_bad_request( @@ -6372,10 +6434,14 @@ def test_create_membership_rest_interceptors(null_interceptor): ), mock.patch.object( transports.GkeHubMembershipServiceRestInterceptor, "post_create_membership" ) as post, mock.patch.object( + transports.GkeHubMembershipServiceRestInterceptor, + "post_create_membership_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GkeHubMembershipServiceRestInterceptor, "pre_create_membership" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = membership.CreateMembershipRequest.pb( membership.CreateMembershipRequest() ) @@ -6399,6 +6465,7 @@ def test_create_membership_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_membership( request, @@ -6410,6 +6477,7 @@ def test_create_membership_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_membership_rest_bad_request( @@ -6490,10 +6558,14 @@ def test_delete_membership_rest_interceptors(null_interceptor): ), mock.patch.object( transports.GkeHubMembershipServiceRestInterceptor, "post_delete_membership" ) as post, mock.patch.object( + transports.GkeHubMembershipServiceRestInterceptor, + "post_delete_membership_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GkeHubMembershipServiceRestInterceptor, "pre_delete_membership" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = membership.DeleteMembershipRequest.pb( membership.DeleteMembershipRequest() ) @@ -6517,6 +6589,7 @@ def test_delete_membership_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_membership( request, @@ -6528,6 +6601,7 @@ def test_delete_membership_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_membership_rest_bad_request( @@ -6739,10 +6813,14 @@ def test_update_membership_rest_interceptors(null_interceptor): ), mock.patch.object( transports.GkeHubMembershipServiceRestInterceptor, "post_update_membership" ) as post, mock.patch.object( + transports.GkeHubMembershipServiceRestInterceptor, + "post_update_membership_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GkeHubMembershipServiceRestInterceptor, "pre_update_membership" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = membership.UpdateMembershipRequest.pb( membership.UpdateMembershipRequest() ) @@ -6766,6 +6844,7 @@ def test_update_membership_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.update_membership( request, @@ -6777,6 +6856,7 @@ def test_update_membership_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_generate_connect_manifest_rest_bad_request( @@ -6859,11 +6939,15 @@ def test_generate_connect_manifest_rest_interceptors(null_interceptor): transports.GkeHubMembershipServiceRestInterceptor, "post_generate_connect_manifest", ) as post, mock.patch.object( + transports.GkeHubMembershipServiceRestInterceptor, + "post_generate_connect_manifest_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GkeHubMembershipServiceRestInterceptor, "pre_generate_connect_manifest", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = membership.GenerateConnectManifestRequest.pb( membership.GenerateConnectManifestRequest() ) @@ -6889,6 +6973,10 @@ def test_generate_connect_manifest_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = membership.GenerateConnectManifestResponse() + post_with_metadata.return_value = ( + membership.GenerateConnectManifestResponse(), + metadata, + ) client.generate_connect_manifest( request, @@ -6900,6 +6988,7 @@ def test_generate_connect_manifest_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_validate_exclusivity_rest_bad_request( @@ -6981,10 +7070,14 @@ def test_validate_exclusivity_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GkeHubMembershipServiceRestInterceptor, "post_validate_exclusivity" ) as post, mock.patch.object( + transports.GkeHubMembershipServiceRestInterceptor, + "post_validate_exclusivity_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GkeHubMembershipServiceRestInterceptor, "pre_validate_exclusivity" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = membership.ValidateExclusivityRequest.pb( membership.ValidateExclusivityRequest() ) @@ -7010,6 +7103,10 @@ def test_validate_exclusivity_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = membership.ValidateExclusivityResponse() + post_with_metadata.return_value = ( + membership.ValidateExclusivityResponse(), + metadata, + ) client.validate_exclusivity( request, @@ -7021,6 +7118,7 @@ def test_validate_exclusivity_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_generate_exclusivity_manifest_rest_bad_request( @@ -7108,11 +7206,15 @@ def test_generate_exclusivity_manifest_rest_interceptors(null_interceptor): transports.GkeHubMembershipServiceRestInterceptor, "post_generate_exclusivity_manifest", ) as post, mock.patch.object( + transports.GkeHubMembershipServiceRestInterceptor, + "post_generate_exclusivity_manifest_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GkeHubMembershipServiceRestInterceptor, "pre_generate_exclusivity_manifest", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = membership.GenerateExclusivityManifestRequest.pb( membership.GenerateExclusivityManifestRequest() ) @@ -7138,6 +7240,10 @@ def test_generate_exclusivity_manifest_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = membership.GenerateExclusivityManifestResponse() + post_with_metadata.return_value = ( + membership.GenerateExclusivityManifestResponse(), + metadata, + ) client.generate_exclusivity_manifest( request, @@ -7149,6 +7255,7 @@ def test_generate_exclusivity_manifest_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_location_rest_bad_request(request_type=locations_pb2.GetLocationRequest): diff --git a/packages/google-cloud-gke-multicloud/google/cloud/gke_multicloud/gapic_version.py b/packages/google-cloud-gke-multicloud/google/cloud/gke_multicloud/gapic_version.py index 85ced7b920dc..558c8aab67c5 100644 --- a/packages/google-cloud-gke-multicloud/google/cloud/gke_multicloud/gapic_version.py +++ b/packages/google-cloud-gke-multicloud/google/cloud/gke_multicloud/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.6.18" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-gke-multicloud/google/cloud/gke_multicloud_v1/gapic_version.py b/packages/google-cloud-gke-multicloud/google/cloud/gke_multicloud_v1/gapic_version.py index 85ced7b920dc..558c8aab67c5 100644 --- a/packages/google-cloud-gke-multicloud/google/cloud/gke_multicloud_v1/gapic_version.py +++ b/packages/google-cloud-gke-multicloud/google/cloud/gke_multicloud_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.6.18" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-gke-multicloud/google/cloud/gke_multicloud_v1/services/attached_clusters/client.py b/packages/google-cloud-gke-multicloud/google/cloud/gke_multicloud_v1/services/attached_clusters/client.py index 94d36cb915c4..3e0495aafae3 100644 --- a/packages/google-cloud-gke-multicloud/google/cloud/gke_multicloud_v1/services/attached_clusters/client.py +++ b/packages/google-cloud-gke-multicloud/google/cloud/gke_multicloud_v1/services/attached_clusters/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -518,6 +520,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. @@ -2018,16 +2047,20 @@ def list_operations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def get_operation( self, @@ -2073,16 +2106,20 @@ def get_operation( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def delete_operation( self, diff --git a/packages/google-cloud-gke-multicloud/google/cloud/gke_multicloud_v1/services/attached_clusters/transports/rest.py b/packages/google-cloud-gke-multicloud/google/cloud/gke_multicloud_v1/services/attached_clusters/transports/rest.py index a0abb9a1531f..950b1abb1c49 100644 --- a/packages/google-cloud-gke-multicloud/google/cloud/gke_multicloud_v1/services/attached_clusters/transports/rest.py +++ b/packages/google-cloud-gke-multicloud/google/cloud/gke_multicloud_v1/services/attached_clusters/transports/rest.py @@ -167,12 +167,35 @@ def post_create_attached_cluster( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_attached_cluster - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_attached_cluster_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AttachedClusters server but before - it is returned to user code. + it is returned to user code. This `post_create_attached_cluster` interceptor runs + before the `post_create_attached_cluster_with_metadata` interceptor. """ return response + def post_create_attached_cluster_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_attached_cluster + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AttachedClusters server but before it is returned to user code. + + We recommend only using this `post_create_attached_cluster_with_metadata` + interceptor in new development instead of the `post_create_attached_cluster` interceptor. + When both interceptors are used, this `post_create_attached_cluster_with_metadata` interceptor runs after the + `post_create_attached_cluster` interceptor. The (possibly modified) response returned by + `post_create_attached_cluster` will be passed to + `post_create_attached_cluster_with_metadata`. + """ + return response, metadata + def pre_delete_attached_cluster( self, request: attached_service.DeleteAttachedClusterRequest, @@ -193,12 +216,35 @@ def post_delete_attached_cluster( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_attached_cluster - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_attached_cluster_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AttachedClusters server but before - it is returned to user code. + it is returned to user code. This `post_delete_attached_cluster` interceptor runs + before the `post_delete_attached_cluster_with_metadata` interceptor. """ return response + def post_delete_attached_cluster_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_attached_cluster + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AttachedClusters server but before it is returned to user code. + + We recommend only using this `post_delete_attached_cluster_with_metadata` + interceptor in new development instead of the `post_delete_attached_cluster` interceptor. + When both interceptors are used, this `post_delete_attached_cluster_with_metadata` interceptor runs after the + `post_delete_attached_cluster` interceptor. The (possibly modified) response returned by + `post_delete_attached_cluster` will be passed to + `post_delete_attached_cluster_with_metadata`. + """ + return response, metadata + def pre_generate_attached_cluster_agent_token( self, request: attached_service.GenerateAttachedClusterAgentTokenRequest, @@ -219,12 +265,38 @@ def post_generate_attached_cluster_agent_token( ) -> attached_service.GenerateAttachedClusterAgentTokenResponse: """Post-rpc interceptor for generate_attached_cluster_agent_token - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_generate_attached_cluster_agent_token_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AttachedClusters server but before - it is returned to user code. + it is returned to user code. This `post_generate_attached_cluster_agent_token` interceptor runs + before the `post_generate_attached_cluster_agent_token_with_metadata` interceptor. """ return response + def post_generate_attached_cluster_agent_token_with_metadata( + self, + response: attached_service.GenerateAttachedClusterAgentTokenResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + attached_service.GenerateAttachedClusterAgentTokenResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for generate_attached_cluster_agent_token + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AttachedClusters server but before it is returned to user code. + + We recommend only using this `post_generate_attached_cluster_agent_token_with_metadata` + interceptor in new development instead of the `post_generate_attached_cluster_agent_token` interceptor. + When both interceptors are used, this `post_generate_attached_cluster_agent_token_with_metadata` interceptor runs after the + `post_generate_attached_cluster_agent_token` interceptor. The (possibly modified) response returned by + `post_generate_attached_cluster_agent_token` will be passed to + `post_generate_attached_cluster_agent_token_with_metadata`. + """ + return response, metadata + def pre_generate_attached_cluster_install_manifest( self, request: attached_service.GenerateAttachedClusterInstallManifestRequest, @@ -245,12 +317,38 @@ def post_generate_attached_cluster_install_manifest( ) -> attached_service.GenerateAttachedClusterInstallManifestResponse: """Post-rpc interceptor for generate_attached_cluster_install_manifest - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_generate_attached_cluster_install_manifest_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AttachedClusters server but before - it is returned to user code. + it is returned to user code. This `post_generate_attached_cluster_install_manifest` interceptor runs + before the `post_generate_attached_cluster_install_manifest_with_metadata` interceptor. """ return response + def post_generate_attached_cluster_install_manifest_with_metadata( + self, + response: attached_service.GenerateAttachedClusterInstallManifestResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + attached_service.GenerateAttachedClusterInstallManifestResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for generate_attached_cluster_install_manifest + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AttachedClusters server but before it is returned to user code. + + We recommend only using this `post_generate_attached_cluster_install_manifest_with_metadata` + interceptor in new development instead of the `post_generate_attached_cluster_install_manifest` interceptor. + When both interceptors are used, this `post_generate_attached_cluster_install_manifest_with_metadata` interceptor runs after the + `post_generate_attached_cluster_install_manifest` interceptor. The (possibly modified) response returned by + `post_generate_attached_cluster_install_manifest` will be passed to + `post_generate_attached_cluster_install_manifest_with_metadata`. + """ + return response, metadata + def pre_get_attached_cluster( self, request: attached_service.GetAttachedClusterRequest, @@ -271,12 +369,37 @@ def post_get_attached_cluster( ) -> attached_resources.AttachedCluster: """Post-rpc interceptor for get_attached_cluster - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_attached_cluster_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AttachedClusters server but before - it is returned to user code. + it is returned to user code. This `post_get_attached_cluster` interceptor runs + before the `post_get_attached_cluster_with_metadata` interceptor. """ return response + def post_get_attached_cluster_with_metadata( + self, + response: attached_resources.AttachedCluster, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + attached_resources.AttachedCluster, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_attached_cluster + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AttachedClusters server but before it is returned to user code. + + We recommend only using this `post_get_attached_cluster_with_metadata` + interceptor in new development instead of the `post_get_attached_cluster` interceptor. + When both interceptors are used, this `post_get_attached_cluster_with_metadata` interceptor runs after the + `post_get_attached_cluster` interceptor. The (possibly modified) response returned by + `post_get_attached_cluster` will be passed to + `post_get_attached_cluster_with_metadata`. + """ + return response, metadata + def pre_get_attached_server_config( self, request: attached_service.GetAttachedServerConfigRequest, @@ -297,12 +420,37 @@ def post_get_attached_server_config( ) -> attached_resources.AttachedServerConfig: """Post-rpc interceptor for get_attached_server_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_attached_server_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AttachedClusters server but before - it is returned to user code. + it is returned to user code. This `post_get_attached_server_config` interceptor runs + before the `post_get_attached_server_config_with_metadata` interceptor. """ return response + def post_get_attached_server_config_with_metadata( + self, + response: attached_resources.AttachedServerConfig, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + attached_resources.AttachedServerConfig, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_attached_server_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AttachedClusters server but before it is returned to user code. + + We recommend only using this `post_get_attached_server_config_with_metadata` + interceptor in new development instead of the `post_get_attached_server_config` interceptor. + When both interceptors are used, this `post_get_attached_server_config_with_metadata` interceptor runs after the + `post_get_attached_server_config` interceptor. The (possibly modified) response returned by + `post_get_attached_server_config` will be passed to + `post_get_attached_server_config_with_metadata`. + """ + return response, metadata + def pre_import_attached_cluster( self, request: attached_service.ImportAttachedClusterRequest, @@ -323,12 +471,35 @@ def post_import_attached_cluster( ) -> operations_pb2.Operation: """Post-rpc interceptor for import_attached_cluster - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_import_attached_cluster_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AttachedClusters server but before - it is returned to user code. + it is returned to user code. This `post_import_attached_cluster` interceptor runs + before the `post_import_attached_cluster_with_metadata` interceptor. """ return response + def post_import_attached_cluster_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for import_attached_cluster + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AttachedClusters server but before it is returned to user code. + + We recommend only using this `post_import_attached_cluster_with_metadata` + interceptor in new development instead of the `post_import_attached_cluster` interceptor. + When both interceptors are used, this `post_import_attached_cluster_with_metadata` interceptor runs after the + `post_import_attached_cluster` interceptor. The (possibly modified) response returned by + `post_import_attached_cluster` will be passed to + `post_import_attached_cluster_with_metadata`. + """ + return response, metadata + def pre_list_attached_clusters( self, request: attached_service.ListAttachedClustersRequest, @@ -349,12 +520,38 @@ def post_list_attached_clusters( ) -> attached_service.ListAttachedClustersResponse: """Post-rpc interceptor for list_attached_clusters - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_attached_clusters_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AttachedClusters server but before - it is returned to user code. + it is returned to user code. This `post_list_attached_clusters` interceptor runs + before the `post_list_attached_clusters_with_metadata` interceptor. """ return response + def post_list_attached_clusters_with_metadata( + self, + response: attached_service.ListAttachedClustersResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + attached_service.ListAttachedClustersResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_attached_clusters + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AttachedClusters server but before it is returned to user code. + + We recommend only using this `post_list_attached_clusters_with_metadata` + interceptor in new development instead of the `post_list_attached_clusters` interceptor. + When both interceptors are used, this `post_list_attached_clusters_with_metadata` interceptor runs after the + `post_list_attached_clusters` interceptor. The (possibly modified) response returned by + `post_list_attached_clusters` will be passed to + `post_list_attached_clusters_with_metadata`. + """ + return response, metadata + def pre_update_attached_cluster( self, request: attached_service.UpdateAttachedClusterRequest, @@ -375,12 +572,35 @@ def post_update_attached_cluster( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_attached_cluster - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_attached_cluster_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AttachedClusters server but before - it is returned to user code. + it is returned to user code. This `post_update_attached_cluster` interceptor runs + before the `post_update_attached_cluster_with_metadata` interceptor. """ return response + def post_update_attached_cluster_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_attached_cluster + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AttachedClusters server but before it is returned to user code. + + We recommend only using this `post_update_attached_cluster_with_metadata` + interceptor in new development instead of the `post_update_attached_cluster` interceptor. + When both interceptors are used, this `post_update_attached_cluster_with_metadata` interceptor runs after the + `post_update_attached_cluster` interceptor. The (possibly modified) response returned by + `post_update_attached_cluster` will be passed to + `post_update_attached_cluster_with_metadata`. + """ + return response, metadata + def pre_cancel_operation( self, request: operations_pb2.CancelOperationRequest, @@ -754,6 +974,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_attached_cluster(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_attached_cluster_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -901,6 +1125,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_attached_cluster(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_attached_cluster_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1058,6 +1286,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_generate_attached_cluster_agent_token(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_generate_attached_cluster_agent_token_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1218,6 +1453,13 @@ def __call__( resp = self._interceptor.post_generate_attached_cluster_install_manifest( resp ) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_generate_attached_cluster_install_manifest_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1366,6 +1608,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_attached_cluster(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_attached_cluster_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1518,6 +1764,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_attached_server_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_attached_server_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1673,6 +1923,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_import_attached_cluster(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_import_attached_cluster_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1821,6 +2075,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_attached_clusters(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_attached_clusters_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1976,6 +2234,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_attached_cluster(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_attached_cluster_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-gke-multicloud/google/cloud/gke_multicloud_v1/services/aws_clusters/client.py b/packages/google-cloud-gke-multicloud/google/cloud/gke_multicloud_v1/services/aws_clusters/client.py index 76659710f47f..da147a019a06 100644 --- a/packages/google-cloud-gke-multicloud/google/cloud/gke_multicloud_v1/services/aws_clusters/client.py +++ b/packages/google-cloud-gke-multicloud/google/cloud/gke_multicloud_v1/services/aws_clusters/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -542,6 +544,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. @@ -2891,16 +2920,20 @@ def list_operations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def get_operation( self, @@ -2946,16 +2979,20 @@ def get_operation( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def delete_operation( self, diff --git a/packages/google-cloud-gke-multicloud/google/cloud/gke_multicloud_v1/services/aws_clusters/transports/rest.py b/packages/google-cloud-gke-multicloud/google/cloud/gke_multicloud_v1/services/aws_clusters/transports/rest.py index 85da61b76edd..a7a1c3ab23e1 100644 --- a/packages/google-cloud-gke-multicloud/google/cloud/gke_multicloud_v1/services/aws_clusters/transports/rest.py +++ b/packages/google-cloud-gke-multicloud/google/cloud/gke_multicloud_v1/services/aws_clusters/transports/rest.py @@ -222,12 +222,35 @@ def post_create_aws_cluster( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_aws_cluster - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_aws_cluster_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AwsClusters server but before - it is returned to user code. + it is returned to user code. This `post_create_aws_cluster` interceptor runs + before the `post_create_aws_cluster_with_metadata` interceptor. """ return response + def post_create_aws_cluster_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_aws_cluster + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AwsClusters server but before it is returned to user code. + + We recommend only using this `post_create_aws_cluster_with_metadata` + interceptor in new development instead of the `post_create_aws_cluster` interceptor. + When both interceptors are used, this `post_create_aws_cluster_with_metadata` interceptor runs after the + `post_create_aws_cluster` interceptor. The (possibly modified) response returned by + `post_create_aws_cluster` will be passed to + `post_create_aws_cluster_with_metadata`. + """ + return response, metadata + def pre_create_aws_node_pool( self, request: aws_service.CreateAwsNodePoolRequest, @@ -247,12 +270,35 @@ def post_create_aws_node_pool( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_aws_node_pool - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_aws_node_pool_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AwsClusters server but before - it is returned to user code. + it is returned to user code. This `post_create_aws_node_pool` interceptor runs + before the `post_create_aws_node_pool_with_metadata` interceptor. """ return response + def post_create_aws_node_pool_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_aws_node_pool + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AwsClusters server but before it is returned to user code. + + We recommend only using this `post_create_aws_node_pool_with_metadata` + interceptor in new development instead of the `post_create_aws_node_pool` interceptor. + When both interceptors are used, this `post_create_aws_node_pool_with_metadata` interceptor runs after the + `post_create_aws_node_pool` interceptor. The (possibly modified) response returned by + `post_create_aws_node_pool` will be passed to + `post_create_aws_node_pool_with_metadata`. + """ + return response, metadata + def pre_delete_aws_cluster( self, request: aws_service.DeleteAwsClusterRequest, @@ -272,12 +318,35 @@ def post_delete_aws_cluster( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_aws_cluster - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_aws_cluster_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AwsClusters server but before - it is returned to user code. + it is returned to user code. This `post_delete_aws_cluster` interceptor runs + before the `post_delete_aws_cluster_with_metadata` interceptor. """ return response + def post_delete_aws_cluster_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_aws_cluster + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AwsClusters server but before it is returned to user code. + + We recommend only using this `post_delete_aws_cluster_with_metadata` + interceptor in new development instead of the `post_delete_aws_cluster` interceptor. + When both interceptors are used, this `post_delete_aws_cluster_with_metadata` interceptor runs after the + `post_delete_aws_cluster` interceptor. The (possibly modified) response returned by + `post_delete_aws_cluster` will be passed to + `post_delete_aws_cluster_with_metadata`. + """ + return response, metadata + def pre_delete_aws_node_pool( self, request: aws_service.DeleteAwsNodePoolRequest, @@ -297,12 +366,35 @@ def post_delete_aws_node_pool( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_aws_node_pool - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_aws_node_pool_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AwsClusters server but before - it is returned to user code. + it is returned to user code. This `post_delete_aws_node_pool` interceptor runs + before the `post_delete_aws_node_pool_with_metadata` interceptor. """ return response + def post_delete_aws_node_pool_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_aws_node_pool + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AwsClusters server but before it is returned to user code. + + We recommend only using this `post_delete_aws_node_pool_with_metadata` + interceptor in new development instead of the `post_delete_aws_node_pool` interceptor. + When both interceptors are used, this `post_delete_aws_node_pool_with_metadata` interceptor runs after the + `post_delete_aws_node_pool` interceptor. The (possibly modified) response returned by + `post_delete_aws_node_pool` will be passed to + `post_delete_aws_node_pool_with_metadata`. + """ + return response, metadata + def pre_generate_aws_access_token( self, request: aws_service.GenerateAwsAccessTokenRequest, @@ -323,12 +415,38 @@ def post_generate_aws_access_token( ) -> aws_service.GenerateAwsAccessTokenResponse: """Post-rpc interceptor for generate_aws_access_token - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_generate_aws_access_token_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AwsClusters server but before - it is returned to user code. + it is returned to user code. This `post_generate_aws_access_token` interceptor runs + before the `post_generate_aws_access_token_with_metadata` interceptor. """ return response + def post_generate_aws_access_token_with_metadata( + self, + response: aws_service.GenerateAwsAccessTokenResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + aws_service.GenerateAwsAccessTokenResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for generate_aws_access_token + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AwsClusters server but before it is returned to user code. + + We recommend only using this `post_generate_aws_access_token_with_metadata` + interceptor in new development instead of the `post_generate_aws_access_token` interceptor. + When both interceptors are used, this `post_generate_aws_access_token_with_metadata` interceptor runs after the + `post_generate_aws_access_token` interceptor. The (possibly modified) response returned by + `post_generate_aws_access_token` will be passed to + `post_generate_aws_access_token_with_metadata`. + """ + return response, metadata + def pre_generate_aws_cluster_agent_token( self, request: aws_service.GenerateAwsClusterAgentTokenRequest, @@ -349,12 +467,38 @@ def post_generate_aws_cluster_agent_token( ) -> aws_service.GenerateAwsClusterAgentTokenResponse: """Post-rpc interceptor for generate_aws_cluster_agent_token - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_generate_aws_cluster_agent_token_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AwsClusters server but before - it is returned to user code. + it is returned to user code. This `post_generate_aws_cluster_agent_token` interceptor runs + before the `post_generate_aws_cluster_agent_token_with_metadata` interceptor. """ return response + def post_generate_aws_cluster_agent_token_with_metadata( + self, + response: aws_service.GenerateAwsClusterAgentTokenResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + aws_service.GenerateAwsClusterAgentTokenResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for generate_aws_cluster_agent_token + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AwsClusters server but before it is returned to user code. + + We recommend only using this `post_generate_aws_cluster_agent_token_with_metadata` + interceptor in new development instead of the `post_generate_aws_cluster_agent_token` interceptor. + When both interceptors are used, this `post_generate_aws_cluster_agent_token_with_metadata` interceptor runs after the + `post_generate_aws_cluster_agent_token` interceptor. The (possibly modified) response returned by + `post_generate_aws_cluster_agent_token` will be passed to + `post_generate_aws_cluster_agent_token_with_metadata`. + """ + return response, metadata + def pre_get_aws_cluster( self, request: aws_service.GetAwsClusterRequest, @@ -374,12 +518,35 @@ def post_get_aws_cluster( ) -> aws_resources.AwsCluster: """Post-rpc interceptor for get_aws_cluster - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_aws_cluster_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AwsClusters server but before - it is returned to user code. + it is returned to user code. This `post_get_aws_cluster` interceptor runs + before the `post_get_aws_cluster_with_metadata` interceptor. """ return response + def post_get_aws_cluster_with_metadata( + self, + response: aws_resources.AwsCluster, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[aws_resources.AwsCluster, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_aws_cluster + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AwsClusters server but before it is returned to user code. + + We recommend only using this `post_get_aws_cluster_with_metadata` + interceptor in new development instead of the `post_get_aws_cluster` interceptor. + When both interceptors are used, this `post_get_aws_cluster_with_metadata` interceptor runs after the + `post_get_aws_cluster` interceptor. The (possibly modified) response returned by + `post_get_aws_cluster` will be passed to + `post_get_aws_cluster_with_metadata`. + """ + return response, metadata + def pre_get_aws_json_web_keys( self, request: aws_service.GetAwsJsonWebKeysRequest, @@ -399,12 +566,35 @@ def post_get_aws_json_web_keys( ) -> aws_resources.AwsJsonWebKeys: """Post-rpc interceptor for get_aws_json_web_keys - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_aws_json_web_keys_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AwsClusters server but before - it is returned to user code. + it is returned to user code. This `post_get_aws_json_web_keys` interceptor runs + before the `post_get_aws_json_web_keys_with_metadata` interceptor. """ return response + def post_get_aws_json_web_keys_with_metadata( + self, + response: aws_resources.AwsJsonWebKeys, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[aws_resources.AwsJsonWebKeys, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_aws_json_web_keys + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AwsClusters server but before it is returned to user code. + + We recommend only using this `post_get_aws_json_web_keys_with_metadata` + interceptor in new development instead of the `post_get_aws_json_web_keys` interceptor. + When both interceptors are used, this `post_get_aws_json_web_keys_with_metadata` interceptor runs after the + `post_get_aws_json_web_keys` interceptor. The (possibly modified) response returned by + `post_get_aws_json_web_keys` will be passed to + `post_get_aws_json_web_keys_with_metadata`. + """ + return response, metadata + def pre_get_aws_node_pool( self, request: aws_service.GetAwsNodePoolRequest, @@ -424,12 +614,35 @@ def post_get_aws_node_pool( ) -> aws_resources.AwsNodePool: """Post-rpc interceptor for get_aws_node_pool - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_aws_node_pool_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AwsClusters server but before - it is returned to user code. + it is returned to user code. This `post_get_aws_node_pool` interceptor runs + before the `post_get_aws_node_pool_with_metadata` interceptor. """ return response + def post_get_aws_node_pool_with_metadata( + self, + response: aws_resources.AwsNodePool, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[aws_resources.AwsNodePool, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_aws_node_pool + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AwsClusters server but before it is returned to user code. + + We recommend only using this `post_get_aws_node_pool_with_metadata` + interceptor in new development instead of the `post_get_aws_node_pool` interceptor. + When both interceptors are used, this `post_get_aws_node_pool_with_metadata` interceptor runs after the + `post_get_aws_node_pool` interceptor. The (possibly modified) response returned by + `post_get_aws_node_pool` will be passed to + `post_get_aws_node_pool_with_metadata`. + """ + return response, metadata + def pre_get_aws_open_id_config( self, request: aws_service.GetAwsOpenIdConfigRequest, @@ -449,12 +662,35 @@ def post_get_aws_open_id_config( ) -> aws_resources.AwsOpenIdConfig: """Post-rpc interceptor for get_aws_open_id_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_aws_open_id_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AwsClusters server but before - it is returned to user code. + it is returned to user code. This `post_get_aws_open_id_config` interceptor runs + before the `post_get_aws_open_id_config_with_metadata` interceptor. """ return response + def post_get_aws_open_id_config_with_metadata( + self, + response: aws_resources.AwsOpenIdConfig, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[aws_resources.AwsOpenIdConfig, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_aws_open_id_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AwsClusters server but before it is returned to user code. + + We recommend only using this `post_get_aws_open_id_config_with_metadata` + interceptor in new development instead of the `post_get_aws_open_id_config` interceptor. + When both interceptors are used, this `post_get_aws_open_id_config_with_metadata` interceptor runs after the + `post_get_aws_open_id_config` interceptor. The (possibly modified) response returned by + `post_get_aws_open_id_config` will be passed to + `post_get_aws_open_id_config_with_metadata`. + """ + return response, metadata + def pre_get_aws_server_config( self, request: aws_service.GetAwsServerConfigRequest, @@ -474,12 +710,35 @@ def post_get_aws_server_config( ) -> aws_resources.AwsServerConfig: """Post-rpc interceptor for get_aws_server_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_aws_server_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AwsClusters server but before - it is returned to user code. + it is returned to user code. This `post_get_aws_server_config` interceptor runs + before the `post_get_aws_server_config_with_metadata` interceptor. """ return response + def post_get_aws_server_config_with_metadata( + self, + response: aws_resources.AwsServerConfig, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[aws_resources.AwsServerConfig, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_aws_server_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AwsClusters server but before it is returned to user code. + + We recommend only using this `post_get_aws_server_config_with_metadata` + interceptor in new development instead of the `post_get_aws_server_config` interceptor. + When both interceptors are used, this `post_get_aws_server_config_with_metadata` interceptor runs after the + `post_get_aws_server_config` interceptor. The (possibly modified) response returned by + `post_get_aws_server_config` will be passed to + `post_get_aws_server_config_with_metadata`. + """ + return response, metadata + def pre_list_aws_clusters( self, request: aws_service.ListAwsClustersRequest, @@ -499,12 +758,37 @@ def post_list_aws_clusters( ) -> aws_service.ListAwsClustersResponse: """Post-rpc interceptor for list_aws_clusters - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_aws_clusters_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AwsClusters server but before - it is returned to user code. + it is returned to user code. This `post_list_aws_clusters` interceptor runs + before the `post_list_aws_clusters_with_metadata` interceptor. """ return response + def post_list_aws_clusters_with_metadata( + self, + response: aws_service.ListAwsClustersResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + aws_service.ListAwsClustersResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_aws_clusters + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AwsClusters server but before it is returned to user code. + + We recommend only using this `post_list_aws_clusters_with_metadata` + interceptor in new development instead of the `post_list_aws_clusters` interceptor. + When both interceptors are used, this `post_list_aws_clusters_with_metadata` interceptor runs after the + `post_list_aws_clusters` interceptor. The (possibly modified) response returned by + `post_list_aws_clusters` will be passed to + `post_list_aws_clusters_with_metadata`. + """ + return response, metadata + def pre_list_aws_node_pools( self, request: aws_service.ListAwsNodePoolsRequest, @@ -524,12 +808,37 @@ def post_list_aws_node_pools( ) -> aws_service.ListAwsNodePoolsResponse: """Post-rpc interceptor for list_aws_node_pools - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_aws_node_pools_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AwsClusters server but before - it is returned to user code. + it is returned to user code. This `post_list_aws_node_pools` interceptor runs + before the `post_list_aws_node_pools_with_metadata` interceptor. """ return response + def post_list_aws_node_pools_with_metadata( + self, + response: aws_service.ListAwsNodePoolsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + aws_service.ListAwsNodePoolsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_aws_node_pools + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AwsClusters server but before it is returned to user code. + + We recommend only using this `post_list_aws_node_pools_with_metadata` + interceptor in new development instead of the `post_list_aws_node_pools` interceptor. + When both interceptors are used, this `post_list_aws_node_pools_with_metadata` interceptor runs after the + `post_list_aws_node_pools` interceptor. The (possibly modified) response returned by + `post_list_aws_node_pools` will be passed to + `post_list_aws_node_pools_with_metadata`. + """ + return response, metadata + def pre_rollback_aws_node_pool_update( self, request: aws_service.RollbackAwsNodePoolUpdateRequest, @@ -550,12 +859,35 @@ def post_rollback_aws_node_pool_update( ) -> operations_pb2.Operation: """Post-rpc interceptor for rollback_aws_node_pool_update - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_rollback_aws_node_pool_update_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AwsClusters server but before - it is returned to user code. + it is returned to user code. This `post_rollback_aws_node_pool_update` interceptor runs + before the `post_rollback_aws_node_pool_update_with_metadata` interceptor. """ return response + def post_rollback_aws_node_pool_update_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for rollback_aws_node_pool_update + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AwsClusters server but before it is returned to user code. + + We recommend only using this `post_rollback_aws_node_pool_update_with_metadata` + interceptor in new development instead of the `post_rollback_aws_node_pool_update` interceptor. + When both interceptors are used, this `post_rollback_aws_node_pool_update_with_metadata` interceptor runs after the + `post_rollback_aws_node_pool_update` interceptor. The (possibly modified) response returned by + `post_rollback_aws_node_pool_update` will be passed to + `post_rollback_aws_node_pool_update_with_metadata`. + """ + return response, metadata + def pre_update_aws_cluster( self, request: aws_service.UpdateAwsClusterRequest, @@ -575,12 +907,35 @@ def post_update_aws_cluster( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_aws_cluster - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_aws_cluster_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AwsClusters server but before - it is returned to user code. + it is returned to user code. This `post_update_aws_cluster` interceptor runs + before the `post_update_aws_cluster_with_metadata` interceptor. """ return response + def post_update_aws_cluster_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_aws_cluster + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AwsClusters server but before it is returned to user code. + + We recommend only using this `post_update_aws_cluster_with_metadata` + interceptor in new development instead of the `post_update_aws_cluster` interceptor. + When both interceptors are used, this `post_update_aws_cluster_with_metadata` interceptor runs after the + `post_update_aws_cluster` interceptor. The (possibly modified) response returned by + `post_update_aws_cluster` will be passed to + `post_update_aws_cluster_with_metadata`. + """ + return response, metadata + def pre_update_aws_node_pool( self, request: aws_service.UpdateAwsNodePoolRequest, @@ -600,12 +955,35 @@ def post_update_aws_node_pool( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_aws_node_pool - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_aws_node_pool_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AwsClusters server but before - it is returned to user code. + it is returned to user code. This `post_update_aws_node_pool` interceptor runs + before the `post_update_aws_node_pool_with_metadata` interceptor. """ return response + def post_update_aws_node_pool_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_aws_node_pool + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AwsClusters server but before it is returned to user code. + + We recommend only using this `post_update_aws_node_pool_with_metadata` + interceptor in new development instead of the `post_update_aws_node_pool` interceptor. + When both interceptors are used, this `post_update_aws_node_pool_with_metadata` interceptor runs after the + `post_update_aws_node_pool` interceptor. The (possibly modified) response returned by + `post_update_aws_node_pool` will be passed to + `post_update_aws_node_pool_with_metadata`. + """ + return response, metadata + def pre_cancel_operation( self, request: operations_pb2.CancelOperationRequest, @@ -976,6 +1354,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_aws_cluster(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_aws_cluster_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1126,6 +1508,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_aws_node_pool(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_aws_node_pool_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1270,6 +1656,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_aws_cluster(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_aws_cluster_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1414,6 +1804,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_aws_node_pool(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_aws_node_pool_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1559,6 +1953,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_generate_aws_access_token(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_generate_aws_access_token_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1713,6 +2111,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_generate_aws_cluster_agent_token(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_generate_aws_cluster_agent_token_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1860,6 +2265,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_aws_cluster(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_aws_cluster_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2008,6 +2417,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_aws_json_web_keys(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_aws_json_web_keys_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2151,6 +2564,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_aws_node_pool(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_aws_node_pool_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2300,6 +2717,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_aws_open_id_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_aws_open_id_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2445,6 +2866,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_aws_server_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_aws_server_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2590,6 +3015,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_aws_clusters(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_aws_clusters_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2737,6 +3166,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_aws_node_pools(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_aws_node_pools_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2893,6 +3326,13 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_rollback_aws_node_pool_update(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_rollback_aws_node_pool_update_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3043,6 +3483,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_aws_cluster(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_aws_cluster_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3193,6 +3637,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_aws_node_pool(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_aws_node_pool_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-gke-multicloud/google/cloud/gke_multicloud_v1/services/azure_clusters/client.py b/packages/google-cloud-gke-multicloud/google/cloud/gke_multicloud_v1/services/azure_clusters/client.py index dff3306181ee..bbe92d996a0f 100644 --- a/packages/google-cloud-gke-multicloud/google/cloud/gke_multicloud_v1/services/azure_clusters/client.py +++ b/packages/google-cloud-gke-multicloud/google/cloud/gke_multicloud_v1/services/azure_clusters/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -562,6 +564,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. @@ -3387,16 +3416,20 @@ def list_operations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def get_operation( self, @@ -3442,16 +3475,20 @@ def get_operation( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def delete_operation( self, diff --git a/packages/google-cloud-gke-multicloud/google/cloud/gke_multicloud_v1/services/azure_clusters/transports/rest.py b/packages/google-cloud-gke-multicloud/google/cloud/gke_multicloud_v1/services/azure_clusters/transports/rest.py index 24c6888187ee..aaae045fe490 100644 --- a/packages/google-cloud-gke-multicloud/google/cloud/gke_multicloud_v1/services/azure_clusters/transports/rest.py +++ b/packages/google-cloud-gke-multicloud/google/cloud/gke_multicloud_v1/services/azure_clusters/transports/rest.py @@ -246,12 +246,35 @@ def post_create_azure_client( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_azure_client - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_azure_client_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AzureClusters server but before - it is returned to user code. + it is returned to user code. This `post_create_azure_client` interceptor runs + before the `post_create_azure_client_with_metadata` interceptor. """ return response + def post_create_azure_client_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_azure_client + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AzureClusters server but before it is returned to user code. + + We recommend only using this `post_create_azure_client_with_metadata` + interceptor in new development instead of the `post_create_azure_client` interceptor. + When both interceptors are used, this `post_create_azure_client_with_metadata` interceptor runs after the + `post_create_azure_client` interceptor. The (possibly modified) response returned by + `post_create_azure_client` will be passed to + `post_create_azure_client_with_metadata`. + """ + return response, metadata + def pre_create_azure_cluster( self, request: azure_service.CreateAzureClusterRequest, @@ -271,12 +294,35 @@ def post_create_azure_cluster( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_azure_cluster - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_azure_cluster_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AzureClusters server but before - it is returned to user code. + it is returned to user code. This `post_create_azure_cluster` interceptor runs + before the `post_create_azure_cluster_with_metadata` interceptor. """ return response + def post_create_azure_cluster_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_azure_cluster + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AzureClusters server but before it is returned to user code. + + We recommend only using this `post_create_azure_cluster_with_metadata` + interceptor in new development instead of the `post_create_azure_cluster` interceptor. + When both interceptors are used, this `post_create_azure_cluster_with_metadata` interceptor runs after the + `post_create_azure_cluster` interceptor. The (possibly modified) response returned by + `post_create_azure_cluster` will be passed to + `post_create_azure_cluster_with_metadata`. + """ + return response, metadata + def pre_create_azure_node_pool( self, request: azure_service.CreateAzureNodePoolRequest, @@ -297,12 +343,35 @@ def post_create_azure_node_pool( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_azure_node_pool - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_azure_node_pool_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AzureClusters server but before - it is returned to user code. + it is returned to user code. This `post_create_azure_node_pool` interceptor runs + before the `post_create_azure_node_pool_with_metadata` interceptor. """ return response + def post_create_azure_node_pool_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_azure_node_pool + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AzureClusters server but before it is returned to user code. + + We recommend only using this `post_create_azure_node_pool_with_metadata` + interceptor in new development instead of the `post_create_azure_node_pool` interceptor. + When both interceptors are used, this `post_create_azure_node_pool_with_metadata` interceptor runs after the + `post_create_azure_node_pool` interceptor. The (possibly modified) response returned by + `post_create_azure_node_pool` will be passed to + `post_create_azure_node_pool_with_metadata`. + """ + return response, metadata + def pre_delete_azure_client( self, request: azure_service.DeleteAzureClientRequest, @@ -322,12 +391,35 @@ def post_delete_azure_client( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_azure_client - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_azure_client_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AzureClusters server but before - it is returned to user code. + it is returned to user code. This `post_delete_azure_client` interceptor runs + before the `post_delete_azure_client_with_metadata` interceptor. """ return response + def post_delete_azure_client_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_azure_client + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AzureClusters server but before it is returned to user code. + + We recommend only using this `post_delete_azure_client_with_metadata` + interceptor in new development instead of the `post_delete_azure_client` interceptor. + When both interceptors are used, this `post_delete_azure_client_with_metadata` interceptor runs after the + `post_delete_azure_client` interceptor. The (possibly modified) response returned by + `post_delete_azure_client` will be passed to + `post_delete_azure_client_with_metadata`. + """ + return response, metadata + def pre_delete_azure_cluster( self, request: azure_service.DeleteAzureClusterRequest, @@ -347,12 +439,35 @@ def post_delete_azure_cluster( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_azure_cluster - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_azure_cluster_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AzureClusters server but before - it is returned to user code. + it is returned to user code. This `post_delete_azure_cluster` interceptor runs + before the `post_delete_azure_cluster_with_metadata` interceptor. """ return response + def post_delete_azure_cluster_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_azure_cluster + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AzureClusters server but before it is returned to user code. + + We recommend only using this `post_delete_azure_cluster_with_metadata` + interceptor in new development instead of the `post_delete_azure_cluster` interceptor. + When both interceptors are used, this `post_delete_azure_cluster_with_metadata` interceptor runs after the + `post_delete_azure_cluster` interceptor. The (possibly modified) response returned by + `post_delete_azure_cluster` will be passed to + `post_delete_azure_cluster_with_metadata`. + """ + return response, metadata + def pre_delete_azure_node_pool( self, request: azure_service.DeleteAzureNodePoolRequest, @@ -373,12 +488,35 @@ def post_delete_azure_node_pool( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_azure_node_pool - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_azure_node_pool_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AzureClusters server but before - it is returned to user code. + it is returned to user code. This `post_delete_azure_node_pool` interceptor runs + before the `post_delete_azure_node_pool_with_metadata` interceptor. """ return response + def post_delete_azure_node_pool_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_azure_node_pool + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AzureClusters server but before it is returned to user code. + + We recommend only using this `post_delete_azure_node_pool_with_metadata` + interceptor in new development instead of the `post_delete_azure_node_pool` interceptor. + When both interceptors are used, this `post_delete_azure_node_pool_with_metadata` interceptor runs after the + `post_delete_azure_node_pool` interceptor. The (possibly modified) response returned by + `post_delete_azure_node_pool` will be passed to + `post_delete_azure_node_pool_with_metadata`. + """ + return response, metadata + def pre_generate_azure_access_token( self, request: azure_service.GenerateAzureAccessTokenRequest, @@ -399,12 +537,38 @@ def post_generate_azure_access_token( ) -> azure_service.GenerateAzureAccessTokenResponse: """Post-rpc interceptor for generate_azure_access_token - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_generate_azure_access_token_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AzureClusters server but before - it is returned to user code. + it is returned to user code. This `post_generate_azure_access_token` interceptor runs + before the `post_generate_azure_access_token_with_metadata` interceptor. """ return response + def post_generate_azure_access_token_with_metadata( + self, + response: azure_service.GenerateAzureAccessTokenResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + azure_service.GenerateAzureAccessTokenResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for generate_azure_access_token + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AzureClusters server but before it is returned to user code. + + We recommend only using this `post_generate_azure_access_token_with_metadata` + interceptor in new development instead of the `post_generate_azure_access_token` interceptor. + When both interceptors are used, this `post_generate_azure_access_token_with_metadata` interceptor runs after the + `post_generate_azure_access_token` interceptor. The (possibly modified) response returned by + `post_generate_azure_access_token` will be passed to + `post_generate_azure_access_token_with_metadata`. + """ + return response, metadata + def pre_generate_azure_cluster_agent_token( self, request: azure_service.GenerateAzureClusterAgentTokenRequest, @@ -425,12 +589,38 @@ def post_generate_azure_cluster_agent_token( ) -> azure_service.GenerateAzureClusterAgentTokenResponse: """Post-rpc interceptor for generate_azure_cluster_agent_token - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_generate_azure_cluster_agent_token_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AzureClusters server but before - it is returned to user code. + it is returned to user code. This `post_generate_azure_cluster_agent_token` interceptor runs + before the `post_generate_azure_cluster_agent_token_with_metadata` interceptor. """ return response + def post_generate_azure_cluster_agent_token_with_metadata( + self, + response: azure_service.GenerateAzureClusterAgentTokenResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + azure_service.GenerateAzureClusterAgentTokenResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for generate_azure_cluster_agent_token + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AzureClusters server but before it is returned to user code. + + We recommend only using this `post_generate_azure_cluster_agent_token_with_metadata` + interceptor in new development instead of the `post_generate_azure_cluster_agent_token` interceptor. + When both interceptors are used, this `post_generate_azure_cluster_agent_token_with_metadata` interceptor runs after the + `post_generate_azure_cluster_agent_token` interceptor. The (possibly modified) response returned by + `post_generate_azure_cluster_agent_token` will be passed to + `post_generate_azure_cluster_agent_token_with_metadata`. + """ + return response, metadata + def pre_get_azure_client( self, request: azure_service.GetAzureClientRequest, @@ -450,12 +640,35 @@ def post_get_azure_client( ) -> azure_resources.AzureClient: """Post-rpc interceptor for get_azure_client - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_azure_client_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AzureClusters server but before - it is returned to user code. + it is returned to user code. This `post_get_azure_client` interceptor runs + before the `post_get_azure_client_with_metadata` interceptor. """ return response + def post_get_azure_client_with_metadata( + self, + response: azure_resources.AzureClient, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[azure_resources.AzureClient, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_azure_client + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AzureClusters server but before it is returned to user code. + + We recommend only using this `post_get_azure_client_with_metadata` + interceptor in new development instead of the `post_get_azure_client` interceptor. + When both interceptors are used, this `post_get_azure_client_with_metadata` interceptor runs after the + `post_get_azure_client` interceptor. The (possibly modified) response returned by + `post_get_azure_client` will be passed to + `post_get_azure_client_with_metadata`. + """ + return response, metadata + def pre_get_azure_cluster( self, request: azure_service.GetAzureClusterRequest, @@ -475,12 +688,35 @@ def post_get_azure_cluster( ) -> azure_resources.AzureCluster: """Post-rpc interceptor for get_azure_cluster - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_azure_cluster_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AzureClusters server but before - it is returned to user code. + it is returned to user code. This `post_get_azure_cluster` interceptor runs + before the `post_get_azure_cluster_with_metadata` interceptor. """ return response + def post_get_azure_cluster_with_metadata( + self, + response: azure_resources.AzureCluster, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[azure_resources.AzureCluster, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_azure_cluster + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AzureClusters server but before it is returned to user code. + + We recommend only using this `post_get_azure_cluster_with_metadata` + interceptor in new development instead of the `post_get_azure_cluster` interceptor. + When both interceptors are used, this `post_get_azure_cluster_with_metadata` interceptor runs after the + `post_get_azure_cluster` interceptor. The (possibly modified) response returned by + `post_get_azure_cluster` will be passed to + `post_get_azure_cluster_with_metadata`. + """ + return response, metadata + def pre_get_azure_json_web_keys( self, request: azure_service.GetAzureJsonWebKeysRequest, @@ -501,12 +737,37 @@ def post_get_azure_json_web_keys( ) -> azure_resources.AzureJsonWebKeys: """Post-rpc interceptor for get_azure_json_web_keys - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_azure_json_web_keys_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AzureClusters server but before - it is returned to user code. + it is returned to user code. This `post_get_azure_json_web_keys` interceptor runs + before the `post_get_azure_json_web_keys_with_metadata` interceptor. """ return response + def post_get_azure_json_web_keys_with_metadata( + self, + response: azure_resources.AzureJsonWebKeys, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + azure_resources.AzureJsonWebKeys, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_azure_json_web_keys + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AzureClusters server but before it is returned to user code. + + We recommend only using this `post_get_azure_json_web_keys_with_metadata` + interceptor in new development instead of the `post_get_azure_json_web_keys` interceptor. + When both interceptors are used, this `post_get_azure_json_web_keys_with_metadata` interceptor runs after the + `post_get_azure_json_web_keys` interceptor. The (possibly modified) response returned by + `post_get_azure_json_web_keys` will be passed to + `post_get_azure_json_web_keys_with_metadata`. + """ + return response, metadata + def pre_get_azure_node_pool( self, request: azure_service.GetAzureNodePoolRequest, @@ -526,12 +787,35 @@ def post_get_azure_node_pool( ) -> azure_resources.AzureNodePool: """Post-rpc interceptor for get_azure_node_pool - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_azure_node_pool_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AzureClusters server but before - it is returned to user code. + it is returned to user code. This `post_get_azure_node_pool` interceptor runs + before the `post_get_azure_node_pool_with_metadata` interceptor. """ return response + def post_get_azure_node_pool_with_metadata( + self, + response: azure_resources.AzureNodePool, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[azure_resources.AzureNodePool, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_azure_node_pool + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AzureClusters server but before it is returned to user code. + + We recommend only using this `post_get_azure_node_pool_with_metadata` + interceptor in new development instead of the `post_get_azure_node_pool` interceptor. + When both interceptors are used, this `post_get_azure_node_pool_with_metadata` interceptor runs after the + `post_get_azure_node_pool` interceptor. The (possibly modified) response returned by + `post_get_azure_node_pool` will be passed to + `post_get_azure_node_pool_with_metadata`. + """ + return response, metadata + def pre_get_azure_open_id_config( self, request: azure_service.GetAzureOpenIdConfigRequest, @@ -552,12 +836,37 @@ def post_get_azure_open_id_config( ) -> azure_resources.AzureOpenIdConfig: """Post-rpc interceptor for get_azure_open_id_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_azure_open_id_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AzureClusters server but before - it is returned to user code. + it is returned to user code. This `post_get_azure_open_id_config` interceptor runs + before the `post_get_azure_open_id_config_with_metadata` interceptor. """ return response + def post_get_azure_open_id_config_with_metadata( + self, + response: azure_resources.AzureOpenIdConfig, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + azure_resources.AzureOpenIdConfig, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_azure_open_id_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AzureClusters server but before it is returned to user code. + + We recommend only using this `post_get_azure_open_id_config_with_metadata` + interceptor in new development instead of the `post_get_azure_open_id_config` interceptor. + When both interceptors are used, this `post_get_azure_open_id_config_with_metadata` interceptor runs after the + `post_get_azure_open_id_config` interceptor. The (possibly modified) response returned by + `post_get_azure_open_id_config` will be passed to + `post_get_azure_open_id_config_with_metadata`. + """ + return response, metadata + def pre_get_azure_server_config( self, request: azure_service.GetAzureServerConfigRequest, @@ -578,12 +887,37 @@ def post_get_azure_server_config( ) -> azure_resources.AzureServerConfig: """Post-rpc interceptor for get_azure_server_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_azure_server_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AzureClusters server but before - it is returned to user code. + it is returned to user code. This `post_get_azure_server_config` interceptor runs + before the `post_get_azure_server_config_with_metadata` interceptor. """ return response + def post_get_azure_server_config_with_metadata( + self, + response: azure_resources.AzureServerConfig, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + azure_resources.AzureServerConfig, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_azure_server_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AzureClusters server but before it is returned to user code. + + We recommend only using this `post_get_azure_server_config_with_metadata` + interceptor in new development instead of the `post_get_azure_server_config` interceptor. + When both interceptors are used, this `post_get_azure_server_config_with_metadata` interceptor runs after the + `post_get_azure_server_config` interceptor. The (possibly modified) response returned by + `post_get_azure_server_config` will be passed to + `post_get_azure_server_config_with_metadata`. + """ + return response, metadata + def pre_list_azure_clients( self, request: azure_service.ListAzureClientsRequest, @@ -603,12 +937,37 @@ def post_list_azure_clients( ) -> azure_service.ListAzureClientsResponse: """Post-rpc interceptor for list_azure_clients - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_azure_clients_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AzureClusters server but before - it is returned to user code. + it is returned to user code. This `post_list_azure_clients` interceptor runs + before the `post_list_azure_clients_with_metadata` interceptor. """ return response + def post_list_azure_clients_with_metadata( + self, + response: azure_service.ListAzureClientsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + azure_service.ListAzureClientsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_azure_clients + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AzureClusters server but before it is returned to user code. + + We recommend only using this `post_list_azure_clients_with_metadata` + interceptor in new development instead of the `post_list_azure_clients` interceptor. + When both interceptors are used, this `post_list_azure_clients_with_metadata` interceptor runs after the + `post_list_azure_clients` interceptor. The (possibly modified) response returned by + `post_list_azure_clients` will be passed to + `post_list_azure_clients_with_metadata`. + """ + return response, metadata + def pre_list_azure_clusters( self, request: azure_service.ListAzureClustersRequest, @@ -628,12 +987,37 @@ def post_list_azure_clusters( ) -> azure_service.ListAzureClustersResponse: """Post-rpc interceptor for list_azure_clusters - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_azure_clusters_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AzureClusters server but before - it is returned to user code. + it is returned to user code. This `post_list_azure_clusters` interceptor runs + before the `post_list_azure_clusters_with_metadata` interceptor. """ return response + def post_list_azure_clusters_with_metadata( + self, + response: azure_service.ListAzureClustersResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + azure_service.ListAzureClustersResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_azure_clusters + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AzureClusters server but before it is returned to user code. + + We recommend only using this `post_list_azure_clusters_with_metadata` + interceptor in new development instead of the `post_list_azure_clusters` interceptor. + When both interceptors are used, this `post_list_azure_clusters_with_metadata` interceptor runs after the + `post_list_azure_clusters` interceptor. The (possibly modified) response returned by + `post_list_azure_clusters` will be passed to + `post_list_azure_clusters_with_metadata`. + """ + return response, metadata + def pre_list_azure_node_pools( self, request: azure_service.ListAzureNodePoolsRequest, @@ -653,12 +1037,38 @@ def post_list_azure_node_pools( ) -> azure_service.ListAzureNodePoolsResponse: """Post-rpc interceptor for list_azure_node_pools - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_azure_node_pools_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AzureClusters server but before - it is returned to user code. + it is returned to user code. This `post_list_azure_node_pools` interceptor runs + before the `post_list_azure_node_pools_with_metadata` interceptor. """ return response + def post_list_azure_node_pools_with_metadata( + self, + response: azure_service.ListAzureNodePoolsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + azure_service.ListAzureNodePoolsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_azure_node_pools + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AzureClusters server but before it is returned to user code. + + We recommend only using this `post_list_azure_node_pools_with_metadata` + interceptor in new development instead of the `post_list_azure_node_pools` interceptor. + When both interceptors are used, this `post_list_azure_node_pools_with_metadata` interceptor runs after the + `post_list_azure_node_pools` interceptor. The (possibly modified) response returned by + `post_list_azure_node_pools` will be passed to + `post_list_azure_node_pools_with_metadata`. + """ + return response, metadata + def pre_update_azure_cluster( self, request: azure_service.UpdateAzureClusterRequest, @@ -678,12 +1088,35 @@ def post_update_azure_cluster( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_azure_cluster - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_azure_cluster_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AzureClusters server but before - it is returned to user code. + it is returned to user code. This `post_update_azure_cluster` interceptor runs + before the `post_update_azure_cluster_with_metadata` interceptor. """ return response + def post_update_azure_cluster_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_azure_cluster + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AzureClusters server but before it is returned to user code. + + We recommend only using this `post_update_azure_cluster_with_metadata` + interceptor in new development instead of the `post_update_azure_cluster` interceptor. + When both interceptors are used, this `post_update_azure_cluster_with_metadata` interceptor runs after the + `post_update_azure_cluster` interceptor. The (possibly modified) response returned by + `post_update_azure_cluster` will be passed to + `post_update_azure_cluster_with_metadata`. + """ + return response, metadata + def pre_update_azure_node_pool( self, request: azure_service.UpdateAzureNodePoolRequest, @@ -704,12 +1137,35 @@ def post_update_azure_node_pool( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_azure_node_pool - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_azure_node_pool_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AzureClusters server but before - it is returned to user code. + it is returned to user code. This `post_update_azure_node_pool` interceptor runs + before the `post_update_azure_node_pool_with_metadata` interceptor. """ return response + def post_update_azure_node_pool_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_azure_node_pool + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AzureClusters server but before it is returned to user code. + + We recommend only using this `post_update_azure_node_pool_with_metadata` + interceptor in new development instead of the `post_update_azure_node_pool` interceptor. + When both interceptors are used, this `post_update_azure_node_pool_with_metadata` interceptor runs after the + `post_update_azure_node_pool` interceptor. The (possibly modified) response returned by + `post_update_azure_node_pool` will be passed to + `post_update_azure_node_pool_with_metadata`. + """ + return response, metadata + def pre_cancel_operation( self, request: operations_pb2.CancelOperationRequest, @@ -1080,6 +1536,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_azure_client(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_azure_client_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1230,6 +1690,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_azure_cluster(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_azure_cluster_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1380,6 +1844,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_azure_node_pool(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_azure_node_pool_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1524,6 +1992,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_azure_client(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_azure_client_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1668,6 +2140,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_azure_cluster(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_azure_cluster_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1812,6 +2288,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_azure_node_pool(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_azure_node_pool_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1961,6 +2441,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_generate_azure_access_token(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_generate_azure_access_token_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2116,6 +2600,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_generate_azure_cluster_agent_token(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_generate_azure_cluster_agent_token_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2279,6 +2770,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_azure_client(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_azure_client_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2422,6 +2917,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_azure_cluster(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_azure_cluster_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2570,6 +3069,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_azure_json_web_keys(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_azure_json_web_keys_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2715,6 +3218,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_azure_node_pool(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_azure_node_pool_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2864,6 +3371,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_azure_open_id_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_azure_open_id_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3013,6 +3524,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_azure_server_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_azure_server_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3160,6 +3675,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_azure_clients(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_azure_clients_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3307,6 +3826,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_azure_clusters(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_azure_clusters_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3454,6 +3977,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_azure_node_pools(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_azure_node_pools_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3606,6 +4133,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_azure_cluster(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_azure_cluster_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3756,6 +4287,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_azure_node_pool(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_azure_node_pool_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-gke-multicloud/samples/generated_samples/snippet_metadata_google.cloud.gkemulticloud.v1.json b/packages/google-cloud-gke-multicloud/samples/generated_samples/snippet_metadata_google.cloud.gkemulticloud.v1.json index 0506354e9cd7..34b757edefd0 100644 --- a/packages/google-cloud-gke-multicloud/samples/generated_samples/snippet_metadata_google.cloud.gkemulticloud.v1.json +++ b/packages/google-cloud-gke-multicloud/samples/generated_samples/snippet_metadata_google.cloud.gkemulticloud.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-gke-multicloud", - "version": "0.6.18" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-gke-multicloud/tests/unit/gapic/gke_multicloud_v1/test_attached_clusters.py b/packages/google-cloud-gke-multicloud/tests/unit/gapic/gke_multicloud_v1/test_attached_clusters.py index 7b50156fb1cb..a66cc321cabd 100644 --- a/packages/google-cloud-gke-multicloud/tests/unit/gapic/gke_multicloud_v1/test_attached_clusters.py +++ b/packages/google-cloud-gke-multicloud/tests/unit/gapic/gke_multicloud_v1/test_attached_clusters.py @@ -77,6 +77,13 @@ common_resources, ) +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -336,6 +343,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = AttachedClustersClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=["foo"]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + if show_cred_info: + assert error.details == ["foo", CRED_INFO_STRING] + else: + assert error.details == ["foo"] + + +@pytest.mark.parametrize("error_code", [401, 403, 404, 500]) +def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code): + cred = mock.Mock([]) + assert not hasattr(cred, "get_cred_info") + client = AttachedClustersClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -7125,10 +7175,14 @@ def test_create_attached_cluster_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AttachedClustersRestInterceptor, "post_create_attached_cluster" ) as post, mock.patch.object( + transports.AttachedClustersRestInterceptor, + "post_create_attached_cluster_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AttachedClustersRestInterceptor, "pre_create_attached_cluster" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = attached_service.CreateAttachedClusterRequest.pb( attached_service.CreateAttachedClusterRequest() ) @@ -7152,6 +7206,7 @@ def test_create_attached_cluster_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_attached_cluster( request, @@ -7163,6 +7218,7 @@ def test_create_attached_cluster_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_attached_cluster_rest_bad_request( @@ -7358,10 +7414,14 @@ def test_update_attached_cluster_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AttachedClustersRestInterceptor, "post_update_attached_cluster" ) as post, mock.patch.object( + transports.AttachedClustersRestInterceptor, + "post_update_attached_cluster_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AttachedClustersRestInterceptor, "pre_update_attached_cluster" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = attached_service.UpdateAttachedClusterRequest.pb( attached_service.UpdateAttachedClusterRequest() ) @@ -7385,6 +7445,7 @@ def test_update_attached_cluster_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.update_attached_cluster( request, @@ -7396,6 +7457,7 @@ def test_update_attached_cluster_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_import_attached_cluster_rest_bad_request( @@ -7476,10 +7538,14 @@ def test_import_attached_cluster_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AttachedClustersRestInterceptor, "post_import_attached_cluster" ) as post, mock.patch.object( + transports.AttachedClustersRestInterceptor, + "post_import_attached_cluster_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AttachedClustersRestInterceptor, "pre_import_attached_cluster" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = attached_service.ImportAttachedClusterRequest.pb( attached_service.ImportAttachedClusterRequest() ) @@ -7503,6 +7569,7 @@ def test_import_attached_cluster_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.import_attached_cluster( request, @@ -7514,6 +7581,7 @@ def test_import_attached_cluster_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_attached_cluster_rest_bad_request( @@ -7620,10 +7688,14 @@ def test_get_attached_cluster_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AttachedClustersRestInterceptor, "post_get_attached_cluster" ) as post, mock.patch.object( + transports.AttachedClustersRestInterceptor, + "post_get_attached_cluster_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AttachedClustersRestInterceptor, "pre_get_attached_cluster" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = attached_service.GetAttachedClusterRequest.pb( attached_service.GetAttachedClusterRequest() ) @@ -7649,6 +7721,7 @@ def test_get_attached_cluster_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = attached_resources.AttachedCluster() + post_with_metadata.return_value = attached_resources.AttachedCluster(), metadata client.get_attached_cluster( request, @@ -7660,6 +7733,7 @@ def test_get_attached_cluster_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_attached_clusters_rest_bad_request( @@ -7744,10 +7818,14 @@ def test_list_attached_clusters_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AttachedClustersRestInterceptor, "post_list_attached_clusters" ) as post, mock.patch.object( + transports.AttachedClustersRestInterceptor, + "post_list_attached_clusters_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AttachedClustersRestInterceptor, "pre_list_attached_clusters" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = attached_service.ListAttachedClustersRequest.pb( attached_service.ListAttachedClustersRequest() ) @@ -7773,6 +7851,10 @@ def test_list_attached_clusters_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = attached_service.ListAttachedClustersResponse() + post_with_metadata.return_value = ( + attached_service.ListAttachedClustersResponse(), + metadata, + ) client.list_attached_clusters( request, @@ -7784,6 +7866,7 @@ def test_list_attached_clusters_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_attached_cluster_rest_bad_request( @@ -7868,10 +7951,14 @@ def test_delete_attached_cluster_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AttachedClustersRestInterceptor, "post_delete_attached_cluster" ) as post, mock.patch.object( + transports.AttachedClustersRestInterceptor, + "post_delete_attached_cluster_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AttachedClustersRestInterceptor, "pre_delete_attached_cluster" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = attached_service.DeleteAttachedClusterRequest.pb( attached_service.DeleteAttachedClusterRequest() ) @@ -7895,6 +7982,7 @@ def test_delete_attached_cluster_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_attached_cluster( request, @@ -7906,6 +7994,7 @@ def test_delete_attached_cluster_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_attached_server_config_rest_bad_request( @@ -7990,10 +8079,14 @@ def test_get_attached_server_config_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AttachedClustersRestInterceptor, "post_get_attached_server_config" ) as post, mock.patch.object( + transports.AttachedClustersRestInterceptor, + "post_get_attached_server_config_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AttachedClustersRestInterceptor, "pre_get_attached_server_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = attached_service.GetAttachedServerConfigRequest.pb( attached_service.GetAttachedServerConfigRequest() ) @@ -8019,6 +8112,10 @@ def test_get_attached_server_config_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = attached_resources.AttachedServerConfig() + post_with_metadata.return_value = ( + attached_resources.AttachedServerConfig(), + metadata, + ) client.get_attached_server_config( request, @@ -8030,6 +8127,7 @@ def test_get_attached_server_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_generate_attached_cluster_install_manifest_rest_bad_request( @@ -8121,11 +8219,15 @@ def test_generate_attached_cluster_install_manifest_rest_interceptors(null_inter transports.AttachedClustersRestInterceptor, "post_generate_attached_cluster_install_manifest", ) as post, mock.patch.object( + transports.AttachedClustersRestInterceptor, + "post_generate_attached_cluster_install_manifest_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AttachedClustersRestInterceptor, "pre_generate_attached_cluster_install_manifest", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = attached_service.GenerateAttachedClusterInstallManifestRequest.pb( attached_service.GenerateAttachedClusterInstallManifestRequest() ) @@ -8155,6 +8257,10 @@ def test_generate_attached_cluster_install_manifest_rest_interceptors(null_inter post.return_value = ( attached_service.GenerateAttachedClusterInstallManifestResponse() ) + post_with_metadata.return_value = ( + attached_service.GenerateAttachedClusterInstallManifestResponse(), + metadata, + ) client.generate_attached_cluster_install_manifest( request, @@ -8166,6 +8272,7 @@ def test_generate_attached_cluster_install_manifest_rest_interceptors(null_inter pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_generate_attached_cluster_agent_token_rest_bad_request( @@ -8263,11 +8370,15 @@ def test_generate_attached_cluster_agent_token_rest_interceptors(null_intercepto transports.AttachedClustersRestInterceptor, "post_generate_attached_cluster_agent_token", ) as post, mock.patch.object( + transports.AttachedClustersRestInterceptor, + "post_generate_attached_cluster_agent_token_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AttachedClustersRestInterceptor, "pre_generate_attached_cluster_agent_token", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = attached_service.GenerateAttachedClusterAgentTokenRequest.pb( attached_service.GenerateAttachedClusterAgentTokenRequest() ) @@ -8295,6 +8406,10 @@ def test_generate_attached_cluster_agent_token_rest_interceptors(null_intercepto ] pre.return_value = request, metadata post.return_value = attached_service.GenerateAttachedClusterAgentTokenResponse() + post_with_metadata.return_value = ( + attached_service.GenerateAttachedClusterAgentTokenResponse(), + metadata, + ) client.generate_attached_cluster_agent_token( request, @@ -8306,6 +8421,7 @@ def test_generate_attached_cluster_agent_token_rest_interceptors(null_intercepto pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_cancel_operation_rest_bad_request( diff --git a/packages/google-cloud-gke-multicloud/tests/unit/gapic/gke_multicloud_v1/test_aws_clusters.py b/packages/google-cloud-gke-multicloud/tests/unit/gapic/gke_multicloud_v1/test_aws_clusters.py index 419889085025..0480f36c41d1 100644 --- a/packages/google-cloud-gke-multicloud/tests/unit/gapic/gke_multicloud_v1/test_aws_clusters.py +++ b/packages/google-cloud-gke-multicloud/tests/unit/gapic/gke_multicloud_v1/test_aws_clusters.py @@ -77,6 +77,13 @@ common_resources, ) +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -316,6 +323,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = AwsClustersClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=["foo"]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + if show_cred_info: + assert error.details == ["foo", CRED_INFO_STRING] + else: + assert error.details == ["foo"] + + +@pytest.mark.parametrize("error_code", [401, 403, 404, 500]) +def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code): + cred = mock.Mock([]) + assert not hasattr(cred, "get_cred_info") + client = AwsClustersClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -10961,10 +11011,13 @@ def test_create_aws_cluster_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AwsClustersRestInterceptor, "post_create_aws_cluster" ) as post, mock.patch.object( + transports.AwsClustersRestInterceptor, "post_create_aws_cluster_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AwsClustersRestInterceptor, "pre_create_aws_cluster" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = aws_service.CreateAwsClusterRequest.pb( aws_service.CreateAwsClusterRequest() ) @@ -10988,6 +11041,7 @@ def test_create_aws_cluster_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_aws_cluster( request, @@ -10999,6 +11053,7 @@ def test_create_aws_cluster_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_aws_cluster_rest_bad_request( @@ -11228,10 +11283,13 @@ def test_update_aws_cluster_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AwsClustersRestInterceptor, "post_update_aws_cluster" ) as post, mock.patch.object( + transports.AwsClustersRestInterceptor, "post_update_aws_cluster_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AwsClustersRestInterceptor, "pre_update_aws_cluster" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = aws_service.UpdateAwsClusterRequest.pb( aws_service.UpdateAwsClusterRequest() ) @@ -11255,6 +11313,7 @@ def test_update_aws_cluster_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.update_aws_cluster( request, @@ -11266,6 +11325,7 @@ def test_update_aws_cluster_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_aws_cluster_rest_bad_request( @@ -11366,10 +11426,13 @@ def test_get_aws_cluster_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AwsClustersRestInterceptor, "post_get_aws_cluster" ) as post, mock.patch.object( + transports.AwsClustersRestInterceptor, "post_get_aws_cluster_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AwsClustersRestInterceptor, "pre_get_aws_cluster" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = aws_service.GetAwsClusterRequest.pb( aws_service.GetAwsClusterRequest() ) @@ -11393,6 +11456,7 @@ def test_get_aws_cluster_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = aws_resources.AwsCluster() + post_with_metadata.return_value = aws_resources.AwsCluster(), metadata client.get_aws_cluster( request, @@ -11404,6 +11468,7 @@ def test_get_aws_cluster_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_aws_clusters_rest_bad_request( @@ -11488,10 +11553,13 @@ def test_list_aws_clusters_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AwsClustersRestInterceptor, "post_list_aws_clusters" ) as post, mock.patch.object( + transports.AwsClustersRestInterceptor, "post_list_aws_clusters_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AwsClustersRestInterceptor, "pre_list_aws_clusters" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = aws_service.ListAwsClustersRequest.pb( aws_service.ListAwsClustersRequest() ) @@ -11517,6 +11585,10 @@ def test_list_aws_clusters_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = aws_service.ListAwsClustersResponse() + post_with_metadata.return_value = ( + aws_service.ListAwsClustersResponse(), + metadata, + ) client.list_aws_clusters( request, @@ -11528,6 +11600,7 @@ def test_list_aws_clusters_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_aws_cluster_rest_bad_request( @@ -11608,10 +11681,13 @@ def test_delete_aws_cluster_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AwsClustersRestInterceptor, "post_delete_aws_cluster" ) as post, mock.patch.object( + transports.AwsClustersRestInterceptor, "post_delete_aws_cluster_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AwsClustersRestInterceptor, "pre_delete_aws_cluster" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = aws_service.DeleteAwsClusterRequest.pb( aws_service.DeleteAwsClusterRequest() ) @@ -11635,6 +11711,7 @@ def test_delete_aws_cluster_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_aws_cluster( request, @@ -11646,6 +11723,7 @@ def test_delete_aws_cluster_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_generate_aws_cluster_agent_token_rest_bad_request( @@ -11738,10 +11816,14 @@ def test_generate_aws_cluster_agent_token_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AwsClustersRestInterceptor, "post_generate_aws_cluster_agent_token" ) as post, mock.patch.object( + transports.AwsClustersRestInterceptor, + "post_generate_aws_cluster_agent_token_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AwsClustersRestInterceptor, "pre_generate_aws_cluster_agent_token" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = aws_service.GenerateAwsClusterAgentTokenRequest.pb( aws_service.GenerateAwsClusterAgentTokenRequest() ) @@ -11767,6 +11849,10 @@ def test_generate_aws_cluster_agent_token_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = aws_service.GenerateAwsClusterAgentTokenResponse() + post_with_metadata.return_value = ( + aws_service.GenerateAwsClusterAgentTokenResponse(), + metadata, + ) client.generate_aws_cluster_agent_token( request, @@ -11778,6 +11864,7 @@ def test_generate_aws_cluster_agent_token_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_generate_aws_access_token_rest_bad_request( @@ -11866,10 +11953,14 @@ def test_generate_aws_access_token_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AwsClustersRestInterceptor, "post_generate_aws_access_token" ) as post, mock.patch.object( + transports.AwsClustersRestInterceptor, + "post_generate_aws_access_token_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AwsClustersRestInterceptor, "pre_generate_aws_access_token" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = aws_service.GenerateAwsAccessTokenRequest.pb( aws_service.GenerateAwsAccessTokenRequest() ) @@ -11895,6 +11986,10 @@ def test_generate_aws_access_token_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = aws_service.GenerateAwsAccessTokenResponse() + post_with_metadata.return_value = ( + aws_service.GenerateAwsAccessTokenResponse(), + metadata, + ) client.generate_aws_access_token( request, @@ -11906,6 +12001,7 @@ def test_generate_aws_access_token_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_aws_node_pool_rest_bad_request( @@ -12112,10 +12208,13 @@ def test_create_aws_node_pool_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AwsClustersRestInterceptor, "post_create_aws_node_pool" ) as post, mock.patch.object( + transports.AwsClustersRestInterceptor, "post_create_aws_node_pool_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AwsClustersRestInterceptor, "pre_create_aws_node_pool" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = aws_service.CreateAwsNodePoolRequest.pb( aws_service.CreateAwsNodePoolRequest() ) @@ -12139,6 +12238,7 @@ def test_create_aws_node_pool_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_aws_node_pool( request, @@ -12150,6 +12250,7 @@ def test_create_aws_node_pool_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_aws_node_pool_rest_bad_request( @@ -12364,10 +12465,13 @@ def test_update_aws_node_pool_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AwsClustersRestInterceptor, "post_update_aws_node_pool" ) as post, mock.patch.object( + transports.AwsClustersRestInterceptor, "post_update_aws_node_pool_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AwsClustersRestInterceptor, "pre_update_aws_node_pool" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = aws_service.UpdateAwsNodePoolRequest.pb( aws_service.UpdateAwsNodePoolRequest() ) @@ -12391,6 +12495,7 @@ def test_update_aws_node_pool_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.update_aws_node_pool( request, @@ -12402,6 +12507,7 @@ def test_update_aws_node_pool_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_rollback_aws_node_pool_update_rest_bad_request( @@ -12486,10 +12592,14 @@ def test_rollback_aws_node_pool_update_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AwsClustersRestInterceptor, "post_rollback_aws_node_pool_update" ) as post, mock.patch.object( + transports.AwsClustersRestInterceptor, + "post_rollback_aws_node_pool_update_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AwsClustersRestInterceptor, "pre_rollback_aws_node_pool_update" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = aws_service.RollbackAwsNodePoolUpdateRequest.pb( aws_service.RollbackAwsNodePoolUpdateRequest() ) @@ -12513,6 +12623,7 @@ def test_rollback_aws_node_pool_update_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.rollback_aws_node_pool_update( request, @@ -12524,6 +12635,7 @@ def test_rollback_aws_node_pool_update_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_aws_node_pool_rest_bad_request( @@ -12624,10 +12736,13 @@ def test_get_aws_node_pool_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AwsClustersRestInterceptor, "post_get_aws_node_pool" ) as post, mock.patch.object( + transports.AwsClustersRestInterceptor, "post_get_aws_node_pool_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AwsClustersRestInterceptor, "pre_get_aws_node_pool" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = aws_service.GetAwsNodePoolRequest.pb( aws_service.GetAwsNodePoolRequest() ) @@ -12651,6 +12766,7 @@ def test_get_aws_node_pool_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = aws_resources.AwsNodePool() + post_with_metadata.return_value = aws_resources.AwsNodePool(), metadata client.get_aws_node_pool( request, @@ -12662,6 +12778,7 @@ def test_get_aws_node_pool_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_aws_node_pools_rest_bad_request( @@ -12746,10 +12863,13 @@ def test_list_aws_node_pools_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AwsClustersRestInterceptor, "post_list_aws_node_pools" ) as post, mock.patch.object( + transports.AwsClustersRestInterceptor, "post_list_aws_node_pools_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AwsClustersRestInterceptor, "pre_list_aws_node_pools" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = aws_service.ListAwsNodePoolsRequest.pb( aws_service.ListAwsNodePoolsRequest() ) @@ -12775,6 +12895,10 @@ def test_list_aws_node_pools_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = aws_service.ListAwsNodePoolsResponse() + post_with_metadata.return_value = ( + aws_service.ListAwsNodePoolsResponse(), + metadata, + ) client.list_aws_node_pools( request, @@ -12786,6 +12910,7 @@ def test_list_aws_node_pools_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_aws_node_pool_rest_bad_request( @@ -12870,10 +12995,13 @@ def test_delete_aws_node_pool_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AwsClustersRestInterceptor, "post_delete_aws_node_pool" ) as post, mock.patch.object( + transports.AwsClustersRestInterceptor, "post_delete_aws_node_pool_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AwsClustersRestInterceptor, "pre_delete_aws_node_pool" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = aws_service.DeleteAwsNodePoolRequest.pb( aws_service.DeleteAwsNodePoolRequest() ) @@ -12897,6 +13025,7 @@ def test_delete_aws_node_pool_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_aws_node_pool( request, @@ -12908,6 +13037,7 @@ def test_delete_aws_node_pool_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_aws_open_id_config_rest_bad_request( @@ -13012,10 +13142,14 @@ def test_get_aws_open_id_config_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AwsClustersRestInterceptor, "post_get_aws_open_id_config" ) as post, mock.patch.object( + transports.AwsClustersRestInterceptor, + "post_get_aws_open_id_config_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AwsClustersRestInterceptor, "pre_get_aws_open_id_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = aws_service.GetAwsOpenIdConfigRequest.pb( aws_service.GetAwsOpenIdConfigRequest() ) @@ -13041,6 +13175,7 @@ def test_get_aws_open_id_config_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = aws_resources.AwsOpenIdConfig() + post_with_metadata.return_value = aws_resources.AwsOpenIdConfig(), metadata client.get_aws_open_id_config( request, @@ -13052,6 +13187,7 @@ def test_get_aws_open_id_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_aws_json_web_keys_rest_bad_request( @@ -13137,10 +13273,14 @@ def test_get_aws_json_web_keys_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AwsClustersRestInterceptor, "post_get_aws_json_web_keys" ) as post, mock.patch.object( + transports.AwsClustersRestInterceptor, + "post_get_aws_json_web_keys_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AwsClustersRestInterceptor, "pre_get_aws_json_web_keys" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = aws_service.GetAwsJsonWebKeysRequest.pb( aws_service.GetAwsJsonWebKeysRequest() ) @@ -13166,6 +13306,7 @@ def test_get_aws_json_web_keys_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = aws_resources.AwsJsonWebKeys() + post_with_metadata.return_value = aws_resources.AwsJsonWebKeys(), metadata client.get_aws_json_web_keys( request, @@ -13177,6 +13318,7 @@ def test_get_aws_json_web_keys_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_aws_server_config_rest_bad_request( @@ -13263,10 +13405,14 @@ def test_get_aws_server_config_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AwsClustersRestInterceptor, "post_get_aws_server_config" ) as post, mock.patch.object( + transports.AwsClustersRestInterceptor, + "post_get_aws_server_config_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AwsClustersRestInterceptor, "pre_get_aws_server_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = aws_service.GetAwsServerConfigRequest.pb( aws_service.GetAwsServerConfigRequest() ) @@ -13292,6 +13438,7 @@ def test_get_aws_server_config_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = aws_resources.AwsServerConfig() + post_with_metadata.return_value = aws_resources.AwsServerConfig(), metadata client.get_aws_server_config( request, @@ -13303,6 +13450,7 @@ def test_get_aws_server_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_cancel_operation_rest_bad_request( diff --git a/packages/google-cloud-gke-multicloud/tests/unit/gapic/gke_multicloud_v1/test_azure_clusters.py b/packages/google-cloud-gke-multicloud/tests/unit/gapic/gke_multicloud_v1/test_azure_clusters.py index 9ca701c0310d..4f9e2d40831f 100644 --- a/packages/google-cloud-gke-multicloud/tests/unit/gapic/gke_multicloud_v1/test_azure_clusters.py +++ b/packages/google-cloud-gke-multicloud/tests/unit/gapic/gke_multicloud_v1/test_azure_clusters.py @@ -77,6 +77,13 @@ common_resources, ) +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -331,6 +338,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = AzureClustersClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=["foo"]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + if show_cred_info: + assert error.details == ["foo", CRED_INFO_STRING] + else: + assert error.details == ["foo"] + + +@pytest.mark.parametrize("error_code", [401, 403, 404, 500]) +def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code): + cred = mock.Mock([]) + assert not hasattr(cred, "get_cred_info") + client = AzureClustersClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -13372,10 +13422,14 @@ def test_create_azure_client_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AzureClustersRestInterceptor, "post_create_azure_client" ) as post, mock.patch.object( + transports.AzureClustersRestInterceptor, + "post_create_azure_client_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AzureClustersRestInterceptor, "pre_create_azure_client" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = azure_service.CreateAzureClientRequest.pb( azure_service.CreateAzureClientRequest() ) @@ -13399,6 +13453,7 @@ def test_create_azure_client_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_azure_client( request, @@ -13410,6 +13465,7 @@ def test_create_azure_client_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_azure_client_rest_bad_request( @@ -13504,10 +13560,13 @@ def test_get_azure_client_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AzureClustersRestInterceptor, "post_get_azure_client" ) as post, mock.patch.object( + transports.AzureClustersRestInterceptor, "post_get_azure_client_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AzureClustersRestInterceptor, "pre_get_azure_client" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = azure_service.GetAzureClientRequest.pb( azure_service.GetAzureClientRequest() ) @@ -13533,6 +13592,7 @@ def test_get_azure_client_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = azure_resources.AzureClient() + post_with_metadata.return_value = azure_resources.AzureClient(), metadata client.get_azure_client( request, @@ -13544,6 +13604,7 @@ def test_get_azure_client_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_azure_clients_rest_bad_request( @@ -13628,10 +13689,13 @@ def test_list_azure_clients_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AzureClustersRestInterceptor, "post_list_azure_clients" ) as post, mock.patch.object( + transports.AzureClustersRestInterceptor, "post_list_azure_clients_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AzureClustersRestInterceptor, "pre_list_azure_clients" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = azure_service.ListAzureClientsRequest.pb( azure_service.ListAzureClientsRequest() ) @@ -13657,6 +13721,10 @@ def test_list_azure_clients_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = azure_service.ListAzureClientsResponse() + post_with_metadata.return_value = ( + azure_service.ListAzureClientsResponse(), + metadata, + ) client.list_azure_clients( request, @@ -13668,6 +13736,7 @@ def test_list_azure_clients_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_azure_client_rest_bad_request( @@ -13748,10 +13817,14 @@ def test_delete_azure_client_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AzureClustersRestInterceptor, "post_delete_azure_client" ) as post, mock.patch.object( + transports.AzureClustersRestInterceptor, + "post_delete_azure_client_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AzureClustersRestInterceptor, "pre_delete_azure_client" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = azure_service.DeleteAzureClientRequest.pb( azure_service.DeleteAzureClientRequest() ) @@ -13775,6 +13848,7 @@ def test_delete_azure_client_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_azure_client( request, @@ -13786,6 +13860,7 @@ def test_delete_azure_client_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_azure_cluster_rest_bad_request( @@ -14010,10 +14085,14 @@ def test_create_azure_cluster_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AzureClustersRestInterceptor, "post_create_azure_cluster" ) as post, mock.patch.object( + transports.AzureClustersRestInterceptor, + "post_create_azure_cluster_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AzureClustersRestInterceptor, "pre_create_azure_cluster" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = azure_service.CreateAzureClusterRequest.pb( azure_service.CreateAzureClusterRequest() ) @@ -14037,6 +14116,7 @@ def test_create_azure_cluster_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_azure_cluster( request, @@ -14048,6 +14128,7 @@ def test_create_azure_cluster_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_azure_cluster_rest_bad_request( @@ -14280,10 +14361,14 @@ def test_update_azure_cluster_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AzureClustersRestInterceptor, "post_update_azure_cluster" ) as post, mock.patch.object( + transports.AzureClustersRestInterceptor, + "post_update_azure_cluster_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AzureClustersRestInterceptor, "pre_update_azure_cluster" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = azure_service.UpdateAzureClusterRequest.pb( azure_service.UpdateAzureClusterRequest() ) @@ -14307,6 +14392,7 @@ def test_update_azure_cluster_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.update_azure_cluster( request, @@ -14318,6 +14404,7 @@ def test_update_azure_cluster_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_azure_cluster_rest_bad_request( @@ -14422,10 +14509,13 @@ def test_get_azure_cluster_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AzureClustersRestInterceptor, "post_get_azure_cluster" ) as post, mock.patch.object( + transports.AzureClustersRestInterceptor, "post_get_azure_cluster_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AzureClustersRestInterceptor, "pre_get_azure_cluster" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = azure_service.GetAzureClusterRequest.pb( azure_service.GetAzureClusterRequest() ) @@ -14451,6 +14541,7 @@ def test_get_azure_cluster_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = azure_resources.AzureCluster() + post_with_metadata.return_value = azure_resources.AzureCluster(), metadata client.get_azure_cluster( request, @@ -14462,6 +14553,7 @@ def test_get_azure_cluster_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_azure_clusters_rest_bad_request( @@ -14546,10 +14638,14 @@ def test_list_azure_clusters_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AzureClustersRestInterceptor, "post_list_azure_clusters" ) as post, mock.patch.object( + transports.AzureClustersRestInterceptor, + "post_list_azure_clusters_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AzureClustersRestInterceptor, "pre_list_azure_clusters" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = azure_service.ListAzureClustersRequest.pb( azure_service.ListAzureClustersRequest() ) @@ -14575,6 +14671,10 @@ def test_list_azure_clusters_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = azure_service.ListAzureClustersResponse() + post_with_metadata.return_value = ( + azure_service.ListAzureClustersResponse(), + metadata, + ) client.list_azure_clusters( request, @@ -14586,6 +14686,7 @@ def test_list_azure_clusters_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_azure_cluster_rest_bad_request( @@ -14666,10 +14767,14 @@ def test_delete_azure_cluster_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AzureClustersRestInterceptor, "post_delete_azure_cluster" ) as post, mock.patch.object( + transports.AzureClustersRestInterceptor, + "post_delete_azure_cluster_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AzureClustersRestInterceptor, "pre_delete_azure_cluster" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = azure_service.DeleteAzureClusterRequest.pb( azure_service.DeleteAzureClusterRequest() ) @@ -14693,6 +14798,7 @@ def test_delete_azure_cluster_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_azure_cluster( request, @@ -14704,6 +14810,7 @@ def test_delete_azure_cluster_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_generate_azure_cluster_agent_token_rest_bad_request( @@ -14799,11 +14906,15 @@ def test_generate_azure_cluster_agent_token_rest_interceptors(null_interceptor): transports.AzureClustersRestInterceptor, "post_generate_azure_cluster_agent_token", ) as post, mock.patch.object( + transports.AzureClustersRestInterceptor, + "post_generate_azure_cluster_agent_token_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AzureClustersRestInterceptor, "pre_generate_azure_cluster_agent_token", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = azure_service.GenerateAzureClusterAgentTokenRequest.pb( azure_service.GenerateAzureClusterAgentTokenRequest() ) @@ -14829,6 +14940,10 @@ def test_generate_azure_cluster_agent_token_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = azure_service.GenerateAzureClusterAgentTokenResponse() + post_with_metadata.return_value = ( + azure_service.GenerateAzureClusterAgentTokenResponse(), + metadata, + ) client.generate_azure_cluster_agent_token( request, @@ -14840,6 +14955,7 @@ def test_generate_azure_cluster_agent_token_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_generate_azure_access_token_rest_bad_request( @@ -14928,10 +15044,14 @@ def test_generate_azure_access_token_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AzureClustersRestInterceptor, "post_generate_azure_access_token" ) as post, mock.patch.object( + transports.AzureClustersRestInterceptor, + "post_generate_azure_access_token_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AzureClustersRestInterceptor, "pre_generate_azure_access_token" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = azure_service.GenerateAzureAccessTokenRequest.pb( azure_service.GenerateAzureAccessTokenRequest() ) @@ -14957,6 +15077,10 @@ def test_generate_azure_access_token_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = azure_service.GenerateAzureAccessTokenResponse() + post_with_metadata.return_value = ( + azure_service.GenerateAzureAccessTokenResponse(), + metadata, + ) client.generate_azure_access_token( request, @@ -14968,6 +15092,7 @@ def test_generate_azure_access_token_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_azure_node_pool_rest_bad_request( @@ -15153,10 +15278,14 @@ def test_create_azure_node_pool_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AzureClustersRestInterceptor, "post_create_azure_node_pool" ) as post, mock.patch.object( + transports.AzureClustersRestInterceptor, + "post_create_azure_node_pool_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AzureClustersRestInterceptor, "pre_create_azure_node_pool" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = azure_service.CreateAzureNodePoolRequest.pb( azure_service.CreateAzureNodePoolRequest() ) @@ -15180,6 +15309,7 @@ def test_create_azure_node_pool_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_azure_node_pool( request, @@ -15191,6 +15321,7 @@ def test_create_azure_node_pool_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_azure_node_pool_rest_bad_request( @@ -15380,10 +15511,14 @@ def test_update_azure_node_pool_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AzureClustersRestInterceptor, "post_update_azure_node_pool" ) as post, mock.patch.object( + transports.AzureClustersRestInterceptor, + "post_update_azure_node_pool_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AzureClustersRestInterceptor, "pre_update_azure_node_pool" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = azure_service.UpdateAzureNodePoolRequest.pb( azure_service.UpdateAzureNodePoolRequest() ) @@ -15407,6 +15542,7 @@ def test_update_azure_node_pool_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.update_azure_node_pool( request, @@ -15418,6 +15554,7 @@ def test_update_azure_node_pool_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_azure_node_pool_rest_bad_request( @@ -15520,10 +15657,14 @@ def test_get_azure_node_pool_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AzureClustersRestInterceptor, "post_get_azure_node_pool" ) as post, mock.patch.object( + transports.AzureClustersRestInterceptor, + "post_get_azure_node_pool_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AzureClustersRestInterceptor, "pre_get_azure_node_pool" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = azure_service.GetAzureNodePoolRequest.pb( azure_service.GetAzureNodePoolRequest() ) @@ -15549,6 +15690,7 @@ def test_get_azure_node_pool_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = azure_resources.AzureNodePool() + post_with_metadata.return_value = azure_resources.AzureNodePool(), metadata client.get_azure_node_pool( request, @@ -15560,6 +15702,7 @@ def test_get_azure_node_pool_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_azure_node_pools_rest_bad_request( @@ -15648,10 +15791,14 @@ def test_list_azure_node_pools_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AzureClustersRestInterceptor, "post_list_azure_node_pools" ) as post, mock.patch.object( + transports.AzureClustersRestInterceptor, + "post_list_azure_node_pools_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AzureClustersRestInterceptor, "pre_list_azure_node_pools" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = azure_service.ListAzureNodePoolsRequest.pb( azure_service.ListAzureNodePoolsRequest() ) @@ -15677,6 +15824,10 @@ def test_list_azure_node_pools_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = azure_service.ListAzureNodePoolsResponse() + post_with_metadata.return_value = ( + azure_service.ListAzureNodePoolsResponse(), + metadata, + ) client.list_azure_node_pools( request, @@ -15688,6 +15839,7 @@ def test_list_azure_node_pools_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_azure_node_pool_rest_bad_request( @@ -15772,10 +15924,14 @@ def test_delete_azure_node_pool_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AzureClustersRestInterceptor, "post_delete_azure_node_pool" ) as post, mock.patch.object( + transports.AzureClustersRestInterceptor, + "post_delete_azure_node_pool_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AzureClustersRestInterceptor, "pre_delete_azure_node_pool" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = azure_service.DeleteAzureNodePoolRequest.pb( azure_service.DeleteAzureNodePoolRequest() ) @@ -15799,6 +15955,7 @@ def test_delete_azure_node_pool_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_azure_node_pool( request, @@ -15810,6 +15967,7 @@ def test_delete_azure_node_pool_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_azure_open_id_config_rest_bad_request( @@ -15914,10 +16072,14 @@ def test_get_azure_open_id_config_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AzureClustersRestInterceptor, "post_get_azure_open_id_config" ) as post, mock.patch.object( + transports.AzureClustersRestInterceptor, + "post_get_azure_open_id_config_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AzureClustersRestInterceptor, "pre_get_azure_open_id_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = azure_service.GetAzureOpenIdConfigRequest.pb( azure_service.GetAzureOpenIdConfigRequest() ) @@ -15943,6 +16105,7 @@ def test_get_azure_open_id_config_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = azure_resources.AzureOpenIdConfig() + post_with_metadata.return_value = azure_resources.AzureOpenIdConfig(), metadata client.get_azure_open_id_config( request, @@ -15954,6 +16117,7 @@ def test_get_azure_open_id_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_azure_json_web_keys_rest_bad_request( @@ -16039,10 +16203,14 @@ def test_get_azure_json_web_keys_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AzureClustersRestInterceptor, "post_get_azure_json_web_keys" ) as post, mock.patch.object( + transports.AzureClustersRestInterceptor, + "post_get_azure_json_web_keys_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AzureClustersRestInterceptor, "pre_get_azure_json_web_keys" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = azure_service.GetAzureJsonWebKeysRequest.pb( azure_service.GetAzureJsonWebKeysRequest() ) @@ -16068,6 +16236,7 @@ def test_get_azure_json_web_keys_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = azure_resources.AzureJsonWebKeys() + post_with_metadata.return_value = azure_resources.AzureJsonWebKeys(), metadata client.get_azure_json_web_keys( request, @@ -16079,6 +16248,7 @@ def test_get_azure_json_web_keys_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_azure_server_config_rest_bad_request( @@ -16165,10 +16335,14 @@ def test_get_azure_server_config_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AzureClustersRestInterceptor, "post_get_azure_server_config" ) as post, mock.patch.object( + transports.AzureClustersRestInterceptor, + "post_get_azure_server_config_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AzureClustersRestInterceptor, "pre_get_azure_server_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = azure_service.GetAzureServerConfigRequest.pb( azure_service.GetAzureServerConfigRequest() ) @@ -16194,6 +16368,7 @@ def test_get_azure_server_config_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = azure_resources.AzureServerConfig() + post_with_metadata.return_value = azure_resources.AzureServerConfig(), metadata client.get_azure_server_config( request, @@ -16205,6 +16380,7 @@ def test_get_azure_server_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_cancel_operation_rest_bad_request( diff --git a/packages/google-cloud-gsuiteaddons/google/cloud/gsuiteaddons/gapic_version.py b/packages/google-cloud-gsuiteaddons/google/cloud/gsuiteaddons/gapic_version.py index 0106eadcd8d9..558c8aab67c5 100644 --- a/packages/google-cloud-gsuiteaddons/google/cloud/gsuiteaddons/gapic_version.py +++ b/packages/google-cloud-gsuiteaddons/google/cloud/gsuiteaddons/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.3.14" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-gsuiteaddons/google/cloud/gsuiteaddons_v1/gapic_version.py b/packages/google-cloud-gsuiteaddons/google/cloud/gsuiteaddons_v1/gapic_version.py index 0106eadcd8d9..558c8aab67c5 100644 --- a/packages/google-cloud-gsuiteaddons/google/cloud/gsuiteaddons_v1/gapic_version.py +++ b/packages/google-cloud-gsuiteaddons/google/cloud/gsuiteaddons_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.3.14" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-gsuiteaddons/google/cloud/gsuiteaddons_v1/services/g_suite_add_ons/client.py b/packages/google-cloud-gsuiteaddons/google/cloud/gsuiteaddons_v1/services/g_suite_add_ons/client.py index 612a0ec1acf1..33107560b1c0 100644 --- a/packages/google-cloud-gsuiteaddons/google/cloud/gsuiteaddons_v1/services/g_suite_add_ons/client.py +++ b/packages/google-cloud-gsuiteaddons/google/cloud/gsuiteaddons_v1/services/g_suite_add_ons/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -551,6 +553,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. diff --git a/packages/google-cloud-gsuiteaddons/google/cloud/gsuiteaddons_v1/services/g_suite_add_ons/transports/rest.py b/packages/google-cloud-gsuiteaddons/google/cloud/gsuiteaddons_v1/services/g_suite_add_ons/transports/rest.py index 29a221aa7392..c867e865dc4b 100644 --- a/packages/google-cloud-gsuiteaddons/google/cloud/gsuiteaddons_v1/services/g_suite_add_ons/transports/rest.py +++ b/packages/google-cloud-gsuiteaddons/google/cloud/gsuiteaddons_v1/services/g_suite_add_ons/transports/rest.py @@ -154,12 +154,35 @@ def post_create_deployment( ) -> gsuiteaddons.Deployment: """Post-rpc interceptor for create_deployment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_deployment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GSuiteAddOns server but before - it is returned to user code. + it is returned to user code. This `post_create_deployment` interceptor runs + before the `post_create_deployment_with_metadata` interceptor. """ return response + def post_create_deployment_with_metadata( + self, + response: gsuiteaddons.Deployment, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gsuiteaddons.Deployment, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_deployment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GSuiteAddOns server but before it is returned to user code. + + We recommend only using this `post_create_deployment_with_metadata` + interceptor in new development instead of the `post_create_deployment` interceptor. + When both interceptors are used, this `post_create_deployment_with_metadata` interceptor runs after the + `post_create_deployment` interceptor. The (possibly modified) response returned by + `post_create_deployment` will be passed to + `post_create_deployment_with_metadata`. + """ + return response, metadata + def pre_delete_deployment( self, request: gsuiteaddons.DeleteDeploymentRequest, @@ -193,12 +216,35 @@ def post_get_authorization( ) -> gsuiteaddons.Authorization: """Post-rpc interceptor for get_authorization - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_authorization_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GSuiteAddOns server but before - it is returned to user code. + it is returned to user code. This `post_get_authorization` interceptor runs + before the `post_get_authorization_with_metadata` interceptor. """ return response + def post_get_authorization_with_metadata( + self, + response: gsuiteaddons.Authorization, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gsuiteaddons.Authorization, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_authorization + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GSuiteAddOns server but before it is returned to user code. + + We recommend only using this `post_get_authorization_with_metadata` + interceptor in new development instead of the `post_get_authorization` interceptor. + When both interceptors are used, this `post_get_authorization_with_metadata` interceptor runs after the + `post_get_authorization` interceptor. The (possibly modified) response returned by + `post_get_authorization` will be passed to + `post_get_authorization_with_metadata`. + """ + return response, metadata + def pre_get_deployment( self, request: gsuiteaddons.GetDeploymentRequest, @@ -218,12 +264,35 @@ def post_get_deployment( ) -> gsuiteaddons.Deployment: """Post-rpc interceptor for get_deployment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_deployment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GSuiteAddOns server but before - it is returned to user code. + it is returned to user code. This `post_get_deployment` interceptor runs + before the `post_get_deployment_with_metadata` interceptor. """ return response + def post_get_deployment_with_metadata( + self, + response: gsuiteaddons.Deployment, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gsuiteaddons.Deployment, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_deployment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GSuiteAddOns server but before it is returned to user code. + + We recommend only using this `post_get_deployment_with_metadata` + interceptor in new development instead of the `post_get_deployment` interceptor. + When both interceptors are used, this `post_get_deployment_with_metadata` interceptor runs after the + `post_get_deployment` interceptor. The (possibly modified) response returned by + `post_get_deployment` will be passed to + `post_get_deployment_with_metadata`. + """ + return response, metadata + def pre_get_install_status( self, request: gsuiteaddons.GetInstallStatusRequest, @@ -243,12 +312,35 @@ def post_get_install_status( ) -> gsuiteaddons.InstallStatus: """Post-rpc interceptor for get_install_status - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_install_status_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GSuiteAddOns server but before - it is returned to user code. + it is returned to user code. This `post_get_install_status` interceptor runs + before the `post_get_install_status_with_metadata` interceptor. """ return response + def post_get_install_status_with_metadata( + self, + response: gsuiteaddons.InstallStatus, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gsuiteaddons.InstallStatus, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_install_status + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GSuiteAddOns server but before it is returned to user code. + + We recommend only using this `post_get_install_status_with_metadata` + interceptor in new development instead of the `post_get_install_status` interceptor. + When both interceptors are used, this `post_get_install_status_with_metadata` interceptor runs after the + `post_get_install_status` interceptor. The (possibly modified) response returned by + `post_get_install_status` will be passed to + `post_get_install_status_with_metadata`. + """ + return response, metadata + def pre_install_deployment( self, request: gsuiteaddons.InstallDeploymentRequest, @@ -282,12 +374,37 @@ def post_list_deployments( ) -> gsuiteaddons.ListDeploymentsResponse: """Post-rpc interceptor for list_deployments - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_deployments_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GSuiteAddOns server but before - it is returned to user code. + it is returned to user code. This `post_list_deployments` interceptor runs + before the `post_list_deployments_with_metadata` interceptor. """ return response + def post_list_deployments_with_metadata( + self, + response: gsuiteaddons.ListDeploymentsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + gsuiteaddons.ListDeploymentsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_deployments + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GSuiteAddOns server but before it is returned to user code. + + We recommend only using this `post_list_deployments_with_metadata` + interceptor in new development instead of the `post_list_deployments` interceptor. + When both interceptors are used, this `post_list_deployments_with_metadata` interceptor runs after the + `post_list_deployments` interceptor. The (possibly modified) response returned by + `post_list_deployments` will be passed to + `post_list_deployments_with_metadata`. + """ + return response, metadata + def pre_replace_deployment( self, request: gsuiteaddons.ReplaceDeploymentRequest, @@ -307,12 +424,35 @@ def post_replace_deployment( ) -> gsuiteaddons.Deployment: """Post-rpc interceptor for replace_deployment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_replace_deployment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GSuiteAddOns server but before - it is returned to user code. + it is returned to user code. This `post_replace_deployment` interceptor runs + before the `post_replace_deployment_with_metadata` interceptor. """ return response + def post_replace_deployment_with_metadata( + self, + response: gsuiteaddons.Deployment, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gsuiteaddons.Deployment, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for replace_deployment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GSuiteAddOns server but before it is returned to user code. + + We recommend only using this `post_replace_deployment_with_metadata` + interceptor in new development instead of the `post_replace_deployment` interceptor. + When both interceptors are used, this `post_replace_deployment_with_metadata` interceptor runs after the + `post_replace_deployment` interceptor. The (possibly modified) response returned by + `post_replace_deployment` will be passed to + `post_replace_deployment_with_metadata`. + """ + return response, metadata + def pre_uninstall_deployment( self, request: gsuiteaddons.UninstallDeploymentRequest, @@ -574,6 +714,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_deployment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_deployment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -829,6 +973,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_authorization(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_authorization_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -969,6 +1117,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_deployment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_deployment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1114,6 +1266,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_install_status(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_install_status_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1372,6 +1528,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_deployments(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_deployments_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1523,6 +1683,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_replace_deployment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_replace_deployment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-gsuiteaddons/samples/generated_samples/snippet_metadata_google.cloud.gsuiteaddons.v1.json b/packages/google-cloud-gsuiteaddons/samples/generated_samples/snippet_metadata_google.cloud.gsuiteaddons.v1.json index b79623e23135..714f2ec359ac 100644 --- a/packages/google-cloud-gsuiteaddons/samples/generated_samples/snippet_metadata_google.cloud.gsuiteaddons.v1.json +++ b/packages/google-cloud-gsuiteaddons/samples/generated_samples/snippet_metadata_google.cloud.gsuiteaddons.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-gsuiteaddons", - "version": "0.3.14" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-gsuiteaddons/tests/unit/gapic/gsuiteaddons_v1/test_g_suite_add_ons.py b/packages/google-cloud-gsuiteaddons/tests/unit/gapic/gsuiteaddons_v1/test_g_suite_add_ons.py index 602fcee11d4e..a34a2a9ec487 100644 --- a/packages/google-cloud-gsuiteaddons/tests/unit/gapic/gsuiteaddons_v1/test_g_suite_add_ons.py +++ b/packages/google-cloud-gsuiteaddons/tests/unit/gapic/gsuiteaddons_v1/test_g_suite_add_ons.py @@ -73,6 +73,13 @@ ) from google.cloud.gsuiteaddons_v1.types import gsuiteaddons +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -316,6 +323,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = GSuiteAddOnsClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=["foo"]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + if show_cred_info: + assert error.details == ["foo", CRED_INFO_STRING] + else: + assert error.details == ["foo"] + + +@pytest.mark.parametrize("error_code", [401, 403, 404, 500]) +def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code): + cred = mock.Mock([]) + assert not hasattr(cred, "get_cred_info") + client = GSuiteAddOnsClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -6668,10 +6718,13 @@ def test_get_authorization_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GSuiteAddOnsRestInterceptor, "post_get_authorization" ) as post, mock.patch.object( + transports.GSuiteAddOnsRestInterceptor, "post_get_authorization_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GSuiteAddOnsRestInterceptor, "pre_get_authorization" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = gsuiteaddons.GetAuthorizationRequest.pb( gsuiteaddons.GetAuthorizationRequest() ) @@ -6695,6 +6748,7 @@ def test_get_authorization_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gsuiteaddons.Authorization() + post_with_metadata.return_value = gsuiteaddons.Authorization(), metadata client.get_authorization( request, @@ -6706,6 +6760,7 @@ def test_get_authorization_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_deployment_rest_bad_request( @@ -6960,10 +7015,13 @@ def test_create_deployment_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GSuiteAddOnsRestInterceptor, "post_create_deployment" ) as post, mock.patch.object( + transports.GSuiteAddOnsRestInterceptor, "post_create_deployment_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GSuiteAddOnsRestInterceptor, "pre_create_deployment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = gsuiteaddons.CreateDeploymentRequest.pb( gsuiteaddons.CreateDeploymentRequest() ) @@ -6987,6 +7045,7 @@ def test_create_deployment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gsuiteaddons.Deployment() + post_with_metadata.return_value = gsuiteaddons.Deployment(), metadata client.create_deployment( request, @@ -6998,6 +7057,7 @@ def test_create_deployment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_replace_deployment_rest_bad_request( @@ -7252,10 +7312,13 @@ def test_replace_deployment_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GSuiteAddOnsRestInterceptor, "post_replace_deployment" ) as post, mock.patch.object( + transports.GSuiteAddOnsRestInterceptor, "post_replace_deployment_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GSuiteAddOnsRestInterceptor, "pre_replace_deployment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = gsuiteaddons.ReplaceDeploymentRequest.pb( gsuiteaddons.ReplaceDeploymentRequest() ) @@ -7279,6 +7342,7 @@ def test_replace_deployment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gsuiteaddons.Deployment() + post_with_metadata.return_value = gsuiteaddons.Deployment(), metadata client.replace_deployment( request, @@ -7290,6 +7354,7 @@ def test_replace_deployment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_deployment_rest_bad_request( @@ -7378,10 +7443,13 @@ def test_get_deployment_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GSuiteAddOnsRestInterceptor, "post_get_deployment" ) as post, mock.patch.object( + transports.GSuiteAddOnsRestInterceptor, "post_get_deployment_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GSuiteAddOnsRestInterceptor, "pre_get_deployment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = gsuiteaddons.GetDeploymentRequest.pb( gsuiteaddons.GetDeploymentRequest() ) @@ -7405,6 +7473,7 @@ def test_get_deployment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gsuiteaddons.Deployment() + post_with_metadata.return_value = gsuiteaddons.Deployment(), metadata client.get_deployment( request, @@ -7416,6 +7485,7 @@ def test_get_deployment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_deployments_rest_bad_request( @@ -7500,10 +7570,13 @@ def test_list_deployments_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GSuiteAddOnsRestInterceptor, "post_list_deployments" ) as post, mock.patch.object( + transports.GSuiteAddOnsRestInterceptor, "post_list_deployments_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GSuiteAddOnsRestInterceptor, "pre_list_deployments" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = gsuiteaddons.ListDeploymentsRequest.pb( gsuiteaddons.ListDeploymentsRequest() ) @@ -7529,6 +7602,10 @@ def test_list_deployments_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gsuiteaddons.ListDeploymentsResponse() + post_with_metadata.return_value = ( + gsuiteaddons.ListDeploymentsResponse(), + metadata, + ) client.list_deployments( request, @@ -7540,6 +7617,7 @@ def test_list_deployments_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_deployment_rest_bad_request( @@ -7951,10 +8029,13 @@ def test_get_install_status_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GSuiteAddOnsRestInterceptor, "post_get_install_status" ) as post, mock.patch.object( + transports.GSuiteAddOnsRestInterceptor, "post_get_install_status_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GSuiteAddOnsRestInterceptor, "pre_get_install_status" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = gsuiteaddons.GetInstallStatusRequest.pb( gsuiteaddons.GetInstallStatusRequest() ) @@ -7978,6 +8059,7 @@ def test_get_install_status_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gsuiteaddons.InstallStatus() + post_with_metadata.return_value = gsuiteaddons.InstallStatus(), metadata client.get_install_status( request, @@ -7989,6 +8071,7 @@ def test_get_install_status_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_initialize_client_w_rest(): diff --git a/packages/google-cloud-iam/google/cloud/iam/gapic_version.py b/packages/google-cloud-iam/google/cloud/iam/gapic_version.py index 6053ad2404bf..558c8aab67c5 100644 --- a/packages/google-cloud-iam/google/cloud/iam/gapic_version.py +++ b/packages/google-cloud-iam/google/cloud/iam/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "2.17.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-iam/google/cloud/iam_admin/gapic_version.py b/packages/google-cloud-iam/google/cloud/iam_admin/gapic_version.py index 6053ad2404bf..558c8aab67c5 100644 --- a/packages/google-cloud-iam/google/cloud/iam_admin/gapic_version.py +++ b/packages/google-cloud-iam/google/cloud/iam_admin/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "2.17.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-iam/google/cloud/iam_admin_v1/gapic_version.py b/packages/google-cloud-iam/google/cloud/iam_admin_v1/gapic_version.py index 6053ad2404bf..558c8aab67c5 100644 --- a/packages/google-cloud-iam/google/cloud/iam_admin_v1/gapic_version.py +++ b/packages/google-cloud-iam/google/cloud/iam_admin_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "2.17.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-iam/google/cloud/iam_admin_v1/services/iam/client.py b/packages/google-cloud-iam/google/cloud/iam_admin_v1/services/iam/client.py index 617c345dc559..6920d1686203 100644 --- a/packages/google-cloud-iam/google/cloud/iam_admin_v1/services/iam/client.py +++ b/packages/google-cloud-iam/google/cloud/iam_admin_v1/services/iam/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -534,6 +536,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. diff --git a/packages/google-cloud-iam/google/cloud/iam_credentials/gapic_version.py b/packages/google-cloud-iam/google/cloud/iam_credentials/gapic_version.py index 6053ad2404bf..558c8aab67c5 100644 --- a/packages/google-cloud-iam/google/cloud/iam_credentials/gapic_version.py +++ b/packages/google-cloud-iam/google/cloud/iam_credentials/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "2.17.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-iam/google/cloud/iam_credentials_v1/gapic_version.py b/packages/google-cloud-iam/google/cloud/iam_credentials_v1/gapic_version.py index 6053ad2404bf..558c8aab67c5 100644 --- a/packages/google-cloud-iam/google/cloud/iam_credentials_v1/gapic_version.py +++ b/packages/google-cloud-iam/google/cloud/iam_credentials_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "2.17.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-iam/google/cloud/iam_credentials_v1/services/iam_credentials/client.py b/packages/google-cloud-iam/google/cloud/iam_credentials_v1/services/iam_credentials/client.py index c70e13c42795..316425d6dc73 100644 --- a/packages/google-cloud-iam/google/cloud/iam_credentials_v1/services/iam_credentials/client.py +++ b/packages/google-cloud-iam/google/cloud/iam_credentials_v1/services/iam_credentials/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -494,6 +496,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. diff --git a/packages/google-cloud-iam/google/cloud/iam_credentials_v1/services/iam_credentials/transports/rest.py b/packages/google-cloud-iam/google/cloud/iam_credentials_v1/services/iam_credentials/transports/rest.py index 9747740a6baa..47bcfd38e59d 100644 --- a/packages/google-cloud-iam/google/cloud/iam_credentials_v1/services/iam_credentials/transports/rest.py +++ b/packages/google-cloud-iam/google/cloud/iam_credentials_v1/services/iam_credentials/transports/rest.py @@ -125,12 +125,37 @@ def post_generate_access_token( ) -> common.GenerateAccessTokenResponse: """Post-rpc interceptor for generate_access_token - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_generate_access_token_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the IAMCredentials server but before - it is returned to user code. + it is returned to user code. This `post_generate_access_token` interceptor runs + before the `post_generate_access_token_with_metadata` interceptor. """ return response + def post_generate_access_token_with_metadata( + self, + response: common.GenerateAccessTokenResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + common.GenerateAccessTokenResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for generate_access_token + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the IAMCredentials server but before it is returned to user code. + + We recommend only using this `post_generate_access_token_with_metadata` + interceptor in new development instead of the `post_generate_access_token` interceptor. + When both interceptors are used, this `post_generate_access_token_with_metadata` interceptor runs after the + `post_generate_access_token` interceptor. The (possibly modified) response returned by + `post_generate_access_token` will be passed to + `post_generate_access_token_with_metadata`. + """ + return response, metadata + def pre_generate_id_token( self, request: common.GenerateIdTokenRequest, @@ -148,12 +173,35 @@ def post_generate_id_token( ) -> common.GenerateIdTokenResponse: """Post-rpc interceptor for generate_id_token - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_generate_id_token_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the IAMCredentials server but before - it is returned to user code. + it is returned to user code. This `post_generate_id_token` interceptor runs + before the `post_generate_id_token_with_metadata` interceptor. """ return response + def post_generate_id_token_with_metadata( + self, + response: common.GenerateIdTokenResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[common.GenerateIdTokenResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for generate_id_token + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the IAMCredentials server but before it is returned to user code. + + We recommend only using this `post_generate_id_token_with_metadata` + interceptor in new development instead of the `post_generate_id_token` interceptor. + When both interceptors are used, this `post_generate_id_token_with_metadata` interceptor runs after the + `post_generate_id_token` interceptor. The (possibly modified) response returned by + `post_generate_id_token` will be passed to + `post_generate_id_token_with_metadata`. + """ + return response, metadata + def pre_sign_blob( self, request: common.SignBlobRequest, @@ -171,12 +219,35 @@ def post_sign_blob( ) -> common.SignBlobResponse: """Post-rpc interceptor for sign_blob - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_sign_blob_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the IAMCredentials server but before - it is returned to user code. + it is returned to user code. This `post_sign_blob` interceptor runs + before the `post_sign_blob_with_metadata` interceptor. """ return response + def post_sign_blob_with_metadata( + self, + response: common.SignBlobResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[common.SignBlobResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for sign_blob + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the IAMCredentials server but before it is returned to user code. + + We recommend only using this `post_sign_blob_with_metadata` + interceptor in new development instead of the `post_sign_blob` interceptor. + When both interceptors are used, this `post_sign_blob_with_metadata` interceptor runs after the + `post_sign_blob` interceptor. The (possibly modified) response returned by + `post_sign_blob` will be passed to + `post_sign_blob_with_metadata`. + """ + return response, metadata + def pre_sign_jwt( self, request: common.SignJwtRequest, @@ -192,12 +263,35 @@ def pre_sign_jwt( def post_sign_jwt(self, response: common.SignJwtResponse) -> common.SignJwtResponse: """Post-rpc interceptor for sign_jwt - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_sign_jwt_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the IAMCredentials server but before - it is returned to user code. + it is returned to user code. This `post_sign_jwt` interceptor runs + before the `post_sign_jwt_with_metadata` interceptor. """ return response + def post_sign_jwt_with_metadata( + self, + response: common.SignJwtResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[common.SignJwtResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for sign_jwt + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the IAMCredentials server but before it is returned to user code. + + We recommend only using this `post_sign_jwt_with_metadata` + interceptor in new development instead of the `post_sign_jwt` interceptor. + When both interceptors are used, this `post_sign_jwt_with_metadata` interceptor runs after the + `post_sign_jwt` interceptor. The (possibly modified) response returned by + `post_sign_jwt` will be passed to + `post_sign_jwt_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class IAMCredentialsRestStub: @@ -420,6 +514,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_generate_access_token(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_generate_access_token_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -570,6 +668,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_generate_id_token(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_generate_id_token_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -722,6 +824,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_sign_blob(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_sign_blob_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -872,6 +978,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_sign_jwt(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_sign_jwt_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-iam/google/cloud/iam_v2/gapic_version.py b/packages/google-cloud-iam/google/cloud/iam_v2/gapic_version.py index 6053ad2404bf..558c8aab67c5 100644 --- a/packages/google-cloud-iam/google/cloud/iam_v2/gapic_version.py +++ b/packages/google-cloud-iam/google/cloud/iam_v2/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "2.17.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-iam/google/cloud/iam_v2/services/policies/client.py b/packages/google-cloud-iam/google/cloud/iam_v2/services/policies/client.py index 3fe88405f8c4..11e3af4ab9dc 100644 --- a/packages/google-cloud-iam/google/cloud/iam_v2/services/policies/client.py +++ b/packages/google-cloud-iam/google/cloud/iam_v2/services/policies/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -468,6 +470,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. @@ -1355,16 +1384,20 @@ def get_operation( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-iam/google/cloud/iam_v2/services/policies/transports/rest.py b/packages/google-cloud-iam/google/cloud/iam_v2/services/policies/transports/rest.py index 292a9f3ebc49..ac61f25441ca 100644 --- a/packages/google-cloud-iam/google/cloud/iam_v2/services/policies/transports/rest.py +++ b/packages/google-cloud-iam/google/cloud/iam_v2/services/policies/transports/rest.py @@ -133,12 +133,35 @@ def post_create_policy( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Policies server but before - it is returned to user code. + it is returned to user code. This `post_create_policy` interceptor runs + before the `post_create_policy_with_metadata` interceptor. """ return response + def post_create_policy_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Policies server but before it is returned to user code. + + We recommend only using this `post_create_policy_with_metadata` + interceptor in new development instead of the `post_create_policy` interceptor. + When both interceptors are used, this `post_create_policy_with_metadata` interceptor runs after the + `post_create_policy` interceptor. The (possibly modified) response returned by + `post_create_policy` will be passed to + `post_create_policy_with_metadata`. + """ + return response, metadata + def pre_delete_policy( self, request: policy.DeletePolicyRequest, @@ -156,12 +179,35 @@ def post_delete_policy( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Policies server but before - it is returned to user code. + it is returned to user code. This `post_delete_policy` interceptor runs + before the `post_delete_policy_with_metadata` interceptor. """ return response + def post_delete_policy_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Policies server but before it is returned to user code. + + We recommend only using this `post_delete_policy_with_metadata` + interceptor in new development instead of the `post_delete_policy` interceptor. + When both interceptors are used, this `post_delete_policy_with_metadata` interceptor runs after the + `post_delete_policy` interceptor. The (possibly modified) response returned by + `post_delete_policy` will be passed to + `post_delete_policy_with_metadata`. + """ + return response, metadata + def pre_get_policy( self, request: policy.GetPolicyRequest, @@ -177,12 +223,33 @@ def pre_get_policy( def post_get_policy(self, response: policy.Policy) -> policy.Policy: """Post-rpc interceptor for get_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Policies server but before - it is returned to user code. + it is returned to user code. This `post_get_policy` interceptor runs + before the `post_get_policy_with_metadata` interceptor. """ return response + def post_get_policy_with_metadata( + self, response: policy.Policy, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[policy.Policy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Policies server but before it is returned to user code. + + We recommend only using this `post_get_policy_with_metadata` + interceptor in new development instead of the `post_get_policy` interceptor. + When both interceptors are used, this `post_get_policy_with_metadata` interceptor runs after the + `post_get_policy` interceptor. The (possibly modified) response returned by + `post_get_policy` will be passed to + `post_get_policy_with_metadata`. + """ + return response, metadata + def pre_list_policies( self, request: policy.ListPoliciesRequest, @@ -200,12 +267,35 @@ def post_list_policies( ) -> policy.ListPoliciesResponse: """Post-rpc interceptor for list_policies - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_policies_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Policies server but before - it is returned to user code. + it is returned to user code. This `post_list_policies` interceptor runs + before the `post_list_policies_with_metadata` interceptor. """ return response + def post_list_policies_with_metadata( + self, + response: policy.ListPoliciesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[policy.ListPoliciesResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_policies + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Policies server but before it is returned to user code. + + We recommend only using this `post_list_policies_with_metadata` + interceptor in new development instead of the `post_list_policies` interceptor. + When both interceptors are used, this `post_list_policies_with_metadata` interceptor runs after the + `post_list_policies` interceptor. The (possibly modified) response returned by + `post_list_policies` will be passed to + `post_list_policies_with_metadata`. + """ + return response, metadata + def pre_update_policy( self, request: policy.UpdatePolicyRequest, @@ -223,12 +313,35 @@ def post_update_policy( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Policies server but before - it is returned to user code. + it is returned to user code. This `post_update_policy` interceptor runs + before the `post_update_policy_with_metadata` interceptor. """ return response + def post_update_policy_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Policies server but before it is returned to user code. + + We recommend only using this `post_update_policy_with_metadata` + interceptor in new development instead of the `post_update_policy` interceptor. + When both interceptors are used, this `post_update_policy_with_metadata` interceptor runs after the + `post_update_policy` interceptor. The (possibly modified) response returned by + `post_update_policy` will be passed to + `post_update_policy_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -503,6 +616,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_policy(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_policy_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -646,6 +763,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_policy(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_policy_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -786,6 +907,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_policy(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_policy_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -928,6 +1053,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_policies(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_policies_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1077,6 +1206,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_policy(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_policy_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-iam/google/cloud/iam_v2beta/gapic_version.py b/packages/google-cloud-iam/google/cloud/iam_v2beta/gapic_version.py index 6053ad2404bf..558c8aab67c5 100644 --- a/packages/google-cloud-iam/google/cloud/iam_v2beta/gapic_version.py +++ b/packages/google-cloud-iam/google/cloud/iam_v2beta/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "2.17.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-iam/google/cloud/iam_v2beta/services/policies/client.py b/packages/google-cloud-iam/google/cloud/iam_v2beta/services/policies/client.py index b342263b222e..f7ee3d9fec91 100644 --- a/packages/google-cloud-iam/google/cloud/iam_v2beta/services/policies/client.py +++ b/packages/google-cloud-iam/google/cloud/iam_v2beta/services/policies/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -466,6 +468,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. @@ -1353,16 +1382,20 @@ def get_operation( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-iam/samples/generated_samples/snippet_metadata_google.iam.admin.v1.json b/packages/google-cloud-iam/samples/generated_samples/snippet_metadata_google.iam.admin.v1.json index a3c3f92bcc73..0fa605b91500 100644 --- a/packages/google-cloud-iam/samples/generated_samples/snippet_metadata_google.iam.admin.v1.json +++ b/packages/google-cloud-iam/samples/generated_samples/snippet_metadata_google.iam.admin.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-iam", - "version": "2.17.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-iam/samples/generated_samples/snippet_metadata_google.iam.credentials.v1.json b/packages/google-cloud-iam/samples/generated_samples/snippet_metadata_google.iam.credentials.v1.json index d746b41f0de7..0809777f1998 100644 --- a/packages/google-cloud-iam/samples/generated_samples/snippet_metadata_google.iam.credentials.v1.json +++ b/packages/google-cloud-iam/samples/generated_samples/snippet_metadata_google.iam.credentials.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-iam", - "version": "2.17.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-iam/samples/generated_samples/snippet_metadata_google.iam.v2.json b/packages/google-cloud-iam/samples/generated_samples/snippet_metadata_google.iam.v2.json index 661552fe25d0..5b79ae802abe 100644 --- a/packages/google-cloud-iam/samples/generated_samples/snippet_metadata_google.iam.v2.json +++ b/packages/google-cloud-iam/samples/generated_samples/snippet_metadata_google.iam.v2.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-iam", - "version": "2.17.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-iam/samples/generated_samples/snippet_metadata_google.iam.v2beta.json b/packages/google-cloud-iam/samples/generated_samples/snippet_metadata_google.iam.v2beta.json index a551d8628fec..5b3b08a7e2fc 100644 --- a/packages/google-cloud-iam/samples/generated_samples/snippet_metadata_google.iam.v2beta.json +++ b/packages/google-cloud-iam/samples/generated_samples/snippet_metadata_google.iam.v2beta.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-iam", - "version": "2.17.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-iam/tests/unit/gapic/iam_admin_v1/test_iam.py b/packages/google-cloud-iam/tests/unit/gapic/iam_admin_v1/test_iam.py index 8ca140d38bf8..2c8cd0204536 100644 --- a/packages/google-cloud-iam/tests/unit/gapic/iam_admin_v1/test_iam.py +++ b/packages/google-cloud-iam/tests/unit/gapic/iam_admin_v1/test_iam.py @@ -22,6 +22,7 @@ except ImportError: # pragma: NO COVER import mock +import json import math from google.api_core import api_core_version @@ -61,6 +62,13 @@ ) from google.cloud.iam_admin_v1.types import iam +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -272,6 +280,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = IAMClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=["foo"]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + if show_cred_info: + assert error.details == ["foo", CRED_INFO_STRING] + else: + assert error.details == ["foo"] + + +@pytest.mark.parametrize("error_code", [401, 403, 404, 500]) +def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code): + cred = mock.Mock([]) + assert not hasattr(cred, "get_cred_info") + client = IAMClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ diff --git a/packages/google-cloud-iam/tests/unit/gapic/iam_credentials_v1/test_iam_credentials.py b/packages/google-cloud-iam/tests/unit/gapic/iam_credentials_v1/test_iam_credentials.py index dbf92be1a19e..248dd816df21 100644 --- a/packages/google-cloud-iam/tests/unit/gapic/iam_credentials_v1/test_iam_credentials.py +++ b/packages/google-cloud-iam/tests/unit/gapic/iam_credentials_v1/test_iam_credentials.py @@ -61,6 +61,13 @@ ) from google.cloud.iam_credentials_v1.types import common +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -319,6 +326,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = IAMCredentialsClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=["foo"]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + if show_cred_info: + assert error.details == ["foo", CRED_INFO_STRING] + else: + assert error.details == ["foo"] + + +@pytest.mark.parametrize("error_code", [401, 403, 404, 500]) +def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code): + cred = mock.Mock([]) + assert not hasattr(cred, "get_cred_info") + client = IAMCredentialsClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -3694,10 +3744,14 @@ def test_generate_access_token_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.IAMCredentialsRestInterceptor, "post_generate_access_token" ) as post, mock.patch.object( + transports.IAMCredentialsRestInterceptor, + "post_generate_access_token_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.IAMCredentialsRestInterceptor, "pre_generate_access_token" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = common.GenerateAccessTokenRequest.pb( common.GenerateAccessTokenRequest() ) @@ -3723,6 +3777,7 @@ def test_generate_access_token_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = common.GenerateAccessTokenResponse() + post_with_metadata.return_value = common.GenerateAccessTokenResponse(), metadata client.generate_access_token( request, @@ -3734,6 +3789,7 @@ def test_generate_access_token_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_generate_id_token_rest_bad_request(request_type=common.GenerateIdTokenRequest): @@ -3816,10 +3872,13 @@ def test_generate_id_token_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.IAMCredentialsRestInterceptor, "post_generate_id_token" ) as post, mock.patch.object( + transports.IAMCredentialsRestInterceptor, "post_generate_id_token_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.IAMCredentialsRestInterceptor, "pre_generate_id_token" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = common.GenerateIdTokenRequest.pb(common.GenerateIdTokenRequest()) transcode.return_value = { "method": "post", @@ -3843,6 +3902,7 @@ def test_generate_id_token_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = common.GenerateIdTokenResponse() + post_with_metadata.return_value = common.GenerateIdTokenResponse(), metadata client.generate_id_token( request, @@ -3854,6 +3914,7 @@ def test_generate_id_token_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_sign_blob_rest_bad_request(request_type=common.SignBlobRequest): @@ -3938,10 +3999,13 @@ def test_sign_blob_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.IAMCredentialsRestInterceptor, "post_sign_blob" ) as post, mock.patch.object( + transports.IAMCredentialsRestInterceptor, "post_sign_blob_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.IAMCredentialsRestInterceptor, "pre_sign_blob" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = common.SignBlobRequest.pb(common.SignBlobRequest()) transcode.return_value = { "method": "post", @@ -3963,6 +4027,7 @@ def test_sign_blob_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = common.SignBlobResponse() + post_with_metadata.return_value = common.SignBlobResponse(), metadata client.sign_blob( request, @@ -3974,6 +4039,7 @@ def test_sign_blob_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_sign_jwt_rest_bad_request(request_type=common.SignJwtRequest): @@ -4058,10 +4124,13 @@ def test_sign_jwt_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.IAMCredentialsRestInterceptor, "post_sign_jwt" ) as post, mock.patch.object( + transports.IAMCredentialsRestInterceptor, "post_sign_jwt_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.IAMCredentialsRestInterceptor, "pre_sign_jwt" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = common.SignJwtRequest.pb(common.SignJwtRequest()) transcode.return_value = { "method": "post", @@ -4083,6 +4152,7 @@ def test_sign_jwt_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = common.SignJwtResponse() + post_with_metadata.return_value = common.SignJwtResponse(), metadata client.sign_jwt( request, @@ -4094,6 +4164,7 @@ def test_sign_jwt_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_initialize_client_w_rest(): diff --git a/packages/google-cloud-iam/tests/unit/gapic/iam_v2/test_policies.py b/packages/google-cloud-iam/tests/unit/gapic/iam_v2/test_policies.py index 6e312b1dce02..acc78c820a18 100644 --- a/packages/google-cloud-iam/tests/unit/gapic/iam_v2/test_policies.py +++ b/packages/google-cloud-iam/tests/unit/gapic/iam_v2/test_policies.py @@ -74,6 +74,13 @@ from google.cloud.iam_v2.types import policy from google.cloud.iam_v2.types import policy as gi_policy +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -304,6 +311,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = PoliciesClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=["foo"]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + if show_cred_info: + assert error.details == ["foo", CRED_INFO_STRING] + else: + assert error.details == ["foo"] + + +@pytest.mark.parametrize("error_code", [401, 403, 404, 500]) +def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code): + cred = mock.Mock([]) + assert not hasattr(cred, "get_cred_info") + client = PoliciesClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -4139,10 +4189,13 @@ def test_list_policies_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.PoliciesRestInterceptor, "post_list_policies" ) as post, mock.patch.object( + transports.PoliciesRestInterceptor, "post_list_policies_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.PoliciesRestInterceptor, "pre_list_policies" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = policy.ListPoliciesRequest.pb(policy.ListPoliciesRequest()) transcode.return_value = { "method": "post", @@ -4166,6 +4219,7 @@ def test_list_policies_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = policy.ListPoliciesResponse() + post_with_metadata.return_value = policy.ListPoliciesResponse(), metadata client.list_policies( request, @@ -4177,6 +4231,7 @@ def test_list_policies_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_policy_rest_bad_request(request_type=policy.GetPolicyRequest): @@ -4267,10 +4322,13 @@ def test_get_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.PoliciesRestInterceptor, "post_get_policy" ) as post, mock.patch.object( + transports.PoliciesRestInterceptor, "post_get_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.PoliciesRestInterceptor, "pre_get_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = policy.GetPolicyRequest.pb(policy.GetPolicyRequest()) transcode.return_value = { "method": "post", @@ -4292,6 +4350,7 @@ def test_get_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = policy.Policy() + post_with_metadata.return_value = policy.Policy(), metadata client.get_policy( request, @@ -4303,6 +4362,7 @@ def test_get_policy_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_policy_rest_bad_request(request_type=gi_policy.CreatePolicyRequest): @@ -4487,10 +4547,13 @@ def test_create_policy_rest_interceptors(null_interceptor): ), mock.patch.object( transports.PoliciesRestInterceptor, "post_create_policy" ) as post, mock.patch.object( + transports.PoliciesRestInterceptor, "post_create_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.PoliciesRestInterceptor, "pre_create_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = gi_policy.CreatePolicyRequest.pb(gi_policy.CreatePolicyRequest()) transcode.return_value = { "method": "post", @@ -4512,6 +4575,7 @@ def test_create_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_policy( request, @@ -4523,6 +4587,7 @@ def test_create_policy_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_policy_rest_bad_request(request_type=policy.UpdatePolicyRequest): @@ -4707,10 +4772,13 @@ def test_update_policy_rest_interceptors(null_interceptor): ), mock.patch.object( transports.PoliciesRestInterceptor, "post_update_policy" ) as post, mock.patch.object( + transports.PoliciesRestInterceptor, "post_update_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.PoliciesRestInterceptor, "pre_update_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = policy.UpdatePolicyRequest.pb(policy.UpdatePolicyRequest()) transcode.return_value = { "method": "post", @@ -4732,6 +4800,7 @@ def test_update_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.update_policy( request, @@ -4743,6 +4812,7 @@ def test_update_policy_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_policy_rest_bad_request(request_type=policy.DeletePolicyRequest): @@ -4819,10 +4889,13 @@ def test_delete_policy_rest_interceptors(null_interceptor): ), mock.patch.object( transports.PoliciesRestInterceptor, "post_delete_policy" ) as post, mock.patch.object( + transports.PoliciesRestInterceptor, "post_delete_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.PoliciesRestInterceptor, "pre_delete_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = policy.DeletePolicyRequest.pb(policy.DeletePolicyRequest()) transcode.return_value = { "method": "post", @@ -4844,6 +4917,7 @@ def test_delete_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_policy( request, @@ -4855,6 +4929,7 @@ def test_delete_policy_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_operation_rest_bad_request( diff --git a/packages/google-cloud-iam/tests/unit/gapic/iam_v2beta/test_policies.py b/packages/google-cloud-iam/tests/unit/gapic/iam_v2beta/test_policies.py index b91e4db5e8c3..e0d3c4d46c8b 100644 --- a/packages/google-cloud-iam/tests/unit/gapic/iam_v2beta/test_policies.py +++ b/packages/google-cloud-iam/tests/unit/gapic/iam_v2beta/test_policies.py @@ -22,6 +22,7 @@ except ImportError: # pragma: NO COVER import mock +import json import math from google.api_core import api_core_version @@ -69,6 +70,13 @@ from google.cloud.iam_v2beta.types import policy from google.cloud.iam_v2beta.types import policy as gi_policy +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -299,6 +307,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = PoliciesClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=["foo"]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + if show_cred_info: + assert error.details == ["foo", CRED_INFO_STRING] + else: + assert error.details == ["foo"] + + +@pytest.mark.parametrize("error_code", [401, 403, 404, 500]) +def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code): + cred = mock.Mock([]) + assert not hasattr(cred, "get_cred_info") + client = PoliciesClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ diff --git a/packages/google-cloud-iap/google/cloud/iap/gapic_version.py b/packages/google-cloud-iap/google/cloud/iap/gapic_version.py index cf18a472a8a2..558c8aab67c5 100644 --- a/packages/google-cloud-iap/google/cloud/iap/gapic_version.py +++ b/packages/google-cloud-iap/google/cloud/iap/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.15.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-iap/google/cloud/iap_v1/gapic_version.py b/packages/google-cloud-iap/google/cloud/iap_v1/gapic_version.py index cf18a472a8a2..558c8aab67c5 100644 --- a/packages/google-cloud-iap/google/cloud/iap_v1/gapic_version.py +++ b/packages/google-cloud-iap/google/cloud/iap_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.15.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-iap/google/cloud/iap_v1/services/identity_aware_proxy_admin_service/client.py b/packages/google-cloud-iap/google/cloud/iap_v1/services/identity_aware_proxy_admin_service/client.py index afd98d1ab4ab..411192f82c19 100644 --- a/packages/google-cloud-iap/google/cloud/iap_v1/services/identity_aware_proxy_admin_service/client.py +++ b/packages/google-cloud-iap/google/cloud/iap_v1/services/identity_aware_proxy_admin_service/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -516,6 +518,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. diff --git a/packages/google-cloud-iap/google/cloud/iap_v1/services/identity_aware_proxy_admin_service/transports/rest.py b/packages/google-cloud-iap/google/cloud/iap_v1/services/identity_aware_proxy_admin_service/transports/rest.py index 1657cd0ab0d0..4b12c9b0318b 100644 --- a/packages/google-cloud-iap/google/cloud/iap_v1/services/identity_aware_proxy_admin_service/transports/rest.py +++ b/packages/google-cloud-iap/google/cloud/iap_v1/services/identity_aware_proxy_admin_service/transports/rest.py @@ -172,12 +172,35 @@ def post_create_tunnel_dest_group( ) -> service.TunnelDestGroup: """Post-rpc interceptor for create_tunnel_dest_group - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_tunnel_dest_group_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the IdentityAwareProxyAdminService server but before - it is returned to user code. + it is returned to user code. This `post_create_tunnel_dest_group` interceptor runs + before the `post_create_tunnel_dest_group_with_metadata` interceptor. """ return response + def post_create_tunnel_dest_group_with_metadata( + self, + response: service.TunnelDestGroup, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.TunnelDestGroup, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_tunnel_dest_group + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the IdentityAwareProxyAdminService server but before it is returned to user code. + + We recommend only using this `post_create_tunnel_dest_group_with_metadata` + interceptor in new development instead of the `post_create_tunnel_dest_group` interceptor. + When both interceptors are used, this `post_create_tunnel_dest_group_with_metadata` interceptor runs after the + `post_create_tunnel_dest_group` interceptor. The (possibly modified) response returned by + `post_create_tunnel_dest_group` will be passed to + `post_create_tunnel_dest_group_with_metadata`. + """ + return response, metadata + def pre_delete_tunnel_dest_group( self, request: service.DeleteTunnelDestGroupRequest, @@ -209,12 +232,35 @@ def pre_get_iam_policy( def post_get_iam_policy(self, response: policy_pb2.Policy) -> policy_pb2.Policy: """Post-rpc interceptor for get_iam_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_iam_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the IdentityAwareProxyAdminService server but before - it is returned to user code. + it is returned to user code. This `post_get_iam_policy` interceptor runs + before the `post_get_iam_policy_with_metadata` interceptor. """ return response + def post_get_iam_policy_with_metadata( + self, + response: policy_pb2.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[policy_pb2.Policy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_iam_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the IdentityAwareProxyAdminService server but before it is returned to user code. + + We recommend only using this `post_get_iam_policy_with_metadata` + interceptor in new development instead of the `post_get_iam_policy` interceptor. + When both interceptors are used, this `post_get_iam_policy_with_metadata` interceptor runs after the + `post_get_iam_policy` interceptor. The (possibly modified) response returned by + `post_get_iam_policy` will be passed to + `post_get_iam_policy_with_metadata`. + """ + return response, metadata + def pre_get_iap_settings( self, request: service.GetIapSettingsRequest, @@ -232,12 +278,35 @@ def post_get_iap_settings( ) -> service.IapSettings: """Post-rpc interceptor for get_iap_settings - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_iap_settings_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the IdentityAwareProxyAdminService server but before - it is returned to user code. + it is returned to user code. This `post_get_iap_settings` interceptor runs + before the `post_get_iap_settings_with_metadata` interceptor. """ return response + def post_get_iap_settings_with_metadata( + self, + response: service.IapSettings, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.IapSettings, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_iap_settings + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the IdentityAwareProxyAdminService server but before it is returned to user code. + + We recommend only using this `post_get_iap_settings_with_metadata` + interceptor in new development instead of the `post_get_iap_settings` interceptor. + When both interceptors are used, this `post_get_iap_settings_with_metadata` interceptor runs after the + `post_get_iap_settings` interceptor. The (possibly modified) response returned by + `post_get_iap_settings` will be passed to + `post_get_iap_settings_with_metadata`. + """ + return response, metadata + def pre_get_tunnel_dest_group( self, request: service.GetTunnelDestGroupRequest, @@ -257,12 +326,35 @@ def post_get_tunnel_dest_group( ) -> service.TunnelDestGroup: """Post-rpc interceptor for get_tunnel_dest_group - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_tunnel_dest_group_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the IdentityAwareProxyAdminService server but before - it is returned to user code. + it is returned to user code. This `post_get_tunnel_dest_group` interceptor runs + before the `post_get_tunnel_dest_group_with_metadata` interceptor. """ return response + def post_get_tunnel_dest_group_with_metadata( + self, + response: service.TunnelDestGroup, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.TunnelDestGroup, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_tunnel_dest_group + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the IdentityAwareProxyAdminService server but before it is returned to user code. + + We recommend only using this `post_get_tunnel_dest_group_with_metadata` + interceptor in new development instead of the `post_get_tunnel_dest_group` interceptor. + When both interceptors are used, this `post_get_tunnel_dest_group_with_metadata` interceptor runs after the + `post_get_tunnel_dest_group` interceptor. The (possibly modified) response returned by + `post_get_tunnel_dest_group` will be passed to + `post_get_tunnel_dest_group_with_metadata`. + """ + return response, metadata + def pre_list_tunnel_dest_groups( self, request: service.ListTunnelDestGroupsRequest, @@ -282,12 +374,37 @@ def post_list_tunnel_dest_groups( ) -> service.ListTunnelDestGroupsResponse: """Post-rpc interceptor for list_tunnel_dest_groups - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_tunnel_dest_groups_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the IdentityAwareProxyAdminService server but before - it is returned to user code. + it is returned to user code. This `post_list_tunnel_dest_groups` interceptor runs + before the `post_list_tunnel_dest_groups_with_metadata` interceptor. """ return response + def post_list_tunnel_dest_groups_with_metadata( + self, + response: service.ListTunnelDestGroupsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service.ListTunnelDestGroupsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_tunnel_dest_groups + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the IdentityAwareProxyAdminService server but before it is returned to user code. + + We recommend only using this `post_list_tunnel_dest_groups_with_metadata` + interceptor in new development instead of the `post_list_tunnel_dest_groups` interceptor. + When both interceptors are used, this `post_list_tunnel_dest_groups_with_metadata` interceptor runs after the + `post_list_tunnel_dest_groups` interceptor. The (possibly modified) response returned by + `post_list_tunnel_dest_groups` will be passed to + `post_list_tunnel_dest_groups_with_metadata`. + """ + return response, metadata + def pre_set_iam_policy( self, request: iam_policy_pb2.SetIamPolicyRequest, @@ -305,12 +422,35 @@ def pre_set_iam_policy( def post_set_iam_policy(self, response: policy_pb2.Policy) -> policy_pb2.Policy: """Post-rpc interceptor for set_iam_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_iam_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the IdentityAwareProxyAdminService server but before - it is returned to user code. + it is returned to user code. This `post_set_iam_policy` interceptor runs + before the `post_set_iam_policy_with_metadata` interceptor. """ return response + def post_set_iam_policy_with_metadata( + self, + response: policy_pb2.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[policy_pb2.Policy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_iam_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the IdentityAwareProxyAdminService server but before it is returned to user code. + + We recommend only using this `post_set_iam_policy_with_metadata` + interceptor in new development instead of the `post_set_iam_policy` interceptor. + When both interceptors are used, this `post_set_iam_policy_with_metadata` interceptor runs after the + `post_set_iam_policy` interceptor. The (possibly modified) response returned by + `post_set_iam_policy` will be passed to + `post_set_iam_policy_with_metadata`. + """ + return response, metadata + def pre_test_iam_permissions( self, request: iam_policy_pb2.TestIamPermissionsRequest, @@ -331,12 +471,38 @@ def post_test_iam_permissions( ) -> iam_policy_pb2.TestIamPermissionsResponse: """Post-rpc interceptor for test_iam_permissions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_test_iam_permissions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the IdentityAwareProxyAdminService server but before - it is returned to user code. + it is returned to user code. This `post_test_iam_permissions` interceptor runs + before the `post_test_iam_permissions_with_metadata` interceptor. """ return response + def post_test_iam_permissions_with_metadata( + self, + response: iam_policy_pb2.TestIamPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + iam_policy_pb2.TestIamPermissionsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for test_iam_permissions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the IdentityAwareProxyAdminService server but before it is returned to user code. + + We recommend only using this `post_test_iam_permissions_with_metadata` + interceptor in new development instead of the `post_test_iam_permissions` interceptor. + When both interceptors are used, this `post_test_iam_permissions_with_metadata` interceptor runs after the + `post_test_iam_permissions` interceptor. The (possibly modified) response returned by + `post_test_iam_permissions` will be passed to + `post_test_iam_permissions_with_metadata`. + """ + return response, metadata + def pre_update_iap_settings( self, request: service.UpdateIapSettingsRequest, @@ -356,12 +522,35 @@ def post_update_iap_settings( ) -> service.IapSettings: """Post-rpc interceptor for update_iap_settings - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_iap_settings_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the IdentityAwareProxyAdminService server but before - it is returned to user code. + it is returned to user code. This `post_update_iap_settings` interceptor runs + before the `post_update_iap_settings_with_metadata` interceptor. """ return response + def post_update_iap_settings_with_metadata( + self, + response: service.IapSettings, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.IapSettings, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_iap_settings + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the IdentityAwareProxyAdminService server but before it is returned to user code. + + We recommend only using this `post_update_iap_settings_with_metadata` + interceptor in new development instead of the `post_update_iap_settings` interceptor. + When both interceptors are used, this `post_update_iap_settings_with_metadata` interceptor runs after the + `post_update_iap_settings` interceptor. The (possibly modified) response returned by + `post_update_iap_settings` will be passed to + `post_update_iap_settings_with_metadata`. + """ + return response, metadata + def pre_update_tunnel_dest_group( self, request: service.UpdateTunnelDestGroupRequest, @@ -381,12 +570,35 @@ def post_update_tunnel_dest_group( ) -> service.TunnelDestGroup: """Post-rpc interceptor for update_tunnel_dest_group - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_tunnel_dest_group_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the IdentityAwareProxyAdminService server but before - it is returned to user code. + it is returned to user code. This `post_update_tunnel_dest_group` interceptor runs + before the `post_update_tunnel_dest_group_with_metadata` interceptor. """ return response + def post_update_tunnel_dest_group_with_metadata( + self, + response: service.TunnelDestGroup, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.TunnelDestGroup, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_tunnel_dest_group + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the IdentityAwareProxyAdminService server but before it is returned to user code. + + We recommend only using this `post_update_tunnel_dest_group_with_metadata` + interceptor in new development instead of the `post_update_tunnel_dest_group` interceptor. + When both interceptors are used, this `post_update_tunnel_dest_group_with_metadata` interceptor runs after the + `post_update_tunnel_dest_group` interceptor. The (possibly modified) response returned by + `post_update_tunnel_dest_group` will be passed to + `post_update_tunnel_dest_group_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class IdentityAwareProxyAdminServiceRestStub: @@ -606,6 +818,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_tunnel_dest_group(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_tunnel_dest_group_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -941,6 +1157,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_iam_policy(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_iam_policy_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1084,6 +1304,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_iap_settings(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_iap_settings_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1229,6 +1453,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_tunnel_dest_group(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_tunnel_dest_group_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1376,6 +1604,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_tunnel_dest_groups(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_tunnel_dest_groups_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1602,6 +1834,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_iam_policy(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_iam_policy_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1753,6 +1989,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_test_iam_permissions(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_test_iam_permissions_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1903,6 +2143,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_iap_settings(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_iap_settings_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2054,6 +2298,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_tunnel_dest_group(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_tunnel_dest_group_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-iap/google/cloud/iap_v1/services/identity_aware_proxy_o_auth_service/client.py b/packages/google-cloud-iap/google/cloud/iap_v1/services/identity_aware_proxy_o_auth_service/client.py index b9462790468c..1877c163c5fd 100644 --- a/packages/google-cloud-iap/google/cloud/iap_v1/services/identity_aware_proxy_o_auth_service/client.py +++ b/packages/google-cloud-iap/google/cloud/iap_v1/services/identity_aware_proxy_o_auth_service/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -474,6 +476,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. diff --git a/packages/google-cloud-iap/google/cloud/iap_v1/services/identity_aware_proxy_o_auth_service/transports/rest.py b/packages/google-cloud-iap/google/cloud/iap_v1/services/identity_aware_proxy_o_auth_service/transports/rest.py index 3e2aac7d0528..9b2552545d1f 100644 --- a/packages/google-cloud-iap/google/cloud/iap_v1/services/identity_aware_proxy_o_auth_service/transports/rest.py +++ b/packages/google-cloud-iap/google/cloud/iap_v1/services/identity_aware_proxy_o_auth_service/transports/rest.py @@ -150,12 +150,33 @@ def pre_create_brand( def post_create_brand(self, response: service.Brand) -> service.Brand: """Post-rpc interceptor for create_brand - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_brand_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the IdentityAwareProxyOAuthService server but before - it is returned to user code. + it is returned to user code. This `post_create_brand` interceptor runs + before the `post_create_brand_with_metadata` interceptor. """ return response + def post_create_brand_with_metadata( + self, response: service.Brand, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[service.Brand, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_brand + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the IdentityAwareProxyOAuthService server but before it is returned to user code. + + We recommend only using this `post_create_brand_with_metadata` + interceptor in new development instead of the `post_create_brand` interceptor. + When both interceptors are used, this `post_create_brand_with_metadata` interceptor runs after the + `post_create_brand` interceptor. The (possibly modified) response returned by + `post_create_brand` will be passed to + `post_create_brand_with_metadata`. + """ + return response, metadata + def pre_create_identity_aware_proxy_client( self, request: service.CreateIdentityAwareProxyClientRequest, @@ -176,12 +197,37 @@ def post_create_identity_aware_proxy_client( ) -> service.IdentityAwareProxyClient: """Post-rpc interceptor for create_identity_aware_proxy_client - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_identity_aware_proxy_client_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the IdentityAwareProxyOAuthService server but before - it is returned to user code. + it is returned to user code. This `post_create_identity_aware_proxy_client` interceptor runs + before the `post_create_identity_aware_proxy_client_with_metadata` interceptor. """ return response + def post_create_identity_aware_proxy_client_with_metadata( + self, + response: service.IdentityAwareProxyClient, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service.IdentityAwareProxyClient, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for create_identity_aware_proxy_client + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the IdentityAwareProxyOAuthService server but before it is returned to user code. + + We recommend only using this `post_create_identity_aware_proxy_client_with_metadata` + interceptor in new development instead of the `post_create_identity_aware_proxy_client` interceptor. + When both interceptors are used, this `post_create_identity_aware_proxy_client_with_metadata` interceptor runs after the + `post_create_identity_aware_proxy_client` interceptor. The (possibly modified) response returned by + `post_create_identity_aware_proxy_client` will be passed to + `post_create_identity_aware_proxy_client_with_metadata`. + """ + return response, metadata + def pre_delete_identity_aware_proxy_client( self, request: service.DeleteIdentityAwareProxyClientRequest, @@ -212,12 +258,33 @@ def pre_get_brand( def post_get_brand(self, response: service.Brand) -> service.Brand: """Post-rpc interceptor for get_brand - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_brand_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the IdentityAwareProxyOAuthService server but before - it is returned to user code. + it is returned to user code. This `post_get_brand` interceptor runs + before the `post_get_brand_with_metadata` interceptor. """ return response + def post_get_brand_with_metadata( + self, response: service.Brand, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[service.Brand, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_brand + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the IdentityAwareProxyOAuthService server but before it is returned to user code. + + We recommend only using this `post_get_brand_with_metadata` + interceptor in new development instead of the `post_get_brand` interceptor. + When both interceptors are used, this `post_get_brand_with_metadata` interceptor runs after the + `post_get_brand` interceptor. The (possibly modified) response returned by + `post_get_brand` will be passed to + `post_get_brand_with_metadata`. + """ + return response, metadata + def pre_get_identity_aware_proxy_client( self, request: service.GetIdentityAwareProxyClientRequest, @@ -238,12 +305,37 @@ def post_get_identity_aware_proxy_client( ) -> service.IdentityAwareProxyClient: """Post-rpc interceptor for get_identity_aware_proxy_client - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_identity_aware_proxy_client_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the IdentityAwareProxyOAuthService server but before - it is returned to user code. + it is returned to user code. This `post_get_identity_aware_proxy_client` interceptor runs + before the `post_get_identity_aware_proxy_client_with_metadata` interceptor. """ return response + def post_get_identity_aware_proxy_client_with_metadata( + self, + response: service.IdentityAwareProxyClient, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service.IdentityAwareProxyClient, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_identity_aware_proxy_client + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the IdentityAwareProxyOAuthService server but before it is returned to user code. + + We recommend only using this `post_get_identity_aware_proxy_client_with_metadata` + interceptor in new development instead of the `post_get_identity_aware_proxy_client` interceptor. + When both interceptors are used, this `post_get_identity_aware_proxy_client_with_metadata` interceptor runs after the + `post_get_identity_aware_proxy_client` interceptor. The (possibly modified) response returned by + `post_get_identity_aware_proxy_client` will be passed to + `post_get_identity_aware_proxy_client_with_metadata`. + """ + return response, metadata + def pre_list_brands( self, request: service.ListBrandsRequest, @@ -261,12 +353,35 @@ def post_list_brands( ) -> service.ListBrandsResponse: """Post-rpc interceptor for list_brands - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_brands_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the IdentityAwareProxyOAuthService server but before - it is returned to user code. + it is returned to user code. This `post_list_brands` interceptor runs + before the `post_list_brands_with_metadata` interceptor. """ return response + def post_list_brands_with_metadata( + self, + response: service.ListBrandsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.ListBrandsResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_brands + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the IdentityAwareProxyOAuthService server but before it is returned to user code. + + We recommend only using this `post_list_brands_with_metadata` + interceptor in new development instead of the `post_list_brands` interceptor. + When both interceptors are used, this `post_list_brands_with_metadata` interceptor runs after the + `post_list_brands` interceptor. The (possibly modified) response returned by + `post_list_brands` will be passed to + `post_list_brands_with_metadata`. + """ + return response, metadata + def pre_list_identity_aware_proxy_clients( self, request: service.ListIdentityAwareProxyClientsRequest, @@ -287,12 +402,38 @@ def post_list_identity_aware_proxy_clients( ) -> service.ListIdentityAwareProxyClientsResponse: """Post-rpc interceptor for list_identity_aware_proxy_clients - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_identity_aware_proxy_clients_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the IdentityAwareProxyOAuthService server but before - it is returned to user code. + it is returned to user code. This `post_list_identity_aware_proxy_clients` interceptor runs + before the `post_list_identity_aware_proxy_clients_with_metadata` interceptor. """ return response + def post_list_identity_aware_proxy_clients_with_metadata( + self, + response: service.ListIdentityAwareProxyClientsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service.ListIdentityAwareProxyClientsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_identity_aware_proxy_clients + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the IdentityAwareProxyOAuthService server but before it is returned to user code. + + We recommend only using this `post_list_identity_aware_proxy_clients_with_metadata` + interceptor in new development instead of the `post_list_identity_aware_proxy_clients` interceptor. + When both interceptors are used, this `post_list_identity_aware_proxy_clients_with_metadata` interceptor runs after the + `post_list_identity_aware_proxy_clients` interceptor. The (possibly modified) response returned by + `post_list_identity_aware_proxy_clients` will be passed to + `post_list_identity_aware_proxy_clients_with_metadata`. + """ + return response, metadata + def pre_reset_identity_aware_proxy_client_secret( self, request: service.ResetIdentityAwareProxyClientSecretRequest, @@ -313,12 +454,37 @@ def post_reset_identity_aware_proxy_client_secret( ) -> service.IdentityAwareProxyClient: """Post-rpc interceptor for reset_identity_aware_proxy_client_secret - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_reset_identity_aware_proxy_client_secret_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the IdentityAwareProxyOAuthService server but before - it is returned to user code. + it is returned to user code. This `post_reset_identity_aware_proxy_client_secret` interceptor runs + before the `post_reset_identity_aware_proxy_client_secret_with_metadata` interceptor. """ return response + def post_reset_identity_aware_proxy_client_secret_with_metadata( + self, + response: service.IdentityAwareProxyClient, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service.IdentityAwareProxyClient, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for reset_identity_aware_proxy_client_secret + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the IdentityAwareProxyOAuthService server but before it is returned to user code. + + We recommend only using this `post_reset_identity_aware_proxy_client_secret_with_metadata` + interceptor in new development instead of the `post_reset_identity_aware_proxy_client_secret` interceptor. + When both interceptors are used, this `post_reset_identity_aware_proxy_client_secret_with_metadata` interceptor runs after the + `post_reset_identity_aware_proxy_client_secret` interceptor. The (possibly modified) response returned by + `post_reset_identity_aware_proxy_client_secret` will be passed to + `post_reset_identity_aware_proxy_client_secret_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class IdentityAwareProxyOAuthServiceRestStub: @@ -541,6 +707,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_brand(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_brand_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -699,6 +869,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_identity_aware_proxy_client(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_create_identity_aware_proxy_client_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -963,6 +1140,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_brand(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_brand_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1112,6 +1293,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_identity_aware_proxy_client(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_get_identity_aware_proxy_client_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1257,6 +1445,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_brands(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_brands_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1406,6 +1598,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_identity_aware_proxy_clients(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_list_identity_aware_proxy_clients_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1566,6 +1765,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_reset_identity_aware_proxy_client_secret(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_reset_identity_aware_proxy_client_secret_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-iap/samples/generated_samples/snippet_metadata_google.cloud.iap.v1.json b/packages/google-cloud-iap/samples/generated_samples/snippet_metadata_google.cloud.iap.v1.json index b2206e8f39fd..e4e6134926e0 100644 --- a/packages/google-cloud-iap/samples/generated_samples/snippet_metadata_google.cloud.iap.v1.json +++ b/packages/google-cloud-iap/samples/generated_samples/snippet_metadata_google.cloud.iap.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-iap", - "version": "1.15.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-iap/tests/unit/gapic/iap_v1/test_identity_aware_proxy_admin_service.py b/packages/google-cloud-iap/tests/unit/gapic/iap_v1/test_identity_aware_proxy_admin_service.py index 1e4992bcf69d..4a9d126d0990 100644 --- a/packages/google-cloud-iap/tests/unit/gapic/iap_v1/test_identity_aware_proxy_admin_service.py +++ b/packages/google-cloud-iap/tests/unit/gapic/iap_v1/test_identity_aware_proxy_admin_service.py @@ -67,6 +67,13 @@ ) from google.cloud.iap_v1.types import service +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -357,6 +364,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = IdentityAwareProxyAdminServiceClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=["foo"]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + if show_cred_info: + assert error.details == ["foo", CRED_INFO_STRING] + else: + assert error.details == ["foo"] + + +@pytest.mark.parametrize("error_code", [401, 403, 404, 500]) +def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code): + cred = mock.Mock([]) + assert not hasattr(cred, "get_cred_info") + client = IdentityAwareProxyAdminServiceClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -6768,10 +6818,14 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.IdentityAwareProxyAdminServiceRestInterceptor, "post_set_iam_policy" ) as post, mock.patch.object( + transports.IdentityAwareProxyAdminServiceRestInterceptor, + "post_set_iam_policy_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.IdentityAwareProxyAdminServiceRestInterceptor, "pre_set_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.SetIamPolicyRequest() transcode.return_value = { "method": "post", @@ -6793,6 +6847,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = policy_pb2.Policy() + post_with_metadata.return_value = policy_pb2.Policy(), metadata client.set_iam_policy( request, @@ -6804,6 +6859,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_iam_policy_rest_bad_request( @@ -6887,10 +6943,14 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.IdentityAwareProxyAdminServiceRestInterceptor, "post_get_iam_policy" ) as post, mock.patch.object( + transports.IdentityAwareProxyAdminServiceRestInterceptor, + "post_get_iam_policy_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.IdentityAwareProxyAdminServiceRestInterceptor, "pre_get_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.GetIamPolicyRequest() transcode.return_value = { "method": "post", @@ -6912,6 +6972,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = policy_pb2.Policy() + post_with_metadata.return_value = policy_pb2.Policy(), metadata client.get_iam_policy( request, @@ -6923,6 +6984,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_test_iam_permissions_rest_bad_request( @@ -7005,11 +7067,15 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): transports.IdentityAwareProxyAdminServiceRestInterceptor, "post_test_iam_permissions", ) as post, mock.patch.object( + transports.IdentityAwareProxyAdminServiceRestInterceptor, + "post_test_iam_permissions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.IdentityAwareProxyAdminServiceRestInterceptor, "pre_test_iam_permissions", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.TestIamPermissionsRequest() transcode.return_value = { "method": "post", @@ -7033,6 +7099,10 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = iam_policy_pb2.TestIamPermissionsResponse() + post_with_metadata.return_value = ( + iam_policy_pb2.TestIamPermissionsResponse(), + metadata, + ) client.test_iam_permissions( request, @@ -7044,6 +7114,7 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_iap_settings_rest_bad_request(request_type=service.GetIapSettingsRequest): @@ -7127,10 +7198,14 @@ def test_get_iap_settings_rest_interceptors(null_interceptor): transports.IdentityAwareProxyAdminServiceRestInterceptor, "post_get_iap_settings", ) as post, mock.patch.object( + transports.IdentityAwareProxyAdminServiceRestInterceptor, + "post_get_iap_settings_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.IdentityAwareProxyAdminServiceRestInterceptor, "pre_get_iap_settings" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetIapSettingsRequest.pb(service.GetIapSettingsRequest()) transcode.return_value = { "method": "post", @@ -7152,6 +7227,7 @@ def test_get_iap_settings_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.IapSettings() + post_with_metadata.return_value = service.IapSettings(), metadata client.get_iap_settings( request, @@ -7163,6 +7239,7 @@ def test_get_iap_settings_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_iap_settings_rest_bad_request( @@ -7355,11 +7432,15 @@ def test_update_iap_settings_rest_interceptors(null_interceptor): transports.IdentityAwareProxyAdminServiceRestInterceptor, "post_update_iap_settings", ) as post, mock.patch.object( + transports.IdentityAwareProxyAdminServiceRestInterceptor, + "post_update_iap_settings_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.IdentityAwareProxyAdminServiceRestInterceptor, "pre_update_iap_settings", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.UpdateIapSettingsRequest.pb( service.UpdateIapSettingsRequest() ) @@ -7383,6 +7464,7 @@ def test_update_iap_settings_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.IapSettings() + post_with_metadata.return_value = service.IapSettings(), metadata client.update_iap_settings( request, @@ -7394,6 +7476,7 @@ def test_update_iap_settings_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_tunnel_dest_groups_rest_bad_request( @@ -7479,11 +7562,15 @@ def test_list_tunnel_dest_groups_rest_interceptors(null_interceptor): transports.IdentityAwareProxyAdminServiceRestInterceptor, "post_list_tunnel_dest_groups", ) as post, mock.patch.object( + transports.IdentityAwareProxyAdminServiceRestInterceptor, + "post_list_tunnel_dest_groups_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.IdentityAwareProxyAdminServiceRestInterceptor, "pre_list_tunnel_dest_groups", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListTunnelDestGroupsRequest.pb( service.ListTunnelDestGroupsRequest() ) @@ -7509,6 +7596,10 @@ def test_list_tunnel_dest_groups_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListTunnelDestGroupsResponse() + post_with_metadata.return_value = ( + service.ListTunnelDestGroupsResponse(), + metadata, + ) client.list_tunnel_dest_groups( request, @@ -7520,6 +7611,7 @@ def test_list_tunnel_dest_groups_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_tunnel_dest_group_rest_bad_request( @@ -7681,11 +7773,15 @@ def test_create_tunnel_dest_group_rest_interceptors(null_interceptor): transports.IdentityAwareProxyAdminServiceRestInterceptor, "post_create_tunnel_dest_group", ) as post, mock.patch.object( + transports.IdentityAwareProxyAdminServiceRestInterceptor, + "post_create_tunnel_dest_group_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.IdentityAwareProxyAdminServiceRestInterceptor, "pre_create_tunnel_dest_group", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateTunnelDestGroupRequest.pb( service.CreateTunnelDestGroupRequest() ) @@ -7709,6 +7805,7 @@ def test_create_tunnel_dest_group_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.TunnelDestGroup() + post_with_metadata.return_value = service.TunnelDestGroup(), metadata client.create_tunnel_dest_group( request, @@ -7720,6 +7817,7 @@ def test_create_tunnel_dest_group_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_tunnel_dest_group_rest_bad_request( @@ -7813,11 +7911,15 @@ def test_get_tunnel_dest_group_rest_interceptors(null_interceptor): transports.IdentityAwareProxyAdminServiceRestInterceptor, "post_get_tunnel_dest_group", ) as post, mock.patch.object( + transports.IdentityAwareProxyAdminServiceRestInterceptor, + "post_get_tunnel_dest_group_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.IdentityAwareProxyAdminServiceRestInterceptor, "pre_get_tunnel_dest_group", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetTunnelDestGroupRequest.pb( service.GetTunnelDestGroupRequest() ) @@ -7841,6 +7943,7 @@ def test_get_tunnel_dest_group_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.TunnelDestGroup() + post_with_metadata.return_value = service.TunnelDestGroup(), metadata client.get_tunnel_dest_group( request, @@ -7852,6 +7955,7 @@ def test_get_tunnel_dest_group_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_tunnel_dest_group_rest_bad_request( @@ -8135,11 +8239,15 @@ def test_update_tunnel_dest_group_rest_interceptors(null_interceptor): transports.IdentityAwareProxyAdminServiceRestInterceptor, "post_update_tunnel_dest_group", ) as post, mock.patch.object( + transports.IdentityAwareProxyAdminServiceRestInterceptor, + "post_update_tunnel_dest_group_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.IdentityAwareProxyAdminServiceRestInterceptor, "pre_update_tunnel_dest_group", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.UpdateTunnelDestGroupRequest.pb( service.UpdateTunnelDestGroupRequest() ) @@ -8163,6 +8271,7 @@ def test_update_tunnel_dest_group_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.TunnelDestGroup() + post_with_metadata.return_value = service.TunnelDestGroup(), metadata client.update_tunnel_dest_group( request, @@ -8174,6 +8283,7 @@ def test_update_tunnel_dest_group_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_initialize_client_w_rest(): diff --git a/packages/google-cloud-iap/tests/unit/gapic/iap_v1/test_identity_aware_proxy_o_auth_service.py b/packages/google-cloud-iap/tests/unit/gapic/iap_v1/test_identity_aware_proxy_o_auth_service.py index 6f795a66c6b9..41220715c7f0 100644 --- a/packages/google-cloud-iap/tests/unit/gapic/iap_v1/test_identity_aware_proxy_o_auth_service.py +++ b/packages/google-cloud-iap/tests/unit/gapic/iap_v1/test_identity_aware_proxy_o_auth_service.py @@ -60,6 +60,13 @@ ) from google.cloud.iap_v1.types import service +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -350,6 +357,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = IdentityAwareProxyOAuthServiceClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=["foo"]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + if show_cred_info: + assert error.details == ["foo", CRED_INFO_STRING] + else: + assert error.details == ["foo"] + + +@pytest.mark.parametrize("error_code", [401, 403, 404, 500]) +def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code): + cred = mock.Mock([]) + assert not hasattr(cred, "get_cred_info") + client = IdentityAwareProxyOAuthServiceClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -5098,10 +5148,14 @@ def test_list_brands_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.IdentityAwareProxyOAuthServiceRestInterceptor, "post_list_brands" ) as post, mock.patch.object( + transports.IdentityAwareProxyOAuthServiceRestInterceptor, + "post_list_brands_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.IdentityAwareProxyOAuthServiceRestInterceptor, "pre_list_brands" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListBrandsRequest.pb(service.ListBrandsRequest()) transcode.return_value = { "method": "post", @@ -5123,6 +5177,7 @@ def test_list_brands_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListBrandsResponse() + post_with_metadata.return_value = service.ListBrandsResponse(), metadata client.list_brands( request, @@ -5134,6 +5189,7 @@ def test_list_brands_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_brand_rest_bad_request(request_type=service.CreateBrandRequest): @@ -5295,10 +5351,14 @@ def test_create_brand_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.IdentityAwareProxyOAuthServiceRestInterceptor, "post_create_brand" ) as post, mock.patch.object( + transports.IdentityAwareProxyOAuthServiceRestInterceptor, + "post_create_brand_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.IdentityAwareProxyOAuthServiceRestInterceptor, "pre_create_brand" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateBrandRequest.pb(service.CreateBrandRequest()) transcode.return_value = { "method": "post", @@ -5320,6 +5380,7 @@ def test_create_brand_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.Brand() + post_with_metadata.return_value = service.Brand(), metadata client.create_brand( request, @@ -5331,6 +5392,7 @@ def test_create_brand_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_brand_rest_bad_request(request_type=service.GetBrandRequest): @@ -5419,10 +5481,14 @@ def test_get_brand_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.IdentityAwareProxyOAuthServiceRestInterceptor, "post_get_brand" ) as post, mock.patch.object( + transports.IdentityAwareProxyOAuthServiceRestInterceptor, + "post_get_brand_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.IdentityAwareProxyOAuthServiceRestInterceptor, "pre_get_brand" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetBrandRequest.pb(service.GetBrandRequest()) transcode.return_value = { "method": "post", @@ -5444,6 +5510,7 @@ def test_get_brand_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.Brand() + post_with_metadata.return_value = service.Brand(), metadata client.get_brand( request, @@ -5455,6 +5522,7 @@ def test_get_brand_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_identity_aware_proxy_client_rest_bad_request( @@ -5622,11 +5690,15 @@ def test_create_identity_aware_proxy_client_rest_interceptors(null_interceptor): transports.IdentityAwareProxyOAuthServiceRestInterceptor, "post_create_identity_aware_proxy_client", ) as post, mock.patch.object( + transports.IdentityAwareProxyOAuthServiceRestInterceptor, + "post_create_identity_aware_proxy_client_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.IdentityAwareProxyOAuthServiceRestInterceptor, "pre_create_identity_aware_proxy_client", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateIdentityAwareProxyClientRequest.pb( service.CreateIdentityAwareProxyClientRequest() ) @@ -5652,6 +5724,7 @@ def test_create_identity_aware_proxy_client_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.IdentityAwareProxyClient() + post_with_metadata.return_value = service.IdentityAwareProxyClient(), metadata client.create_identity_aware_proxy_client( request, @@ -5663,6 +5736,7 @@ def test_create_identity_aware_proxy_client_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_identity_aware_proxy_clients_rest_bad_request( @@ -5748,11 +5822,15 @@ def test_list_identity_aware_proxy_clients_rest_interceptors(null_interceptor): transports.IdentityAwareProxyOAuthServiceRestInterceptor, "post_list_identity_aware_proxy_clients", ) as post, mock.patch.object( + transports.IdentityAwareProxyOAuthServiceRestInterceptor, + "post_list_identity_aware_proxy_clients_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.IdentityAwareProxyOAuthServiceRestInterceptor, "pre_list_identity_aware_proxy_clients", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListIdentityAwareProxyClientsRequest.pb( service.ListIdentityAwareProxyClientsRequest() ) @@ -5778,6 +5856,10 @@ def test_list_identity_aware_proxy_clients_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListIdentityAwareProxyClientsResponse() + post_with_metadata.return_value = ( + service.ListIdentityAwareProxyClientsResponse(), + metadata, + ) client.list_identity_aware_proxy_clients( request, @@ -5789,6 +5871,7 @@ def test_list_identity_aware_proxy_clients_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_identity_aware_proxy_client_rest_bad_request( @@ -5882,11 +5965,15 @@ def test_get_identity_aware_proxy_client_rest_interceptors(null_interceptor): transports.IdentityAwareProxyOAuthServiceRestInterceptor, "post_get_identity_aware_proxy_client", ) as post, mock.patch.object( + transports.IdentityAwareProxyOAuthServiceRestInterceptor, + "post_get_identity_aware_proxy_client_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.IdentityAwareProxyOAuthServiceRestInterceptor, "pre_get_identity_aware_proxy_client", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetIdentityAwareProxyClientRequest.pb( service.GetIdentityAwareProxyClientRequest() ) @@ -5912,6 +5999,7 @@ def test_get_identity_aware_proxy_client_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.IdentityAwareProxyClient() + post_with_metadata.return_value = service.IdentityAwareProxyClient(), metadata client.get_identity_aware_proxy_client( request, @@ -5923,6 +6011,7 @@ def test_get_identity_aware_proxy_client_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_reset_identity_aware_proxy_client_secret_rest_bad_request( @@ -6016,11 +6105,15 @@ def test_reset_identity_aware_proxy_client_secret_rest_interceptors(null_interce transports.IdentityAwareProxyOAuthServiceRestInterceptor, "post_reset_identity_aware_proxy_client_secret", ) as post, mock.patch.object( + transports.IdentityAwareProxyOAuthServiceRestInterceptor, + "post_reset_identity_aware_proxy_client_secret_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.IdentityAwareProxyOAuthServiceRestInterceptor, "pre_reset_identity_aware_proxy_client_secret", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ResetIdentityAwareProxyClientSecretRequest.pb( service.ResetIdentityAwareProxyClientSecretRequest() ) @@ -6046,6 +6139,7 @@ def test_reset_identity_aware_proxy_client_secret_rest_interceptors(null_interce ] pre.return_value = request, metadata post.return_value = service.IdentityAwareProxyClient() + post_with_metadata.return_value = service.IdentityAwareProxyClient(), metadata client.reset_identity_aware_proxy_client_secret( request, @@ -6057,6 +6151,7 @@ def test_reset_identity_aware_proxy_client_secret_rest_interceptors(null_interce pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_identity_aware_proxy_client_rest_bad_request( diff --git a/packages/google-cloud-ids/google/cloud/ids/gapic_version.py b/packages/google-cloud-ids/google/cloud/ids/gapic_version.py index 1c08bcbd1569..558c8aab67c5 100644 --- a/packages/google-cloud-ids/google/cloud/ids/gapic_version.py +++ b/packages/google-cloud-ids/google/cloud/ids/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.9.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-ids/google/cloud/ids_v1/gapic_version.py b/packages/google-cloud-ids/google/cloud/ids_v1/gapic_version.py index 1c08bcbd1569..558c8aab67c5 100644 --- a/packages/google-cloud-ids/google/cloud/ids_v1/gapic_version.py +++ b/packages/google-cloud-ids/google/cloud/ids_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.9.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-ids/google/cloud/ids_v1/services/ids/client.py b/packages/google-cloud-ids/google/cloud/ids_v1/services/ids/client.py index afad378e5089..7a04194312ef 100644 --- a/packages/google-cloud-ids/google/cloud/ids_v1/services/ids/client.py +++ b/packages/google-cloud-ids/google/cloud/ids_v1/services/ids/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -487,6 +489,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. diff --git a/packages/google-cloud-ids/google/cloud/ids_v1/services/ids/transports/rest.py b/packages/google-cloud-ids/google/cloud/ids_v1/services/ids/transports/rest.py index 7b86fb706db8..c4e8b2e35792 100644 --- a/packages/google-cloud-ids/google/cloud/ids_v1/services/ids/transports/rest.py +++ b/packages/google-cloud-ids/google/cloud/ids_v1/services/ids/transports/rest.py @@ -124,12 +124,35 @@ def post_create_endpoint( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_endpoint - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_endpoint_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the IDS server but before - it is returned to user code. + it is returned to user code. This `post_create_endpoint` interceptor runs + before the `post_create_endpoint_with_metadata` interceptor. """ return response + def post_create_endpoint_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_endpoint + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the IDS server but before it is returned to user code. + + We recommend only using this `post_create_endpoint_with_metadata` + interceptor in new development instead of the `post_create_endpoint` interceptor. + When both interceptors are used, this `post_create_endpoint_with_metadata` interceptor runs after the + `post_create_endpoint` interceptor. The (possibly modified) response returned by + `post_create_endpoint` will be passed to + `post_create_endpoint_with_metadata`. + """ + return response, metadata + def pre_delete_endpoint( self, request: ids.DeleteEndpointRequest, @@ -147,12 +170,35 @@ def post_delete_endpoint( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_endpoint - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_endpoint_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the IDS server but before - it is returned to user code. + it is returned to user code. This `post_delete_endpoint` interceptor runs + before the `post_delete_endpoint_with_metadata` interceptor. """ return response + def post_delete_endpoint_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_endpoint + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the IDS server but before it is returned to user code. + + We recommend only using this `post_delete_endpoint_with_metadata` + interceptor in new development instead of the `post_delete_endpoint` interceptor. + When both interceptors are used, this `post_delete_endpoint_with_metadata` interceptor runs after the + `post_delete_endpoint` interceptor. The (possibly modified) response returned by + `post_delete_endpoint` will be passed to + `post_delete_endpoint_with_metadata`. + """ + return response, metadata + def pre_get_endpoint( self, request: ids.GetEndpointRequest, @@ -168,12 +214,33 @@ def pre_get_endpoint( def post_get_endpoint(self, response: ids.Endpoint) -> ids.Endpoint: """Post-rpc interceptor for get_endpoint - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_endpoint_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the IDS server but before - it is returned to user code. + it is returned to user code. This `post_get_endpoint` interceptor runs + before the `post_get_endpoint_with_metadata` interceptor. """ return response + def post_get_endpoint_with_metadata( + self, response: ids.Endpoint, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[ids.Endpoint, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_endpoint + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the IDS server but before it is returned to user code. + + We recommend only using this `post_get_endpoint_with_metadata` + interceptor in new development instead of the `post_get_endpoint` interceptor. + When both interceptors are used, this `post_get_endpoint_with_metadata` interceptor runs after the + `post_get_endpoint` interceptor. The (possibly modified) response returned by + `post_get_endpoint` will be passed to + `post_get_endpoint_with_metadata`. + """ + return response, metadata + def pre_list_endpoints( self, request: ids.ListEndpointsRequest, @@ -191,12 +258,35 @@ def post_list_endpoints( ) -> ids.ListEndpointsResponse: """Post-rpc interceptor for list_endpoints - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_endpoints_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the IDS server but before - it is returned to user code. + it is returned to user code. This `post_list_endpoints` interceptor runs + before the `post_list_endpoints_with_metadata` interceptor. """ return response + def post_list_endpoints_with_metadata( + self, + response: ids.ListEndpointsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ids.ListEndpointsResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_endpoints + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the IDS server but before it is returned to user code. + + We recommend only using this `post_list_endpoints_with_metadata` + interceptor in new development instead of the `post_list_endpoints` interceptor. + When both interceptors are used, this `post_list_endpoints_with_metadata` interceptor runs after the + `post_list_endpoints` interceptor. The (possibly modified) response returned by + `post_list_endpoints` will be passed to + `post_list_endpoints_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class IDSRestStub: @@ -462,6 +552,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_endpoint(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_endpoint_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -603,6 +697,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_endpoint(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_endpoint_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -747,6 +845,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_endpoint(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_endpoint_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -887,6 +989,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_endpoints(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_endpoints_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-ids/samples/generated_samples/snippet_metadata_google.cloud.ids.v1.json b/packages/google-cloud-ids/samples/generated_samples/snippet_metadata_google.cloud.ids.v1.json index 7450209ba0d1..366aa3e883aa 100644 --- a/packages/google-cloud-ids/samples/generated_samples/snippet_metadata_google.cloud.ids.v1.json +++ b/packages/google-cloud-ids/samples/generated_samples/snippet_metadata_google.cloud.ids.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-ids", - "version": "1.9.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-ids/tests/unit/gapic/ids_v1/test_ids.py b/packages/google-cloud-ids/tests/unit/gapic/ids_v1/test_ids.py index 5e71ca99976c..48095965cd2e 100644 --- a/packages/google-cloud-ids/tests/unit/gapic/ids_v1/test_ids.py +++ b/packages/google-cloud-ids/tests/unit/gapic/ids_v1/test_ids.py @@ -72,6 +72,13 @@ ) from google.cloud.ids_v1.types import ids +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -283,6 +290,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = IDSClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=["foo"]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + if show_cred_info: + assert error.details == ["foo", CRED_INFO_STRING] + else: + assert error.details == ["foo"] + + +@pytest.mark.parametrize("error_code", [401, 403, 404, 500]) +def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code): + cred = mock.Mock([]) + assert not hasattr(cred, "get_cred_info") + client = IDSClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -3755,10 +3805,13 @@ def test_list_endpoints_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.IDSRestInterceptor, "post_list_endpoints" ) as post, mock.patch.object( + transports.IDSRestInterceptor, "post_list_endpoints_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.IDSRestInterceptor, "pre_list_endpoints" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = ids.ListEndpointsRequest.pb(ids.ListEndpointsRequest()) transcode.return_value = { "method": "post", @@ -3780,6 +3833,7 @@ def test_list_endpoints_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = ids.ListEndpointsResponse() + post_with_metadata.return_value = ids.ListEndpointsResponse(), metadata client.list_endpoints( request, @@ -3791,6 +3845,7 @@ def test_list_endpoints_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_endpoint_rest_bad_request(request_type=ids.GetEndpointRequest): @@ -3885,10 +3940,13 @@ def test_get_endpoint_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.IDSRestInterceptor, "post_get_endpoint" ) as post, mock.patch.object( + transports.IDSRestInterceptor, "post_get_endpoint_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.IDSRestInterceptor, "pre_get_endpoint" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = ids.GetEndpointRequest.pb(ids.GetEndpointRequest()) transcode.return_value = { "method": "post", @@ -3910,6 +3968,7 @@ def test_get_endpoint_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = ids.Endpoint() + post_with_metadata.return_value = ids.Endpoint(), metadata client.get_endpoint( request, @@ -3921,6 +3980,7 @@ def test_get_endpoint_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_endpoint_rest_bad_request(request_type=ids.CreateEndpointRequest): @@ -4077,10 +4137,13 @@ def test_create_endpoint_rest_interceptors(null_interceptor): ), mock.patch.object( transports.IDSRestInterceptor, "post_create_endpoint" ) as post, mock.patch.object( + transports.IDSRestInterceptor, "post_create_endpoint_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.IDSRestInterceptor, "pre_create_endpoint" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = ids.CreateEndpointRequest.pb(ids.CreateEndpointRequest()) transcode.return_value = { "method": "post", @@ -4102,6 +4165,7 @@ def test_create_endpoint_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_endpoint( request, @@ -4113,6 +4177,7 @@ def test_create_endpoint_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_endpoint_rest_bad_request(request_type=ids.DeleteEndpointRequest): @@ -4189,10 +4254,13 @@ def test_delete_endpoint_rest_interceptors(null_interceptor): ), mock.patch.object( transports.IDSRestInterceptor, "post_delete_endpoint" ) as post, mock.patch.object( + transports.IDSRestInterceptor, "post_delete_endpoint_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.IDSRestInterceptor, "pre_delete_endpoint" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = ids.DeleteEndpointRequest.pb(ids.DeleteEndpointRequest()) transcode.return_value = { "method": "post", @@ -4214,6 +4282,7 @@ def test_delete_endpoint_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_endpoint( request, @@ -4225,6 +4294,7 @@ def test_delete_endpoint_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_initialize_client_w_rest(): diff --git a/packages/google-cloud-kms-inventory/google/cloud/kms_inventory/gapic_version.py b/packages/google-cloud-kms-inventory/google/cloud/kms_inventory/gapic_version.py index adf4f4805354..558c8aab67c5 100644 --- a/packages/google-cloud-kms-inventory/google/cloud/kms_inventory/gapic_version.py +++ b/packages/google-cloud-kms-inventory/google/cloud/kms_inventory/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.2.12" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-kms-inventory/google/cloud/kms_inventory_v1/gapic_version.py b/packages/google-cloud-kms-inventory/google/cloud/kms_inventory_v1/gapic_version.py index adf4f4805354..558c8aab67c5 100644 --- a/packages/google-cloud-kms-inventory/google/cloud/kms_inventory_v1/gapic_version.py +++ b/packages/google-cloud-kms-inventory/google/cloud/kms_inventory_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.2.12" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-kms-inventory/google/cloud/kms_inventory_v1/services/key_dashboard_service/client.py b/packages/google-cloud-kms-inventory/google/cloud/kms_inventory_v1/services/key_dashboard_service/client.py index f66d5c301c47..798569c131bf 100644 --- a/packages/google-cloud-kms-inventory/google/cloud/kms_inventory_v1/services/key_dashboard_service/client.py +++ b/packages/google-cloud-kms-inventory/google/cloud/kms_inventory_v1/services/key_dashboard_service/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -516,6 +518,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. diff --git a/packages/google-cloud-kms-inventory/google/cloud/kms_inventory_v1/services/key_dashboard_service/transports/rest.py b/packages/google-cloud-kms-inventory/google/cloud/kms_inventory_v1/services/key_dashboard_service/transports/rest.py index 6867969724be..29b3b29c3f2c 100644 --- a/packages/google-cloud-kms-inventory/google/cloud/kms_inventory_v1/services/key_dashboard_service/transports/rest.py +++ b/packages/google-cloud-kms-inventory/google/cloud/kms_inventory_v1/services/key_dashboard_service/transports/rest.py @@ -102,12 +102,38 @@ def post_list_crypto_keys( ) -> key_dashboard_service.ListCryptoKeysResponse: """Post-rpc interceptor for list_crypto_keys - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_crypto_keys_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the KeyDashboardService server but before - it is returned to user code. + it is returned to user code. This `post_list_crypto_keys` interceptor runs + before the `post_list_crypto_keys_with_metadata` interceptor. """ return response + def post_list_crypto_keys_with_metadata( + self, + response: key_dashboard_service.ListCryptoKeysResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + key_dashboard_service.ListCryptoKeysResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_crypto_keys + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the KeyDashboardService server but before it is returned to user code. + + We recommend only using this `post_list_crypto_keys_with_metadata` + interceptor in new development instead of the `post_list_crypto_keys` interceptor. + When both interceptors are used, this `post_list_crypto_keys_with_metadata` interceptor runs after the + `post_list_crypto_keys` interceptor. The (possibly modified) response returned by + `post_list_crypto_keys` will be passed to + `post_list_crypto_keys_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class KeyDashboardServiceRestStub: @@ -319,6 +345,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_crypto_keys(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_crypto_keys_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-kms-inventory/google/cloud/kms_inventory_v1/services/key_tracking_service/client.py b/packages/google-cloud-kms-inventory/google/cloud/kms_inventory_v1/services/key_tracking_service/client.py index e51d13829907..1c8170e10382 100644 --- a/packages/google-cloud-kms-inventory/google/cloud/kms_inventory_v1/services/key_tracking_service/client.py +++ b/packages/google-cloud-kms-inventory/google/cloud/kms_inventory_v1/services/key_tracking_service/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -525,6 +527,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. diff --git a/packages/google-cloud-kms-inventory/google/cloud/kms_inventory_v1/services/key_tracking_service/transports/rest.py b/packages/google-cloud-kms-inventory/google/cloud/kms_inventory_v1/services/key_tracking_service/transports/rest.py index 30bada80f35f..a6601efb28cc 100644 --- a/packages/google-cloud-kms-inventory/google/cloud/kms_inventory_v1/services/key_tracking_service/transports/rest.py +++ b/packages/google-cloud-kms-inventory/google/cloud/kms_inventory_v1/services/key_tracking_service/transports/rest.py @@ -110,12 +110,38 @@ def post_get_protected_resources_summary( ) -> key_tracking_service.ProtectedResourcesSummary: """Post-rpc interceptor for get_protected_resources_summary - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_protected_resources_summary_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the KeyTrackingService server but before - it is returned to user code. + it is returned to user code. This `post_get_protected_resources_summary` interceptor runs + before the `post_get_protected_resources_summary_with_metadata` interceptor. """ return response + def post_get_protected_resources_summary_with_metadata( + self, + response: key_tracking_service.ProtectedResourcesSummary, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + key_tracking_service.ProtectedResourcesSummary, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for get_protected_resources_summary + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the KeyTrackingService server but before it is returned to user code. + + We recommend only using this `post_get_protected_resources_summary_with_metadata` + interceptor in new development instead of the `post_get_protected_resources_summary` interceptor. + When both interceptors are used, this `post_get_protected_resources_summary_with_metadata` interceptor runs after the + `post_get_protected_resources_summary` interceptor. The (possibly modified) response returned by + `post_get_protected_resources_summary` will be passed to + `post_get_protected_resources_summary_with_metadata`. + """ + return response, metadata + def pre_search_protected_resources( self, request: key_tracking_service.SearchProtectedResourcesRequest, @@ -136,12 +162,38 @@ def post_search_protected_resources( ) -> key_tracking_service.SearchProtectedResourcesResponse: """Post-rpc interceptor for search_protected_resources - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_search_protected_resources_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the KeyTrackingService server but before - it is returned to user code. + it is returned to user code. This `post_search_protected_resources` interceptor runs + before the `post_search_protected_resources_with_metadata` interceptor. """ return response + def post_search_protected_resources_with_metadata( + self, + response: key_tracking_service.SearchProtectedResourcesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + key_tracking_service.SearchProtectedResourcesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for search_protected_resources + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the KeyTrackingService server but before it is returned to user code. + + We recommend only using this `post_search_protected_resources_with_metadata` + interceptor in new development instead of the `post_search_protected_resources` interceptor. + When both interceptors are used, this `post_search_protected_resources_with_metadata` interceptor runs after the + `post_search_protected_resources` interceptor. The (possibly modified) response returned by + `post_search_protected_resources` will be passed to + `post_search_protected_resources_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class KeyTrackingServiceRestStub: @@ -356,6 +408,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_protected_resources_summary(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_get_protected_resources_summary_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -507,6 +566,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_search_protected_resources(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_search_protected_resources_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-kms-inventory/samples/generated_samples/snippet_metadata_google.cloud.kms.inventory.v1.json b/packages/google-cloud-kms-inventory/samples/generated_samples/snippet_metadata_google.cloud.kms.inventory.v1.json index 7a866f768823..aefa167f34a5 100644 --- a/packages/google-cloud-kms-inventory/samples/generated_samples/snippet_metadata_google.cloud.kms.inventory.v1.json +++ b/packages/google-cloud-kms-inventory/samples/generated_samples/snippet_metadata_google.cloud.kms.inventory.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-kms-inventory", - "version": "0.2.12" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-kms-inventory/tests/unit/gapic/kms_inventory_v1/test_key_dashboard_service.py b/packages/google-cloud-kms-inventory/tests/unit/gapic/kms_inventory_v1/test_key_dashboard_service.py index 7a90eedfa5f4..bef4068b0454 100644 --- a/packages/google-cloud-kms-inventory/tests/unit/gapic/kms_inventory_v1/test_key_dashboard_service.py +++ b/packages/google-cloud-kms-inventory/tests/unit/gapic/kms_inventory_v1/test_key_dashboard_service.py @@ -61,6 +61,13 @@ ) from google.cloud.kms_inventory_v1.types import key_dashboard_service +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -334,6 +341,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = KeyDashboardServiceClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=["foo"]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + if show_cred_info: + assert error.details == ["foo", CRED_INFO_STRING] + else: + assert error.details == ["foo"] + + +@pytest.mark.parametrize("error_code", [401, 403, 404, 500]) +def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code): + cred = mock.Mock([]) + assert not hasattr(cred, "get_cred_info") + client = KeyDashboardServiceClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -2156,10 +2206,14 @@ def test_list_crypto_keys_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.KeyDashboardServiceRestInterceptor, "post_list_crypto_keys" ) as post, mock.patch.object( + transports.KeyDashboardServiceRestInterceptor, + "post_list_crypto_keys_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.KeyDashboardServiceRestInterceptor, "pre_list_crypto_keys" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = key_dashboard_service.ListCryptoKeysRequest.pb( key_dashboard_service.ListCryptoKeysRequest() ) @@ -2185,6 +2239,10 @@ def test_list_crypto_keys_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = key_dashboard_service.ListCryptoKeysResponse() + post_with_metadata.return_value = ( + key_dashboard_service.ListCryptoKeysResponse(), + metadata, + ) client.list_crypto_keys( request, @@ -2196,6 +2254,7 @@ def test_list_crypto_keys_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_initialize_client_w_rest(): diff --git a/packages/google-cloud-kms-inventory/tests/unit/gapic/kms_inventory_v1/test_key_tracking_service.py b/packages/google-cloud-kms-inventory/tests/unit/gapic/kms_inventory_v1/test_key_tracking_service.py index 5899124ebb9b..8d1a8e43e313 100644 --- a/packages/google-cloud-kms-inventory/tests/unit/gapic/kms_inventory_v1/test_key_tracking_service.py +++ b/packages/google-cloud-kms-inventory/tests/unit/gapic/kms_inventory_v1/test_key_tracking_service.py @@ -60,6 +60,13 @@ ) from google.cloud.kms_inventory_v1.types import key_tracking_service +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -331,6 +338,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = KeyTrackingServiceClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=["foo"]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + if show_cred_info: + assert error.details == ["foo", CRED_INFO_STRING] + else: + assert error.details == ["foo"] + + +@pytest.mark.parametrize("error_code", [401, 403, 404, 500]) +def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code): + cred = mock.Mock([]) + assert not hasattr(cred, "get_cred_info") + client = KeyTrackingServiceClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -2823,11 +2873,15 @@ def test_get_protected_resources_summary_rest_interceptors(null_interceptor): transports.KeyTrackingServiceRestInterceptor, "post_get_protected_resources_summary", ) as post, mock.patch.object( + transports.KeyTrackingServiceRestInterceptor, + "post_get_protected_resources_summary_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.KeyTrackingServiceRestInterceptor, "pre_get_protected_resources_summary", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = key_tracking_service.GetProtectedResourcesSummaryRequest.pb( key_tracking_service.GetProtectedResourcesSummaryRequest() ) @@ -2853,6 +2907,10 @@ def test_get_protected_resources_summary_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = key_tracking_service.ProtectedResourcesSummary() + post_with_metadata.return_value = ( + key_tracking_service.ProtectedResourcesSummary(), + metadata, + ) client.get_protected_resources_summary( request, @@ -2864,6 +2922,7 @@ def test_get_protected_resources_summary_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_search_protected_resources_rest_bad_request( @@ -2950,10 +3009,14 @@ def test_search_protected_resources_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.KeyTrackingServiceRestInterceptor, "post_search_protected_resources" ) as post, mock.patch.object( + transports.KeyTrackingServiceRestInterceptor, + "post_search_protected_resources_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.KeyTrackingServiceRestInterceptor, "pre_search_protected_resources" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = key_tracking_service.SearchProtectedResourcesRequest.pb( key_tracking_service.SearchProtectedResourcesRequest() ) @@ -2979,6 +3042,10 @@ def test_search_protected_resources_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = key_tracking_service.SearchProtectedResourcesResponse() + post_with_metadata.return_value = ( + key_tracking_service.SearchProtectedResourcesResponse(), + metadata, + ) client.search_protected_resources( request, @@ -2990,6 +3057,7 @@ def test_search_protected_resources_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_initialize_client_w_rest(): diff --git a/packages/google-cloud-kms/google/cloud/kms/gapic_version.py b/packages/google-cloud-kms/google/cloud/kms/gapic_version.py index 4d9e32b6901d..558c8aab67c5 100644 --- a/packages/google-cloud-kms/google/cloud/kms/gapic_version.py +++ b/packages/google-cloud-kms/google/cloud/kms/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "3.2.2" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-kms/google/cloud/kms_v1/gapic_version.py b/packages/google-cloud-kms/google/cloud/kms_v1/gapic_version.py index 4d9e32b6901d..558c8aab67c5 100644 --- a/packages/google-cloud-kms/google/cloud/kms_v1/gapic_version.py +++ b/packages/google-cloud-kms/google/cloud/kms_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "3.2.2" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-kms/google/cloud/kms_v1/services/autokey/client.py b/packages/google-cloud-kms/google/cloud/kms_v1/services/autokey/client.py index adf922708b4d..ec95c1434ae8 100644 --- a/packages/google-cloud-kms/google/cloud/kms_v1/services/autokey/client.py +++ b/packages/google-cloud-kms/google/cloud/kms_v1/services/autokey/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -532,6 +534,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. @@ -1167,16 +1196,20 @@ def get_operation( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def get_location( self, @@ -1222,16 +1255,20 @@ def get_location( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def list_locations( self, @@ -1277,16 +1314,20 @@ def list_locations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def set_iam_policy( self, @@ -1402,16 +1443,20 @@ def set_iam_policy( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def get_iam_policy( self, @@ -1528,16 +1573,20 @@ def get_iam_policy( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def test_iam_permissions( self, @@ -1592,16 +1641,20 @@ def test_iam_permissions( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-kms/google/cloud/kms_v1/services/autokey/transports/rest.py b/packages/google-cloud-kms/google/cloud/kms_v1/services/autokey/transports/rest.py index d551a862ad52..7eccdfaa5d73 100644 --- a/packages/google-cloud-kms/google/cloud/kms_v1/services/autokey/transports/rest.py +++ b/packages/google-cloud-kms/google/cloud/kms_v1/services/autokey/transports/rest.py @@ -119,12 +119,35 @@ def post_create_key_handle( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_key_handle - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_key_handle_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Autokey server but before - it is returned to user code. + it is returned to user code. This `post_create_key_handle` interceptor runs + before the `post_create_key_handle_with_metadata` interceptor. """ return response + def post_create_key_handle_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_key_handle + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Autokey server but before it is returned to user code. + + We recommend only using this `post_create_key_handle_with_metadata` + interceptor in new development instead of the `post_create_key_handle` interceptor. + When both interceptors are used, this `post_create_key_handle_with_metadata` interceptor runs after the + `post_create_key_handle` interceptor. The (possibly modified) response returned by + `post_create_key_handle` will be passed to + `post_create_key_handle_with_metadata`. + """ + return response, metadata + def pre_get_key_handle( self, request: autokey.GetKeyHandleRequest, @@ -140,12 +163,35 @@ def pre_get_key_handle( def post_get_key_handle(self, response: autokey.KeyHandle) -> autokey.KeyHandle: """Post-rpc interceptor for get_key_handle - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_key_handle_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Autokey server but before - it is returned to user code. + it is returned to user code. This `post_get_key_handle` interceptor runs + before the `post_get_key_handle_with_metadata` interceptor. """ return response + def post_get_key_handle_with_metadata( + self, + response: autokey.KeyHandle, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[autokey.KeyHandle, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_key_handle + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Autokey server but before it is returned to user code. + + We recommend only using this `post_get_key_handle_with_metadata` + interceptor in new development instead of the `post_get_key_handle` interceptor. + When both interceptors are used, this `post_get_key_handle_with_metadata` interceptor runs after the + `post_get_key_handle` interceptor. The (possibly modified) response returned by + `post_get_key_handle` will be passed to + `post_get_key_handle_with_metadata`. + """ + return response, metadata + def pre_list_key_handles( self, request: autokey.ListKeyHandlesRequest, @@ -163,12 +209,35 @@ def post_list_key_handles( ) -> autokey.ListKeyHandlesResponse: """Post-rpc interceptor for list_key_handles - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_key_handles_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Autokey server but before - it is returned to user code. + it is returned to user code. This `post_list_key_handles` interceptor runs + before the `post_list_key_handles_with_metadata` interceptor. """ return response + def post_list_key_handles_with_metadata( + self, + response: autokey.ListKeyHandlesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[autokey.ListKeyHandlesResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_key_handles + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Autokey server but before it is returned to user code. + + We recommend only using this `post_list_key_handles_with_metadata` + interceptor in new development instead of the `post_list_key_handles` interceptor. + When both interceptors are used, this `post_list_key_handles_with_metadata` interceptor runs after the + `post_list_key_handles` interceptor. The (possibly modified) response returned by + `post_list_key_handles` will be passed to + `post_list_key_handles_with_metadata`. + """ + return response, metadata + def pre_get_location( self, request: locations_pb2.GetLocationRequest, @@ -589,6 +658,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_key_handle(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_key_handle_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -735,6 +808,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_key_handle(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_key_handle_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -884,6 +961,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_key_handles(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_key_handles_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-kms/google/cloud/kms_v1/services/autokey_admin/client.py b/packages/google-cloud-kms/google/cloud/kms_v1/services/autokey_admin/client.py index bd64f271589d..b4a57fa5ffc5 100644 --- a/packages/google-cloud-kms/google/cloud/kms_v1/services/autokey_admin/client.py +++ b/packages/google-cloud-kms/google/cloud/kms_v1/services/autokey_admin/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -489,6 +491,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. @@ -1087,16 +1116,20 @@ def get_operation( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def get_location( self, @@ -1142,16 +1175,20 @@ def get_location( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def list_locations( self, @@ -1197,16 +1234,20 @@ def list_locations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def set_iam_policy( self, @@ -1322,16 +1363,20 @@ def set_iam_policy( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def get_iam_policy( self, @@ -1448,16 +1493,20 @@ def get_iam_policy( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def test_iam_permissions( self, @@ -1512,16 +1561,20 @@ def test_iam_permissions( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-kms/google/cloud/kms_v1/services/autokey_admin/transports/rest.py b/packages/google-cloud-kms/google/cloud/kms_v1/services/autokey_admin/transports/rest.py index aa01fd2da28c..502f783daf53 100644 --- a/packages/google-cloud-kms/google/cloud/kms_v1/services/autokey_admin/transports/rest.py +++ b/packages/google-cloud-kms/google/cloud/kms_v1/services/autokey_admin/transports/rest.py @@ -121,12 +121,35 @@ def post_get_autokey_config( ) -> autokey_admin.AutokeyConfig: """Post-rpc interceptor for get_autokey_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_autokey_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AutokeyAdmin server but before - it is returned to user code. + it is returned to user code. This `post_get_autokey_config` interceptor runs + before the `post_get_autokey_config_with_metadata` interceptor. """ return response + def post_get_autokey_config_with_metadata( + self, + response: autokey_admin.AutokeyConfig, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[autokey_admin.AutokeyConfig, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_autokey_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AutokeyAdmin server but before it is returned to user code. + + We recommend only using this `post_get_autokey_config_with_metadata` + interceptor in new development instead of the `post_get_autokey_config` interceptor. + When both interceptors are used, this `post_get_autokey_config_with_metadata` interceptor runs after the + `post_get_autokey_config` interceptor. The (possibly modified) response returned by + `post_get_autokey_config` will be passed to + `post_get_autokey_config_with_metadata`. + """ + return response, metadata + def pre_show_effective_autokey_config( self, request: autokey_admin.ShowEffectiveAutokeyConfigRequest, @@ -147,12 +170,38 @@ def post_show_effective_autokey_config( ) -> autokey_admin.ShowEffectiveAutokeyConfigResponse: """Post-rpc interceptor for show_effective_autokey_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_show_effective_autokey_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AutokeyAdmin server but before - it is returned to user code. + it is returned to user code. This `post_show_effective_autokey_config` interceptor runs + before the `post_show_effective_autokey_config_with_metadata` interceptor. """ return response + def post_show_effective_autokey_config_with_metadata( + self, + response: autokey_admin.ShowEffectiveAutokeyConfigResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + autokey_admin.ShowEffectiveAutokeyConfigResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for show_effective_autokey_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AutokeyAdmin server but before it is returned to user code. + + We recommend only using this `post_show_effective_autokey_config_with_metadata` + interceptor in new development instead of the `post_show_effective_autokey_config` interceptor. + When both interceptors are used, this `post_show_effective_autokey_config_with_metadata` interceptor runs after the + `post_show_effective_autokey_config` interceptor. The (possibly modified) response returned by + `post_show_effective_autokey_config` will be passed to + `post_show_effective_autokey_config_with_metadata`. + """ + return response, metadata + def pre_update_autokey_config( self, request: autokey_admin.UpdateAutokeyConfigRequest, @@ -173,12 +222,35 @@ def post_update_autokey_config( ) -> autokey_admin.AutokeyConfig: """Post-rpc interceptor for update_autokey_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_autokey_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AutokeyAdmin server but before - it is returned to user code. + it is returned to user code. This `post_update_autokey_config` interceptor runs + before the `post_update_autokey_config_with_metadata` interceptor. """ return response + def post_update_autokey_config_with_metadata( + self, + response: autokey_admin.AutokeyConfig, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[autokey_admin.AutokeyConfig, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_autokey_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AutokeyAdmin server but before it is returned to user code. + + We recommend only using this `post_update_autokey_config_with_metadata` + interceptor in new development instead of the `post_update_autokey_config` interceptor. + When both interceptors are used, this `post_update_autokey_config_with_metadata` interceptor runs after the + `post_update_autokey_config` interceptor. The (possibly modified) response returned by + `post_update_autokey_config` will be passed to + `post_update_autokey_config_with_metadata`. + """ + return response, metadata + def pre_get_location( self, request: locations_pb2.GetLocationRequest, @@ -543,6 +615,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_autokey_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_autokey_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -692,6 +768,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_show_effective_autokey_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_show_effective_autokey_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -847,6 +930,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_autokey_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_autokey_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-kms/google/cloud/kms_v1/services/ekm_service/client.py b/packages/google-cloud-kms/google/cloud/kms_v1/services/ekm_service/client.py index 57e58c7e65db..095873754ca2 100644 --- a/packages/google-cloud-kms/google/cloud/kms_v1/services/ekm_service/client.py +++ b/packages/google-cloud-kms/google/cloud/kms_v1/services/ekm_service/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -538,6 +540,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. @@ -1647,16 +1676,20 @@ def get_operation( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def get_location( self, @@ -1702,16 +1735,20 @@ def get_location( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def list_locations( self, @@ -1757,16 +1794,20 @@ def list_locations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def set_iam_policy( self, @@ -1882,16 +1923,20 @@ def set_iam_policy( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def get_iam_policy( self, @@ -2008,16 +2053,20 @@ def get_iam_policy( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def test_iam_permissions( self, @@ -2072,16 +2121,20 @@ def test_iam_permissions( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-kms/google/cloud/kms_v1/services/ekm_service/transports/rest.py b/packages/google-cloud-kms/google/cloud/kms_v1/services/ekm_service/transports/rest.py index 8d7032077a06..3f67a11b005a 100644 --- a/packages/google-cloud-kms/google/cloud/kms_v1/services/ekm_service/transports/rest.py +++ b/packages/google-cloud-kms/google/cloud/kms_v1/services/ekm_service/transports/rest.py @@ -153,12 +153,35 @@ def post_create_ekm_connection( ) -> ekm_service.EkmConnection: """Post-rpc interceptor for create_ekm_connection - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_ekm_connection_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the EkmService server but before - it is returned to user code. + it is returned to user code. This `post_create_ekm_connection` interceptor runs + before the `post_create_ekm_connection_with_metadata` interceptor. """ return response + def post_create_ekm_connection_with_metadata( + self, + response: ekm_service.EkmConnection, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ekm_service.EkmConnection, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_ekm_connection + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the EkmService server but before it is returned to user code. + + We recommend only using this `post_create_ekm_connection_with_metadata` + interceptor in new development instead of the `post_create_ekm_connection` interceptor. + When both interceptors are used, this `post_create_ekm_connection_with_metadata` interceptor runs after the + `post_create_ekm_connection` interceptor. The (possibly modified) response returned by + `post_create_ekm_connection` will be passed to + `post_create_ekm_connection_with_metadata`. + """ + return response, metadata + def pre_get_ekm_config( self, request: ekm_service.GetEkmConfigRequest, @@ -178,12 +201,35 @@ def post_get_ekm_config( ) -> ekm_service.EkmConfig: """Post-rpc interceptor for get_ekm_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_ekm_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the EkmService server but before - it is returned to user code. + it is returned to user code. This `post_get_ekm_config` interceptor runs + before the `post_get_ekm_config_with_metadata` interceptor. """ return response + def post_get_ekm_config_with_metadata( + self, + response: ekm_service.EkmConfig, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ekm_service.EkmConfig, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_ekm_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the EkmService server but before it is returned to user code. + + We recommend only using this `post_get_ekm_config_with_metadata` + interceptor in new development instead of the `post_get_ekm_config` interceptor. + When both interceptors are used, this `post_get_ekm_config_with_metadata` interceptor runs after the + `post_get_ekm_config` interceptor. The (possibly modified) response returned by + `post_get_ekm_config` will be passed to + `post_get_ekm_config_with_metadata`. + """ + return response, metadata + def pre_get_ekm_connection( self, request: ekm_service.GetEkmConnectionRequest, @@ -203,12 +249,35 @@ def post_get_ekm_connection( ) -> ekm_service.EkmConnection: """Post-rpc interceptor for get_ekm_connection - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_ekm_connection_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the EkmService server but before - it is returned to user code. + it is returned to user code. This `post_get_ekm_connection` interceptor runs + before the `post_get_ekm_connection_with_metadata` interceptor. """ return response + def post_get_ekm_connection_with_metadata( + self, + response: ekm_service.EkmConnection, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ekm_service.EkmConnection, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_ekm_connection + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the EkmService server but before it is returned to user code. + + We recommend only using this `post_get_ekm_connection_with_metadata` + interceptor in new development instead of the `post_get_ekm_connection` interceptor. + When both interceptors are used, this `post_get_ekm_connection_with_metadata` interceptor runs after the + `post_get_ekm_connection` interceptor. The (possibly modified) response returned by + `post_get_ekm_connection` will be passed to + `post_get_ekm_connection_with_metadata`. + """ + return response, metadata + def pre_list_ekm_connections( self, request: ekm_service.ListEkmConnectionsRequest, @@ -228,12 +297,37 @@ def post_list_ekm_connections( ) -> ekm_service.ListEkmConnectionsResponse: """Post-rpc interceptor for list_ekm_connections - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_ekm_connections_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the EkmService server but before - it is returned to user code. + it is returned to user code. This `post_list_ekm_connections` interceptor runs + before the `post_list_ekm_connections_with_metadata` interceptor. """ return response + def post_list_ekm_connections_with_metadata( + self, + response: ekm_service.ListEkmConnectionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + ekm_service.ListEkmConnectionsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_ekm_connections + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the EkmService server but before it is returned to user code. + + We recommend only using this `post_list_ekm_connections_with_metadata` + interceptor in new development instead of the `post_list_ekm_connections` interceptor. + When both interceptors are used, this `post_list_ekm_connections_with_metadata` interceptor runs after the + `post_list_ekm_connections` interceptor. The (possibly modified) response returned by + `post_list_ekm_connections` will be passed to + `post_list_ekm_connections_with_metadata`. + """ + return response, metadata + def pre_update_ekm_config( self, request: ekm_service.UpdateEkmConfigRequest, @@ -253,12 +347,35 @@ def post_update_ekm_config( ) -> ekm_service.EkmConfig: """Post-rpc interceptor for update_ekm_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_ekm_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the EkmService server but before - it is returned to user code. + it is returned to user code. This `post_update_ekm_config` interceptor runs + before the `post_update_ekm_config_with_metadata` interceptor. """ return response + def post_update_ekm_config_with_metadata( + self, + response: ekm_service.EkmConfig, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ekm_service.EkmConfig, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_ekm_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the EkmService server but before it is returned to user code. + + We recommend only using this `post_update_ekm_config_with_metadata` + interceptor in new development instead of the `post_update_ekm_config` interceptor. + When both interceptors are used, this `post_update_ekm_config_with_metadata` interceptor runs after the + `post_update_ekm_config` interceptor. The (possibly modified) response returned by + `post_update_ekm_config` will be passed to + `post_update_ekm_config_with_metadata`. + """ + return response, metadata + def pre_update_ekm_connection( self, request: ekm_service.UpdateEkmConnectionRequest, @@ -278,12 +395,35 @@ def post_update_ekm_connection( ) -> ekm_service.EkmConnection: """Post-rpc interceptor for update_ekm_connection - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_ekm_connection_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the EkmService server but before - it is returned to user code. + it is returned to user code. This `post_update_ekm_connection` interceptor runs + before the `post_update_ekm_connection_with_metadata` interceptor. """ return response + def post_update_ekm_connection_with_metadata( + self, + response: ekm_service.EkmConnection, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ekm_service.EkmConnection, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_ekm_connection + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the EkmService server but before it is returned to user code. + + We recommend only using this `post_update_ekm_connection_with_metadata` + interceptor in new development instead of the `post_update_ekm_connection` interceptor. + When both interceptors are used, this `post_update_ekm_connection_with_metadata` interceptor runs after the + `post_update_ekm_connection` interceptor. The (possibly modified) response returned by + `post_update_ekm_connection` will be passed to + `post_update_ekm_connection_with_metadata`. + """ + return response, metadata + def pre_verify_connectivity( self, request: ekm_service.VerifyConnectivityRequest, @@ -303,12 +443,37 @@ def post_verify_connectivity( ) -> ekm_service.VerifyConnectivityResponse: """Post-rpc interceptor for verify_connectivity - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_verify_connectivity_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the EkmService server but before - it is returned to user code. + it is returned to user code. This `post_verify_connectivity` interceptor runs + before the `post_verify_connectivity_with_metadata` interceptor. """ return response + def post_verify_connectivity_with_metadata( + self, + response: ekm_service.VerifyConnectivityResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + ekm_service.VerifyConnectivityResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for verify_connectivity + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the EkmService server but before it is returned to user code. + + We recommend only using this `post_verify_connectivity_with_metadata` + interceptor in new development instead of the `post_verify_connectivity` interceptor. + When both interceptors are used, this `post_verify_connectivity_with_metadata` interceptor runs after the + `post_verify_connectivity` interceptor. The (possibly modified) response returned by + `post_verify_connectivity` will be passed to + `post_verify_connectivity_with_metadata`. + """ + return response, metadata + def pre_get_location( self, request: locations_pb2.GetLocationRequest, @@ -686,6 +851,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_ekm_connection(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_ekm_connection_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -841,6 +1010,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_ekm_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_ekm_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -996,6 +1169,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_ekm_connection(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_ekm_connection_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1141,6 +1318,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_ekm_connections(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_ekm_connections_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1302,6 +1483,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_ekm_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_ekm_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1463,6 +1648,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_ekm_connection(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_ekm_connection_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1608,6 +1797,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_verify_connectivity(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_verify_connectivity_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-kms/google/cloud/kms_v1/services/key_management_service/client.py b/packages/google-cloud-kms/google/cloud/kms_v1/services/key_management_service/client.py index 1412bf644c8a..7025098b9883 100644 --- a/packages/google-cloud-kms/google/cloud/kms_v1/services/key_management_service/client.py +++ b/packages/google-cloud-kms/google/cloud/kms_v1/services/key_management_service/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -605,6 +607,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. @@ -4399,16 +4428,20 @@ def get_operation( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def get_location( self, @@ -4454,16 +4487,20 @@ def get_location( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def list_locations( self, @@ -4509,16 +4546,20 @@ def list_locations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def set_iam_policy( self, @@ -4634,16 +4675,20 @@ def set_iam_policy( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def get_iam_policy( self, @@ -4760,16 +4805,20 @@ def get_iam_policy( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def test_iam_permissions( self, @@ -4824,16 +4873,20 @@ def test_iam_permissions( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-kms/google/cloud/kms_v1/services/key_management_service/transports/rest.py b/packages/google-cloud-kms/google/cloud/kms_v1/services/key_management_service/transports/rest.py index c4a13452857d..50f4a1bcc1dd 100644 --- a/packages/google-cloud-kms/google/cloud/kms_v1/services/key_management_service/transports/rest.py +++ b/packages/google-cloud-kms/google/cloud/kms_v1/services/key_management_service/transports/rest.py @@ -321,12 +321,37 @@ def post_asymmetric_decrypt( ) -> service.AsymmetricDecryptResponse: """Post-rpc interceptor for asymmetric_decrypt - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_asymmetric_decrypt_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the KeyManagementService server but before - it is returned to user code. + it is returned to user code. This `post_asymmetric_decrypt` interceptor runs + before the `post_asymmetric_decrypt_with_metadata` interceptor. """ return response + def post_asymmetric_decrypt_with_metadata( + self, + response: service.AsymmetricDecryptResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service.AsymmetricDecryptResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for asymmetric_decrypt + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the KeyManagementService server but before it is returned to user code. + + We recommend only using this `post_asymmetric_decrypt_with_metadata` + interceptor in new development instead of the `post_asymmetric_decrypt` interceptor. + When both interceptors are used, this `post_asymmetric_decrypt_with_metadata` interceptor runs after the + `post_asymmetric_decrypt` interceptor. The (possibly modified) response returned by + `post_asymmetric_decrypt` will be passed to + `post_asymmetric_decrypt_with_metadata`. + """ + return response, metadata + def pre_asymmetric_sign( self, request: service.AsymmetricSignRequest, @@ -344,12 +369,35 @@ def post_asymmetric_sign( ) -> service.AsymmetricSignResponse: """Post-rpc interceptor for asymmetric_sign - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_asymmetric_sign_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the KeyManagementService server but before - it is returned to user code. + it is returned to user code. This `post_asymmetric_sign` interceptor runs + before the `post_asymmetric_sign_with_metadata` interceptor. """ return response + def post_asymmetric_sign_with_metadata( + self, + response: service.AsymmetricSignResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.AsymmetricSignResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for asymmetric_sign + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the KeyManagementService server but before it is returned to user code. + + We recommend only using this `post_asymmetric_sign_with_metadata` + interceptor in new development instead of the `post_asymmetric_sign` interceptor. + When both interceptors are used, this `post_asymmetric_sign_with_metadata` interceptor runs after the + `post_asymmetric_sign` interceptor. The (possibly modified) response returned by + `post_asymmetric_sign` will be passed to + `post_asymmetric_sign_with_metadata`. + """ + return response, metadata + def pre_create_crypto_key( self, request: service.CreateCryptoKeyRequest, @@ -367,12 +415,35 @@ def post_create_crypto_key( ) -> resources.CryptoKey: """Post-rpc interceptor for create_crypto_key - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_crypto_key_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the KeyManagementService server but before - it is returned to user code. + it is returned to user code. This `post_create_crypto_key` interceptor runs + before the `post_create_crypto_key_with_metadata` interceptor. """ return response + def post_create_crypto_key_with_metadata( + self, + response: resources.CryptoKey, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.CryptoKey, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_crypto_key + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the KeyManagementService server but before it is returned to user code. + + We recommend only using this `post_create_crypto_key_with_metadata` + interceptor in new development instead of the `post_create_crypto_key` interceptor. + When both interceptors are used, this `post_create_crypto_key_with_metadata` interceptor runs after the + `post_create_crypto_key` interceptor. The (possibly modified) response returned by + `post_create_crypto_key` will be passed to + `post_create_crypto_key_with_metadata`. + """ + return response, metadata + def pre_create_crypto_key_version( self, request: service.CreateCryptoKeyVersionRequest, @@ -392,12 +463,35 @@ def post_create_crypto_key_version( ) -> resources.CryptoKeyVersion: """Post-rpc interceptor for create_crypto_key_version - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_crypto_key_version_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the KeyManagementService server but before - it is returned to user code. + it is returned to user code. This `post_create_crypto_key_version` interceptor runs + before the `post_create_crypto_key_version_with_metadata` interceptor. """ return response + def post_create_crypto_key_version_with_metadata( + self, + response: resources.CryptoKeyVersion, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.CryptoKeyVersion, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_crypto_key_version + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the KeyManagementService server but before it is returned to user code. + + We recommend only using this `post_create_crypto_key_version_with_metadata` + interceptor in new development instead of the `post_create_crypto_key_version` interceptor. + When both interceptors are used, this `post_create_crypto_key_version_with_metadata` interceptor runs after the + `post_create_crypto_key_version` interceptor. The (possibly modified) response returned by + `post_create_crypto_key_version` will be passed to + `post_create_crypto_key_version_with_metadata`. + """ + return response, metadata + def pre_create_import_job( self, request: service.CreateImportJobRequest, @@ -415,12 +509,35 @@ def post_create_import_job( ) -> resources.ImportJob: """Post-rpc interceptor for create_import_job - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_import_job_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the KeyManagementService server but before - it is returned to user code. + it is returned to user code. This `post_create_import_job` interceptor runs + before the `post_create_import_job_with_metadata` interceptor. """ return response + def post_create_import_job_with_metadata( + self, + response: resources.ImportJob, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.ImportJob, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_import_job + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the KeyManagementService server but before it is returned to user code. + + We recommend only using this `post_create_import_job_with_metadata` + interceptor in new development instead of the `post_create_import_job` interceptor. + When both interceptors are used, this `post_create_import_job_with_metadata` interceptor runs after the + `post_create_import_job` interceptor. The (possibly modified) response returned by + `post_create_import_job` will be passed to + `post_create_import_job_with_metadata`. + """ + return response, metadata + def pre_create_key_ring( self, request: service.CreateKeyRingRequest, @@ -436,12 +553,35 @@ def pre_create_key_ring( def post_create_key_ring(self, response: resources.KeyRing) -> resources.KeyRing: """Post-rpc interceptor for create_key_ring - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_key_ring_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the KeyManagementService server but before - it is returned to user code. + it is returned to user code. This `post_create_key_ring` interceptor runs + before the `post_create_key_ring_with_metadata` interceptor. """ return response + def post_create_key_ring_with_metadata( + self, + response: resources.KeyRing, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.KeyRing, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_key_ring + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the KeyManagementService server but before it is returned to user code. + + We recommend only using this `post_create_key_ring_with_metadata` + interceptor in new development instead of the `post_create_key_ring` interceptor. + When both interceptors are used, this `post_create_key_ring_with_metadata` interceptor runs after the + `post_create_key_ring` interceptor. The (possibly modified) response returned by + `post_create_key_ring` will be passed to + `post_create_key_ring_with_metadata`. + """ + return response, metadata + def pre_decrypt( self, request: service.DecryptRequest, @@ -459,12 +599,35 @@ def post_decrypt( ) -> service.DecryptResponse: """Post-rpc interceptor for decrypt - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_decrypt_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the KeyManagementService server but before - it is returned to user code. + it is returned to user code. This `post_decrypt` interceptor runs + before the `post_decrypt_with_metadata` interceptor. """ return response + def post_decrypt_with_metadata( + self, + response: service.DecryptResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.DecryptResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for decrypt + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the KeyManagementService server but before it is returned to user code. + + We recommend only using this `post_decrypt_with_metadata` + interceptor in new development instead of the `post_decrypt` interceptor. + When both interceptors are used, this `post_decrypt_with_metadata` interceptor runs after the + `post_decrypt` interceptor. The (possibly modified) response returned by + `post_decrypt` will be passed to + `post_decrypt_with_metadata`. + """ + return response, metadata + def pre_destroy_crypto_key_version( self, request: service.DestroyCryptoKeyVersionRequest, @@ -484,12 +647,35 @@ def post_destroy_crypto_key_version( ) -> resources.CryptoKeyVersion: """Post-rpc interceptor for destroy_crypto_key_version - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_destroy_crypto_key_version_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the KeyManagementService server but before - it is returned to user code. + it is returned to user code. This `post_destroy_crypto_key_version` interceptor runs + before the `post_destroy_crypto_key_version_with_metadata` interceptor. """ return response + def post_destroy_crypto_key_version_with_metadata( + self, + response: resources.CryptoKeyVersion, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.CryptoKeyVersion, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for destroy_crypto_key_version + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the KeyManagementService server but before it is returned to user code. + + We recommend only using this `post_destroy_crypto_key_version_with_metadata` + interceptor in new development instead of the `post_destroy_crypto_key_version` interceptor. + When both interceptors are used, this `post_destroy_crypto_key_version_with_metadata` interceptor runs after the + `post_destroy_crypto_key_version` interceptor. The (possibly modified) response returned by + `post_destroy_crypto_key_version` will be passed to + `post_destroy_crypto_key_version_with_metadata`. + """ + return response, metadata + def pre_encrypt( self, request: service.EncryptRequest, @@ -507,12 +693,35 @@ def post_encrypt( ) -> service.EncryptResponse: """Post-rpc interceptor for encrypt - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_encrypt_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the KeyManagementService server but before - it is returned to user code. + it is returned to user code. This `post_encrypt` interceptor runs + before the `post_encrypt_with_metadata` interceptor. """ return response + def post_encrypt_with_metadata( + self, + response: service.EncryptResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.EncryptResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for encrypt + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the KeyManagementService server but before it is returned to user code. + + We recommend only using this `post_encrypt_with_metadata` + interceptor in new development instead of the `post_encrypt` interceptor. + When both interceptors are used, this `post_encrypt_with_metadata` interceptor runs after the + `post_encrypt` interceptor. The (possibly modified) response returned by + `post_encrypt` will be passed to + `post_encrypt_with_metadata`. + """ + return response, metadata + def pre_generate_random_bytes( self, request: service.GenerateRandomBytesRequest, @@ -532,12 +741,37 @@ def post_generate_random_bytes( ) -> service.GenerateRandomBytesResponse: """Post-rpc interceptor for generate_random_bytes - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_generate_random_bytes_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the KeyManagementService server but before - it is returned to user code. + it is returned to user code. This `post_generate_random_bytes` interceptor runs + before the `post_generate_random_bytes_with_metadata` interceptor. """ return response + def post_generate_random_bytes_with_metadata( + self, + response: service.GenerateRandomBytesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service.GenerateRandomBytesResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for generate_random_bytes + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the KeyManagementService server but before it is returned to user code. + + We recommend only using this `post_generate_random_bytes_with_metadata` + interceptor in new development instead of the `post_generate_random_bytes` interceptor. + When both interceptors are used, this `post_generate_random_bytes_with_metadata` interceptor runs after the + `post_generate_random_bytes` interceptor. The (possibly modified) response returned by + `post_generate_random_bytes` will be passed to + `post_generate_random_bytes_with_metadata`. + """ + return response, metadata + def pre_get_crypto_key( self, request: service.GetCryptoKeyRequest, @@ -553,12 +787,35 @@ def pre_get_crypto_key( def post_get_crypto_key(self, response: resources.CryptoKey) -> resources.CryptoKey: """Post-rpc interceptor for get_crypto_key - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_crypto_key_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the KeyManagementService server but before - it is returned to user code. + it is returned to user code. This `post_get_crypto_key` interceptor runs + before the `post_get_crypto_key_with_metadata` interceptor. """ return response + def post_get_crypto_key_with_metadata( + self, + response: resources.CryptoKey, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.CryptoKey, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_crypto_key + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the KeyManagementService server but before it is returned to user code. + + We recommend only using this `post_get_crypto_key_with_metadata` + interceptor in new development instead of the `post_get_crypto_key` interceptor. + When both interceptors are used, this `post_get_crypto_key_with_metadata` interceptor runs after the + `post_get_crypto_key` interceptor. The (possibly modified) response returned by + `post_get_crypto_key` will be passed to + `post_get_crypto_key_with_metadata`. + """ + return response, metadata + def pre_get_crypto_key_version( self, request: service.GetCryptoKeyVersionRequest, @@ -578,12 +835,35 @@ def post_get_crypto_key_version( ) -> resources.CryptoKeyVersion: """Post-rpc interceptor for get_crypto_key_version - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_crypto_key_version_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the KeyManagementService server but before - it is returned to user code. + it is returned to user code. This `post_get_crypto_key_version` interceptor runs + before the `post_get_crypto_key_version_with_metadata` interceptor. """ return response + def post_get_crypto_key_version_with_metadata( + self, + response: resources.CryptoKeyVersion, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.CryptoKeyVersion, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_crypto_key_version + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the KeyManagementService server but before it is returned to user code. + + We recommend only using this `post_get_crypto_key_version_with_metadata` + interceptor in new development instead of the `post_get_crypto_key_version` interceptor. + When both interceptors are used, this `post_get_crypto_key_version_with_metadata` interceptor runs after the + `post_get_crypto_key_version` interceptor. The (possibly modified) response returned by + `post_get_crypto_key_version` will be passed to + `post_get_crypto_key_version_with_metadata`. + """ + return response, metadata + def pre_get_import_job( self, request: service.GetImportJobRequest, @@ -599,12 +879,35 @@ def pre_get_import_job( def post_get_import_job(self, response: resources.ImportJob) -> resources.ImportJob: """Post-rpc interceptor for get_import_job - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_import_job_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the KeyManagementService server but before - it is returned to user code. + it is returned to user code. This `post_get_import_job` interceptor runs + before the `post_get_import_job_with_metadata` interceptor. """ return response + def post_get_import_job_with_metadata( + self, + response: resources.ImportJob, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.ImportJob, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_import_job + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the KeyManagementService server but before it is returned to user code. + + We recommend only using this `post_get_import_job_with_metadata` + interceptor in new development instead of the `post_get_import_job` interceptor. + When both interceptors are used, this `post_get_import_job_with_metadata` interceptor runs after the + `post_get_import_job` interceptor. The (possibly modified) response returned by + `post_get_import_job` will be passed to + `post_get_import_job_with_metadata`. + """ + return response, metadata + def pre_get_key_ring( self, request: service.GetKeyRingRequest, @@ -620,12 +923,35 @@ def pre_get_key_ring( def post_get_key_ring(self, response: resources.KeyRing) -> resources.KeyRing: """Post-rpc interceptor for get_key_ring - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_key_ring_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the KeyManagementService server but before - it is returned to user code. + it is returned to user code. This `post_get_key_ring` interceptor runs + before the `post_get_key_ring_with_metadata` interceptor. """ return response + def post_get_key_ring_with_metadata( + self, + response: resources.KeyRing, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.KeyRing, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_key_ring + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the KeyManagementService server but before it is returned to user code. + + We recommend only using this `post_get_key_ring_with_metadata` + interceptor in new development instead of the `post_get_key_ring` interceptor. + When both interceptors are used, this `post_get_key_ring_with_metadata` interceptor runs after the + `post_get_key_ring` interceptor. The (possibly modified) response returned by + `post_get_key_ring` will be passed to + `post_get_key_ring_with_metadata`. + """ + return response, metadata + def pre_get_public_key( self, request: service.GetPublicKeyRequest, @@ -641,12 +967,35 @@ def pre_get_public_key( def post_get_public_key(self, response: resources.PublicKey) -> resources.PublicKey: """Post-rpc interceptor for get_public_key - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_public_key_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the KeyManagementService server but before - it is returned to user code. + it is returned to user code. This `post_get_public_key` interceptor runs + before the `post_get_public_key_with_metadata` interceptor. """ return response + def post_get_public_key_with_metadata( + self, + response: resources.PublicKey, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.PublicKey, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_public_key + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the KeyManagementService server but before it is returned to user code. + + We recommend only using this `post_get_public_key_with_metadata` + interceptor in new development instead of the `post_get_public_key` interceptor. + When both interceptors are used, this `post_get_public_key_with_metadata` interceptor runs after the + `post_get_public_key` interceptor. The (possibly modified) response returned by + `post_get_public_key` will be passed to + `post_get_public_key_with_metadata`. + """ + return response, metadata + def pre_import_crypto_key_version( self, request: service.ImportCryptoKeyVersionRequest, @@ -666,12 +1015,35 @@ def post_import_crypto_key_version( ) -> resources.CryptoKeyVersion: """Post-rpc interceptor for import_crypto_key_version - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_import_crypto_key_version_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the KeyManagementService server but before - it is returned to user code. + it is returned to user code. This `post_import_crypto_key_version` interceptor runs + before the `post_import_crypto_key_version_with_metadata` interceptor. """ return response + def post_import_crypto_key_version_with_metadata( + self, + response: resources.CryptoKeyVersion, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.CryptoKeyVersion, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for import_crypto_key_version + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the KeyManagementService server but before it is returned to user code. + + We recommend only using this `post_import_crypto_key_version_with_metadata` + interceptor in new development instead of the `post_import_crypto_key_version` interceptor. + When both interceptors are used, this `post_import_crypto_key_version_with_metadata` interceptor runs after the + `post_import_crypto_key_version` interceptor. The (possibly modified) response returned by + `post_import_crypto_key_version` will be passed to + `post_import_crypto_key_version_with_metadata`. + """ + return response, metadata + def pre_list_crypto_keys( self, request: service.ListCryptoKeysRequest, @@ -689,12 +1061,35 @@ def post_list_crypto_keys( ) -> service.ListCryptoKeysResponse: """Post-rpc interceptor for list_crypto_keys - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_crypto_keys_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the KeyManagementService server but before - it is returned to user code. + it is returned to user code. This `post_list_crypto_keys` interceptor runs + before the `post_list_crypto_keys_with_metadata` interceptor. """ return response + def post_list_crypto_keys_with_metadata( + self, + response: service.ListCryptoKeysResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.ListCryptoKeysResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_crypto_keys + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the KeyManagementService server but before it is returned to user code. + + We recommend only using this `post_list_crypto_keys_with_metadata` + interceptor in new development instead of the `post_list_crypto_keys` interceptor. + When both interceptors are used, this `post_list_crypto_keys_with_metadata` interceptor runs after the + `post_list_crypto_keys` interceptor. The (possibly modified) response returned by + `post_list_crypto_keys` will be passed to + `post_list_crypto_keys_with_metadata`. + """ + return response, metadata + def pre_list_crypto_key_versions( self, request: service.ListCryptoKeyVersionsRequest, @@ -714,12 +1109,37 @@ def post_list_crypto_key_versions( ) -> service.ListCryptoKeyVersionsResponse: """Post-rpc interceptor for list_crypto_key_versions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_crypto_key_versions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the KeyManagementService server but before - it is returned to user code. + it is returned to user code. This `post_list_crypto_key_versions` interceptor runs + before the `post_list_crypto_key_versions_with_metadata` interceptor. """ return response + def post_list_crypto_key_versions_with_metadata( + self, + response: service.ListCryptoKeyVersionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service.ListCryptoKeyVersionsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_crypto_key_versions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the KeyManagementService server but before it is returned to user code. + + We recommend only using this `post_list_crypto_key_versions_with_metadata` + interceptor in new development instead of the `post_list_crypto_key_versions` interceptor. + When both interceptors are used, this `post_list_crypto_key_versions_with_metadata` interceptor runs after the + `post_list_crypto_key_versions` interceptor. The (possibly modified) response returned by + `post_list_crypto_key_versions` will be passed to + `post_list_crypto_key_versions_with_metadata`. + """ + return response, metadata + def pre_list_import_jobs( self, request: service.ListImportJobsRequest, @@ -737,12 +1157,35 @@ def post_list_import_jobs( ) -> service.ListImportJobsResponse: """Post-rpc interceptor for list_import_jobs - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_import_jobs_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the KeyManagementService server but before - it is returned to user code. + it is returned to user code. This `post_list_import_jobs` interceptor runs + before the `post_list_import_jobs_with_metadata` interceptor. """ return response + def post_list_import_jobs_with_metadata( + self, + response: service.ListImportJobsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.ListImportJobsResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_import_jobs + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the KeyManagementService server but before it is returned to user code. + + We recommend only using this `post_list_import_jobs_with_metadata` + interceptor in new development instead of the `post_list_import_jobs` interceptor. + When both interceptors are used, this `post_list_import_jobs_with_metadata` interceptor runs after the + `post_list_import_jobs` interceptor. The (possibly modified) response returned by + `post_list_import_jobs` will be passed to + `post_list_import_jobs_with_metadata`. + """ + return response, metadata + def pre_list_key_rings( self, request: service.ListKeyRingsRequest, @@ -760,12 +1203,35 @@ def post_list_key_rings( ) -> service.ListKeyRingsResponse: """Post-rpc interceptor for list_key_rings - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_key_rings_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the KeyManagementService server but before - it is returned to user code. + it is returned to user code. This `post_list_key_rings` interceptor runs + before the `post_list_key_rings_with_metadata` interceptor. """ return response + def post_list_key_rings_with_metadata( + self, + response: service.ListKeyRingsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.ListKeyRingsResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_key_rings + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the KeyManagementService server but before it is returned to user code. + + We recommend only using this `post_list_key_rings_with_metadata` + interceptor in new development instead of the `post_list_key_rings` interceptor. + When both interceptors are used, this `post_list_key_rings_with_metadata` interceptor runs after the + `post_list_key_rings` interceptor. The (possibly modified) response returned by + `post_list_key_rings` will be passed to + `post_list_key_rings_with_metadata`. + """ + return response, metadata + def pre_mac_sign( self, request: service.MacSignRequest, @@ -783,12 +1249,35 @@ def post_mac_sign( ) -> service.MacSignResponse: """Post-rpc interceptor for mac_sign - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_mac_sign_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the KeyManagementService server but before - it is returned to user code. + it is returned to user code. This `post_mac_sign` interceptor runs + before the `post_mac_sign_with_metadata` interceptor. """ return response + def post_mac_sign_with_metadata( + self, + response: service.MacSignResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.MacSignResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for mac_sign + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the KeyManagementService server but before it is returned to user code. + + We recommend only using this `post_mac_sign_with_metadata` + interceptor in new development instead of the `post_mac_sign` interceptor. + When both interceptors are used, this `post_mac_sign_with_metadata` interceptor runs after the + `post_mac_sign` interceptor. The (possibly modified) response returned by + `post_mac_sign` will be passed to + `post_mac_sign_with_metadata`. + """ + return response, metadata + def pre_mac_verify( self, request: service.MacVerifyRequest, @@ -806,12 +1295,35 @@ def post_mac_verify( ) -> service.MacVerifyResponse: """Post-rpc interceptor for mac_verify - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_mac_verify_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the KeyManagementService server but before - it is returned to user code. + it is returned to user code. This `post_mac_verify` interceptor runs + before the `post_mac_verify_with_metadata` interceptor. """ return response + def post_mac_verify_with_metadata( + self, + response: service.MacVerifyResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.MacVerifyResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for mac_verify + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the KeyManagementService server but before it is returned to user code. + + We recommend only using this `post_mac_verify_with_metadata` + interceptor in new development instead of the `post_mac_verify` interceptor. + When both interceptors are used, this `post_mac_verify_with_metadata` interceptor runs after the + `post_mac_verify` interceptor. The (possibly modified) response returned by + `post_mac_verify` will be passed to + `post_mac_verify_with_metadata`. + """ + return response, metadata + def pre_raw_decrypt( self, request: service.RawDecryptRequest, @@ -829,12 +1341,35 @@ def post_raw_decrypt( ) -> service.RawDecryptResponse: """Post-rpc interceptor for raw_decrypt - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_raw_decrypt_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the KeyManagementService server but before - it is returned to user code. + it is returned to user code. This `post_raw_decrypt` interceptor runs + before the `post_raw_decrypt_with_metadata` interceptor. """ return response + def post_raw_decrypt_with_metadata( + self, + response: service.RawDecryptResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.RawDecryptResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for raw_decrypt + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the KeyManagementService server but before it is returned to user code. + + We recommend only using this `post_raw_decrypt_with_metadata` + interceptor in new development instead of the `post_raw_decrypt` interceptor. + When both interceptors are used, this `post_raw_decrypt_with_metadata` interceptor runs after the + `post_raw_decrypt` interceptor. The (possibly modified) response returned by + `post_raw_decrypt` will be passed to + `post_raw_decrypt_with_metadata`. + """ + return response, metadata + def pre_raw_encrypt( self, request: service.RawEncryptRequest, @@ -852,12 +1387,35 @@ def post_raw_encrypt( ) -> service.RawEncryptResponse: """Post-rpc interceptor for raw_encrypt - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_raw_encrypt_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the KeyManagementService server but before - it is returned to user code. + it is returned to user code. This `post_raw_encrypt` interceptor runs + before the `post_raw_encrypt_with_metadata` interceptor. """ return response + def post_raw_encrypt_with_metadata( + self, + response: service.RawEncryptResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.RawEncryptResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for raw_encrypt + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the KeyManagementService server but before it is returned to user code. + + We recommend only using this `post_raw_encrypt_with_metadata` + interceptor in new development instead of the `post_raw_encrypt` interceptor. + When both interceptors are used, this `post_raw_encrypt_with_metadata` interceptor runs after the + `post_raw_encrypt` interceptor. The (possibly modified) response returned by + `post_raw_encrypt` will be passed to + `post_raw_encrypt_with_metadata`. + """ + return response, metadata + def pre_restore_crypto_key_version( self, request: service.RestoreCryptoKeyVersionRequest, @@ -877,12 +1435,35 @@ def post_restore_crypto_key_version( ) -> resources.CryptoKeyVersion: """Post-rpc interceptor for restore_crypto_key_version - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_restore_crypto_key_version_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the KeyManagementService server but before - it is returned to user code. + it is returned to user code. This `post_restore_crypto_key_version` interceptor runs + before the `post_restore_crypto_key_version_with_metadata` interceptor. """ return response + def post_restore_crypto_key_version_with_metadata( + self, + response: resources.CryptoKeyVersion, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.CryptoKeyVersion, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for restore_crypto_key_version + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the KeyManagementService server but before it is returned to user code. + + We recommend only using this `post_restore_crypto_key_version_with_metadata` + interceptor in new development instead of the `post_restore_crypto_key_version` interceptor. + When both interceptors are used, this `post_restore_crypto_key_version_with_metadata` interceptor runs after the + `post_restore_crypto_key_version` interceptor. The (possibly modified) response returned by + `post_restore_crypto_key_version` will be passed to + `post_restore_crypto_key_version_with_metadata`. + """ + return response, metadata + def pre_update_crypto_key( self, request: service.UpdateCryptoKeyRequest, @@ -900,12 +1481,35 @@ def post_update_crypto_key( ) -> resources.CryptoKey: """Post-rpc interceptor for update_crypto_key - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_crypto_key_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the KeyManagementService server but before - it is returned to user code. + it is returned to user code. This `post_update_crypto_key` interceptor runs + before the `post_update_crypto_key_with_metadata` interceptor. """ return response + def post_update_crypto_key_with_metadata( + self, + response: resources.CryptoKey, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.CryptoKey, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_crypto_key + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the KeyManagementService server but before it is returned to user code. + + We recommend only using this `post_update_crypto_key_with_metadata` + interceptor in new development instead of the `post_update_crypto_key` interceptor. + When both interceptors are used, this `post_update_crypto_key_with_metadata` interceptor runs after the + `post_update_crypto_key` interceptor. The (possibly modified) response returned by + `post_update_crypto_key` will be passed to + `post_update_crypto_key_with_metadata`. + """ + return response, metadata + def pre_update_crypto_key_primary_version( self, request: service.UpdateCryptoKeyPrimaryVersionRequest, @@ -926,12 +1530,35 @@ def post_update_crypto_key_primary_version( ) -> resources.CryptoKey: """Post-rpc interceptor for update_crypto_key_primary_version - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_crypto_key_primary_version_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the KeyManagementService server but before - it is returned to user code. + it is returned to user code. This `post_update_crypto_key_primary_version` interceptor runs + before the `post_update_crypto_key_primary_version_with_metadata` interceptor. """ return response + def post_update_crypto_key_primary_version_with_metadata( + self, + response: resources.CryptoKey, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.CryptoKey, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_crypto_key_primary_version + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the KeyManagementService server but before it is returned to user code. + + We recommend only using this `post_update_crypto_key_primary_version_with_metadata` + interceptor in new development instead of the `post_update_crypto_key_primary_version` interceptor. + When both interceptors are used, this `post_update_crypto_key_primary_version_with_metadata` interceptor runs after the + `post_update_crypto_key_primary_version` interceptor. The (possibly modified) response returned by + `post_update_crypto_key_primary_version` will be passed to + `post_update_crypto_key_primary_version_with_metadata`. + """ + return response, metadata + def pre_update_crypto_key_version( self, request: service.UpdateCryptoKeyVersionRequest, @@ -951,12 +1578,35 @@ def post_update_crypto_key_version( ) -> resources.CryptoKeyVersion: """Post-rpc interceptor for update_crypto_key_version - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_crypto_key_version_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the KeyManagementService server but before - it is returned to user code. + it is returned to user code. This `post_update_crypto_key_version` interceptor runs + before the `post_update_crypto_key_version_with_metadata` interceptor. """ return response + def post_update_crypto_key_version_with_metadata( + self, + response: resources.CryptoKeyVersion, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.CryptoKeyVersion, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_crypto_key_version + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the KeyManagementService server but before it is returned to user code. + + We recommend only using this `post_update_crypto_key_version_with_metadata` + interceptor in new development instead of the `post_update_crypto_key_version` interceptor. + When both interceptors are used, this `post_update_crypto_key_version_with_metadata` interceptor runs after the + `post_update_crypto_key_version` interceptor. The (possibly modified) response returned by + `post_update_crypto_key_version` will be passed to + `post_update_crypto_key_version_with_metadata`. + """ + return response, metadata + def pre_get_location( self, request: locations_pb2.GetLocationRequest, @@ -1333,6 +1983,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_asymmetric_decrypt(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_asymmetric_decrypt_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1485,6 +2139,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_asymmetric_sign(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_asymmetric_sign_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1644,6 +2302,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_crypto_key(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_crypto_key_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1811,6 +2473,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_crypto_key_version(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_crypto_key_version_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2006,6 +2672,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_import_job(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_import_job_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2157,6 +2827,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_key_ring(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_key_ring_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2307,6 +2981,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_decrypt(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_decrypt_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2473,6 +3151,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_destroy_crypto_key_version(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_destroy_crypto_key_version_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2623,6 +3305,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_encrypt(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_encrypt_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2777,6 +3463,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_generate_random_bytes(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_generate_random_bytes_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2930,6 +3620,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_crypto_key(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_crypto_key_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3091,6 +3785,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_crypto_key_version(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_crypto_key_version_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3278,6 +3976,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_import_job(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_import_job_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3423,6 +4125,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_key_ring(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_key_ring_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3569,6 +4275,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_public_key(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_public_key_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3736,6 +4446,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_import_crypto_key_version(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_import_crypto_key_version_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3882,6 +4596,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_crypto_keys(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_crypto_keys_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4030,6 +4748,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_crypto_key_versions(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_crypto_key_versions_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4178,6 +4900,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_import_jobs(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_import_jobs_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4322,6 +5048,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_key_rings(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_key_rings_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4472,6 +5202,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_mac_sign(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_mac_sign_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4622,6 +5356,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_mac_verify(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_mac_verify_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4772,6 +5510,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_raw_decrypt(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_raw_decrypt_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4922,6 +5664,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_raw_encrypt(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_raw_encrypt_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5088,6 +5834,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_restore_crypto_key_version(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_restore_crypto_key_version_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5247,6 +5997,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_crypto_key(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_crypto_key_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5409,6 +6163,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_crypto_key_primary_version(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_update_crypto_key_primary_version_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5576,6 +6337,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_crypto_key_version(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_crypto_key_version_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-kms/samples/generated_samples/snippet_metadata_google.cloud.kms.v1.json b/packages/google-cloud-kms/samples/generated_samples/snippet_metadata_google.cloud.kms.v1.json index 875d0b274b7d..31292c269f5b 100644 --- a/packages/google-cloud-kms/samples/generated_samples/snippet_metadata_google.cloud.kms.v1.json +++ b/packages/google-cloud-kms/samples/generated_samples/snippet_metadata_google.cloud.kms.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-kms", - "version": "3.2.2" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-kms/tests/unit/gapic/kms_v1/test_autokey.py b/packages/google-cloud-kms/tests/unit/gapic/kms_v1/test_autokey.py index 171a511c6720..fc591aa42d1c 100644 --- a/packages/google-cloud-kms/tests/unit/gapic/kms_v1/test_autokey.py +++ b/packages/google-cloud-kms/tests/unit/gapic/kms_v1/test_autokey.py @@ -74,6 +74,13 @@ ) from google.cloud.kms_v1.types import autokey +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -297,6 +304,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = AutokeyClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=["foo"]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + if show_cred_info: + assert error.details == ["foo", CRED_INFO_STRING] + else: + assert error.details == ["foo"] + + +@pytest.mark.parametrize("error_code", [401, 403, 404, 500]) +def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code): + cred = mock.Mock([]) + assert not hasattr(cred, "get_cred_info") + client = AutokeyClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -3275,10 +3325,13 @@ def test_create_key_handle_rest_interceptors(null_interceptor): ), mock.patch.object( transports.AutokeyRestInterceptor, "post_create_key_handle" ) as post, mock.patch.object( + transports.AutokeyRestInterceptor, "post_create_key_handle_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AutokeyRestInterceptor, "pre_create_key_handle" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = autokey.CreateKeyHandleRequest.pb(autokey.CreateKeyHandleRequest()) transcode.return_value = { "method": "post", @@ -3300,6 +3353,7 @@ def test_create_key_handle_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_key_handle( request, @@ -3311,6 +3365,7 @@ def test_create_key_handle_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_key_handle_rest_bad_request(request_type=autokey.GetKeyHandleRequest): @@ -3395,10 +3450,13 @@ def test_get_key_handle_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AutokeyRestInterceptor, "post_get_key_handle" ) as post, mock.patch.object( + transports.AutokeyRestInterceptor, "post_get_key_handle_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AutokeyRestInterceptor, "pre_get_key_handle" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = autokey.GetKeyHandleRequest.pb(autokey.GetKeyHandleRequest()) transcode.return_value = { "method": "post", @@ -3420,6 +3478,7 @@ def test_get_key_handle_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = autokey.KeyHandle() + post_with_metadata.return_value = autokey.KeyHandle(), metadata client.get_key_handle( request, @@ -3431,6 +3490,7 @@ def test_get_key_handle_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_key_handles_rest_bad_request(request_type=autokey.ListKeyHandlesRequest): @@ -3511,10 +3571,13 @@ def test_list_key_handles_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AutokeyRestInterceptor, "post_list_key_handles" ) as post, mock.patch.object( + transports.AutokeyRestInterceptor, "post_list_key_handles_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AutokeyRestInterceptor, "pre_list_key_handles" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = autokey.ListKeyHandlesRequest.pb(autokey.ListKeyHandlesRequest()) transcode.return_value = { "method": "post", @@ -3538,6 +3601,7 @@ def test_list_key_handles_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = autokey.ListKeyHandlesResponse() + post_with_metadata.return_value = autokey.ListKeyHandlesResponse(), metadata client.list_key_handles( request, @@ -3549,6 +3613,7 @@ def test_list_key_handles_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_location_rest_bad_request(request_type=locations_pb2.GetLocationRequest): diff --git a/packages/google-cloud-kms/tests/unit/gapic/kms_v1/test_autokey_admin.py b/packages/google-cloud-kms/tests/unit/gapic/kms_v1/test_autokey_admin.py index 79c9e8a5b8f9..c2f7c7dc8d73 100644 --- a/packages/google-cloud-kms/tests/unit/gapic/kms_v1/test_autokey_admin.py +++ b/packages/google-cloud-kms/tests/unit/gapic/kms_v1/test_autokey_admin.py @@ -65,6 +65,13 @@ ) from google.cloud.kms_v1.types import autokey_admin +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -308,6 +315,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = AutokeyAdminClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=["foo"]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + if show_cred_info: + assert error.details == ["foo", CRED_INFO_STRING] + else: + assert error.details == ["foo"] + + +@pytest.mark.parametrize("error_code", [401, 403, 404, 500]) +def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code): + cred = mock.Mock([]) + assert not hasattr(cred, "get_cred_info") + client = AutokeyAdminClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -3097,10 +3147,14 @@ def test_update_autokey_config_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AutokeyAdminRestInterceptor, "post_update_autokey_config" ) as post, mock.patch.object( + transports.AutokeyAdminRestInterceptor, + "post_update_autokey_config_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AutokeyAdminRestInterceptor, "pre_update_autokey_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = autokey_admin.UpdateAutokeyConfigRequest.pb( autokey_admin.UpdateAutokeyConfigRequest() ) @@ -3126,6 +3180,7 @@ def test_update_autokey_config_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = autokey_admin.AutokeyConfig() + post_with_metadata.return_value = autokey_admin.AutokeyConfig(), metadata client.update_autokey_config( request, @@ -3137,6 +3192,7 @@ def test_update_autokey_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_autokey_config_rest_bad_request( @@ -3225,10 +3281,13 @@ def test_get_autokey_config_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AutokeyAdminRestInterceptor, "post_get_autokey_config" ) as post, mock.patch.object( + transports.AutokeyAdminRestInterceptor, "post_get_autokey_config_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AutokeyAdminRestInterceptor, "pre_get_autokey_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = autokey_admin.GetAutokeyConfigRequest.pb( autokey_admin.GetAutokeyConfigRequest() ) @@ -3254,6 +3313,7 @@ def test_get_autokey_config_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = autokey_admin.AutokeyConfig() + post_with_metadata.return_value = autokey_admin.AutokeyConfig(), metadata client.get_autokey_config( request, @@ -3265,6 +3325,7 @@ def test_get_autokey_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_show_effective_autokey_config_rest_bad_request( @@ -3349,10 +3410,14 @@ def test_show_effective_autokey_config_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AutokeyAdminRestInterceptor, "post_show_effective_autokey_config" ) as post, mock.patch.object( + transports.AutokeyAdminRestInterceptor, + "post_show_effective_autokey_config_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AutokeyAdminRestInterceptor, "pre_show_effective_autokey_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = autokey_admin.ShowEffectiveAutokeyConfigRequest.pb( autokey_admin.ShowEffectiveAutokeyConfigRequest() ) @@ -3378,6 +3443,10 @@ def test_show_effective_autokey_config_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = autokey_admin.ShowEffectiveAutokeyConfigResponse() + post_with_metadata.return_value = ( + autokey_admin.ShowEffectiveAutokeyConfigResponse(), + metadata, + ) client.show_effective_autokey_config( request, @@ -3389,6 +3458,7 @@ def test_show_effective_autokey_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_location_rest_bad_request(request_type=locations_pb2.GetLocationRequest): diff --git a/packages/google-cloud-kms/tests/unit/gapic/kms_v1/test_ekm_service.py b/packages/google-cloud-kms/tests/unit/gapic/kms_v1/test_ekm_service.py index f3aa0be88d17..dbcdf6b5262f 100644 --- a/packages/google-cloud-kms/tests/unit/gapic/kms_v1/test_ekm_service.py +++ b/packages/google-cloud-kms/tests/unit/gapic/kms_v1/test_ekm_service.py @@ -67,6 +67,13 @@ ) from google.cloud.kms_v1.types import ekm_service +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -302,6 +309,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = EkmServiceClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=["foo"]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + if show_cred_info: + assert error.details == ["foo", CRED_INFO_STRING] + else: + assert error.details == ["foo"] + + +@pytest.mark.parametrize("error_code", [401, 403, 404, 500]) +def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code): + cred = mock.Mock([]) + assert not hasattr(cred, "get_cred_info") + client = EkmServiceClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -5687,10 +5737,13 @@ def test_list_ekm_connections_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.EkmServiceRestInterceptor, "post_list_ekm_connections" ) as post, mock.patch.object( + transports.EkmServiceRestInterceptor, "post_list_ekm_connections_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.EkmServiceRestInterceptor, "pre_list_ekm_connections" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = ekm_service.ListEkmConnectionsRequest.pb( ekm_service.ListEkmConnectionsRequest() ) @@ -5716,6 +5769,10 @@ def test_list_ekm_connections_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = ekm_service.ListEkmConnectionsResponse() + post_with_metadata.return_value = ( + ekm_service.ListEkmConnectionsResponse(), + metadata, + ) client.list_ekm_connections( request, @@ -5727,6 +5784,7 @@ def test_list_ekm_connections_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_ekm_connection_rest_bad_request( @@ -5820,10 +5878,13 @@ def test_get_ekm_connection_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.EkmServiceRestInterceptor, "post_get_ekm_connection" ) as post, mock.patch.object( + transports.EkmServiceRestInterceptor, "post_get_ekm_connection_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.EkmServiceRestInterceptor, "pre_get_ekm_connection" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = ekm_service.GetEkmConnectionRequest.pb( ekm_service.GetEkmConnectionRequest() ) @@ -5847,6 +5908,7 @@ def test_get_ekm_connection_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = ekm_service.EkmConnection() + post_with_metadata.return_value = ekm_service.EkmConnection(), metadata client.get_ekm_connection( request, @@ -5858,6 +5920,7 @@ def test_get_ekm_connection_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_ekm_connection_rest_bad_request( @@ -6048,10 +6111,13 @@ def test_create_ekm_connection_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.EkmServiceRestInterceptor, "post_create_ekm_connection" ) as post, mock.patch.object( + transports.EkmServiceRestInterceptor, "post_create_ekm_connection_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.EkmServiceRestInterceptor, "pre_create_ekm_connection" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = ekm_service.CreateEkmConnectionRequest.pb( ekm_service.CreateEkmConnectionRequest() ) @@ -6075,6 +6141,7 @@ def test_create_ekm_connection_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = ekm_service.EkmConnection() + post_with_metadata.return_value = ekm_service.EkmConnection(), metadata client.create_ekm_connection( request, @@ -6086,6 +6153,7 @@ def test_create_ekm_connection_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_ekm_connection_rest_bad_request( @@ -6284,10 +6352,13 @@ def test_update_ekm_connection_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.EkmServiceRestInterceptor, "post_update_ekm_connection" ) as post, mock.patch.object( + transports.EkmServiceRestInterceptor, "post_update_ekm_connection_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.EkmServiceRestInterceptor, "pre_update_ekm_connection" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = ekm_service.UpdateEkmConnectionRequest.pb( ekm_service.UpdateEkmConnectionRequest() ) @@ -6311,6 +6382,7 @@ def test_update_ekm_connection_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = ekm_service.EkmConnection() + post_with_metadata.return_value = ekm_service.EkmConnection(), metadata client.update_ekm_connection( request, @@ -6322,6 +6394,7 @@ def test_update_ekm_connection_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_ekm_config_rest_bad_request(request_type=ekm_service.GetEkmConfigRequest): @@ -6406,10 +6479,13 @@ def test_get_ekm_config_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.EkmServiceRestInterceptor, "post_get_ekm_config" ) as post, mock.patch.object( + transports.EkmServiceRestInterceptor, "post_get_ekm_config_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.EkmServiceRestInterceptor, "pre_get_ekm_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = ekm_service.GetEkmConfigRequest.pb( ekm_service.GetEkmConfigRequest() ) @@ -6433,6 +6509,7 @@ def test_get_ekm_config_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = ekm_service.EkmConfig() + post_with_metadata.return_value = ekm_service.EkmConfig(), metadata client.get_ekm_config( request, @@ -6444,6 +6521,7 @@ def test_get_ekm_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_ekm_config_rest_bad_request( @@ -6605,10 +6683,13 @@ def test_update_ekm_config_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.EkmServiceRestInterceptor, "post_update_ekm_config" ) as post, mock.patch.object( + transports.EkmServiceRestInterceptor, "post_update_ekm_config_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.EkmServiceRestInterceptor, "pre_update_ekm_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = ekm_service.UpdateEkmConfigRequest.pb( ekm_service.UpdateEkmConfigRequest() ) @@ -6632,6 +6713,7 @@ def test_update_ekm_config_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = ekm_service.EkmConfig() + post_with_metadata.return_value = ekm_service.EkmConfig(), metadata client.update_ekm_config( request, @@ -6643,6 +6725,7 @@ def test_update_ekm_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_verify_connectivity_rest_bad_request( @@ -6724,10 +6807,13 @@ def test_verify_connectivity_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.EkmServiceRestInterceptor, "post_verify_connectivity" ) as post, mock.patch.object( + transports.EkmServiceRestInterceptor, "post_verify_connectivity_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.EkmServiceRestInterceptor, "pre_verify_connectivity" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = ekm_service.VerifyConnectivityRequest.pb( ekm_service.VerifyConnectivityRequest() ) @@ -6753,6 +6839,10 @@ def test_verify_connectivity_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = ekm_service.VerifyConnectivityResponse() + post_with_metadata.return_value = ( + ekm_service.VerifyConnectivityResponse(), + metadata, + ) client.verify_connectivity( request, @@ -6764,6 +6854,7 @@ def test_verify_connectivity_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_location_rest_bad_request(request_type=locations_pb2.GetLocationRequest): diff --git a/packages/google-cloud-kms/tests/unit/gapic/kms_v1/test_key_management_service.py b/packages/google-cloud-kms/tests/unit/gapic/kms_v1/test_key_management_service.py index c7081cc8ad3b..24ecbb7b2ad8 100644 --- a/packages/google-cloud-kms/tests/unit/gapic/kms_v1/test_key_management_service.py +++ b/packages/google-cloud-kms/tests/unit/gapic/kms_v1/test_key_management_service.py @@ -69,6 +69,13 @@ ) from google.cloud.kms_v1.types import resources, service +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -342,6 +349,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = KeyManagementServiceClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=["foo"]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + if show_cred_info: + assert error.details == ["foo", CRED_INFO_STRING] + else: + assert error.details == ["foo"] + + +@pytest.mark.parametrize("error_code", [401, 403, 404, 500]) +def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code): + cred = mock.Mock([]) + assert not hasattr(cred, "get_cred_info") + client = KeyManagementServiceClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -18796,10 +18846,14 @@ def test_list_key_rings_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "post_list_key_rings" ) as post, mock.patch.object( + transports.KeyManagementServiceRestInterceptor, + "post_list_key_rings_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "pre_list_key_rings" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListKeyRingsRequest.pb(service.ListKeyRingsRequest()) transcode.return_value = { "method": "post", @@ -18823,6 +18877,7 @@ def test_list_key_rings_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListKeyRingsResponse() + post_with_metadata.return_value = service.ListKeyRingsResponse(), metadata client.list_key_rings( request, @@ -18834,6 +18889,7 @@ def test_list_key_rings_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_crypto_keys_rest_bad_request(request_type=service.ListCryptoKeysRequest): @@ -18918,10 +18974,14 @@ def test_list_crypto_keys_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "post_list_crypto_keys" ) as post, mock.patch.object( + transports.KeyManagementServiceRestInterceptor, + "post_list_crypto_keys_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "pre_list_crypto_keys" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListCryptoKeysRequest.pb(service.ListCryptoKeysRequest()) transcode.return_value = { "method": "post", @@ -18945,6 +19005,7 @@ def test_list_crypto_keys_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListCryptoKeysResponse() + post_with_metadata.return_value = service.ListCryptoKeysResponse(), metadata client.list_crypto_keys( request, @@ -18956,6 +19017,7 @@ def test_list_crypto_keys_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_crypto_key_versions_rest_bad_request( @@ -19046,10 +19108,14 @@ def test_list_crypto_key_versions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "post_list_crypto_key_versions" ) as post, mock.patch.object( + transports.KeyManagementServiceRestInterceptor, + "post_list_crypto_key_versions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "pre_list_crypto_key_versions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListCryptoKeyVersionsRequest.pb( service.ListCryptoKeyVersionsRequest() ) @@ -19075,6 +19141,10 @@ def test_list_crypto_key_versions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListCryptoKeyVersionsResponse() + post_with_metadata.return_value = ( + service.ListCryptoKeyVersionsResponse(), + metadata, + ) client.list_crypto_key_versions( request, @@ -19086,6 +19156,7 @@ def test_list_crypto_key_versions_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_import_jobs_rest_bad_request(request_type=service.ListImportJobsRequest): @@ -19170,10 +19241,14 @@ def test_list_import_jobs_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "post_list_import_jobs" ) as post, mock.patch.object( + transports.KeyManagementServiceRestInterceptor, + "post_list_import_jobs_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "pre_list_import_jobs" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListImportJobsRequest.pb(service.ListImportJobsRequest()) transcode.return_value = { "method": "post", @@ -19197,6 +19272,7 @@ def test_list_import_jobs_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListImportJobsResponse() + post_with_metadata.return_value = service.ListImportJobsResponse(), metadata client.list_import_jobs( request, @@ -19208,6 +19284,7 @@ def test_list_import_jobs_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_key_ring_rest_bad_request(request_type=service.GetKeyRingRequest): @@ -19290,10 +19367,14 @@ def test_get_key_ring_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "post_get_key_ring" ) as post, mock.patch.object( + transports.KeyManagementServiceRestInterceptor, + "post_get_key_ring_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "pre_get_key_ring" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetKeyRingRequest.pb(service.GetKeyRingRequest()) transcode.return_value = { "method": "post", @@ -19315,6 +19396,7 @@ def test_get_key_ring_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.KeyRing() + post_with_metadata.return_value = resources.KeyRing(), metadata client.get_key_ring( request, @@ -19326,6 +19408,7 @@ def test_get_key_ring_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_crypto_key_rest_bad_request(request_type=service.GetCryptoKeyRequest): @@ -19418,10 +19501,14 @@ def test_get_crypto_key_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "post_get_crypto_key" ) as post, mock.patch.object( + transports.KeyManagementServiceRestInterceptor, + "post_get_crypto_key_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "pre_get_crypto_key" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetCryptoKeyRequest.pb(service.GetCryptoKeyRequest()) transcode.return_value = { "method": "post", @@ -19443,6 +19530,7 @@ def test_get_crypto_key_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.CryptoKey() + post_with_metadata.return_value = resources.CryptoKey(), metadata client.get_crypto_key( request, @@ -19454,6 +19542,7 @@ def test_get_crypto_key_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_crypto_key_version_rest_bad_request( @@ -19567,10 +19656,14 @@ def test_get_crypto_key_version_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "post_get_crypto_key_version" ) as post, mock.patch.object( + transports.KeyManagementServiceRestInterceptor, + "post_get_crypto_key_version_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "pre_get_crypto_key_version" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetCryptoKeyVersionRequest.pb( service.GetCryptoKeyVersionRequest() ) @@ -19594,6 +19687,7 @@ def test_get_crypto_key_version_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.CryptoKeyVersion() + post_with_metadata.return_value = resources.CryptoKeyVersion(), metadata client.get_crypto_key_version( request, @@ -19605,6 +19699,7 @@ def test_get_crypto_key_version_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_public_key_rest_bad_request(request_type=service.GetPublicKeyRequest): @@ -19700,10 +19795,14 @@ def test_get_public_key_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "post_get_public_key" ) as post, mock.patch.object( + transports.KeyManagementServiceRestInterceptor, + "post_get_public_key_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "pre_get_public_key" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetPublicKeyRequest.pb(service.GetPublicKeyRequest()) transcode.return_value = { "method": "post", @@ -19725,6 +19824,7 @@ def test_get_public_key_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.PublicKey() + post_with_metadata.return_value = resources.PublicKey(), metadata client.get_public_key( request, @@ -19736,6 +19836,7 @@ def test_get_public_key_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_import_job_rest_bad_request(request_type=service.GetImportJobRequest): @@ -19831,10 +19932,14 @@ def test_get_import_job_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "post_get_import_job" ) as post, mock.patch.object( + transports.KeyManagementServiceRestInterceptor, + "post_get_import_job_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "pre_get_import_job" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetImportJobRequest.pb(service.GetImportJobRequest()) transcode.return_value = { "method": "post", @@ -19856,6 +19961,7 @@ def test_get_import_job_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.ImportJob() + post_with_metadata.return_value = resources.ImportJob(), metadata client.get_import_job( request, @@ -19867,6 +19973,7 @@ def test_get_import_job_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_key_ring_rest_bad_request(request_type=service.CreateKeyRingRequest): @@ -20020,10 +20127,14 @@ def test_create_key_ring_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "post_create_key_ring" ) as post, mock.patch.object( + transports.KeyManagementServiceRestInterceptor, + "post_create_key_ring_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "pre_create_key_ring" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateKeyRingRequest.pb(service.CreateKeyRingRequest()) transcode.return_value = { "method": "post", @@ -20045,6 +20156,7 @@ def test_create_key_ring_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.KeyRing() + post_with_metadata.return_value = resources.KeyRing(), metadata client.create_key_ring( request, @@ -20056,6 +20168,7 @@ def test_create_key_ring_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_crypto_key_rest_bad_request( @@ -20261,10 +20374,14 @@ def test_create_crypto_key_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "post_create_crypto_key" ) as post, mock.patch.object( + transports.KeyManagementServiceRestInterceptor, + "post_create_crypto_key_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "pre_create_crypto_key" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateCryptoKeyRequest.pb(service.CreateCryptoKeyRequest()) transcode.return_value = { "method": "post", @@ -20286,6 +20403,7 @@ def test_create_crypto_key_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.CryptoKey() + post_with_metadata.return_value = resources.CryptoKey(), metadata client.create_crypto_key( request, @@ -20297,6 +20415,7 @@ def test_create_crypto_key_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_crypto_key_version_rest_bad_request( @@ -20512,10 +20631,14 @@ def test_create_crypto_key_version_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "post_create_crypto_key_version" ) as post, mock.patch.object( + transports.KeyManagementServiceRestInterceptor, + "post_create_crypto_key_version_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "pre_create_crypto_key_version" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateCryptoKeyVersionRequest.pb( service.CreateCryptoKeyVersionRequest() ) @@ -20539,6 +20662,7 @@ def test_create_crypto_key_version_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.CryptoKeyVersion() + post_with_metadata.return_value = resources.CryptoKeyVersion(), metadata client.create_crypto_key_version( request, @@ -20550,6 +20674,7 @@ def test_create_crypto_key_version_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_import_crypto_key_version_rest_bad_request( @@ -20663,10 +20788,14 @@ def test_import_crypto_key_version_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "post_import_crypto_key_version" ) as post, mock.patch.object( + transports.KeyManagementServiceRestInterceptor, + "post_import_crypto_key_version_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "pre_import_crypto_key_version" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ImportCryptoKeyVersionRequest.pb( service.ImportCryptoKeyVersionRequest() ) @@ -20690,6 +20819,7 @@ def test_import_crypto_key_version_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.CryptoKeyVersion() + post_with_metadata.return_value = resources.CryptoKeyVersion(), metadata client.import_crypto_key_version( request, @@ -20701,6 +20831,7 @@ def test_import_crypto_key_version_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_import_job_rest_bad_request( @@ -20887,10 +21018,14 @@ def test_create_import_job_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "post_create_import_job" ) as post, mock.patch.object( + transports.KeyManagementServiceRestInterceptor, + "post_create_import_job_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "pre_create_import_job" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateImportJobRequest.pb(service.CreateImportJobRequest()) transcode.return_value = { "method": "post", @@ -20912,6 +21047,7 @@ def test_create_import_job_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.ImportJob() + post_with_metadata.return_value = resources.ImportJob(), metadata client.create_import_job( request, @@ -20923,6 +21059,7 @@ def test_create_import_job_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_crypto_key_rest_bad_request( @@ -21136,10 +21273,14 @@ def test_update_crypto_key_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "post_update_crypto_key" ) as post, mock.patch.object( + transports.KeyManagementServiceRestInterceptor, + "post_update_crypto_key_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "pre_update_crypto_key" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.UpdateCryptoKeyRequest.pb(service.UpdateCryptoKeyRequest()) transcode.return_value = { "method": "post", @@ -21161,6 +21302,7 @@ def test_update_crypto_key_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.CryptoKey() + post_with_metadata.return_value = resources.CryptoKey(), metadata client.update_crypto_key( request, @@ -21172,6 +21314,7 @@ def test_update_crypto_key_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_crypto_key_version_rest_bad_request( @@ -21391,10 +21534,14 @@ def test_update_crypto_key_version_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "post_update_crypto_key_version" ) as post, mock.patch.object( + transports.KeyManagementServiceRestInterceptor, + "post_update_crypto_key_version_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "pre_update_crypto_key_version" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.UpdateCryptoKeyVersionRequest.pb( service.UpdateCryptoKeyVersionRequest() ) @@ -21418,6 +21565,7 @@ def test_update_crypto_key_version_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.CryptoKeyVersion() + post_with_metadata.return_value = resources.CryptoKeyVersion(), metadata client.update_crypto_key_version( request, @@ -21429,6 +21577,7 @@ def test_update_crypto_key_version_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_crypto_key_primary_version_rest_bad_request( @@ -21524,11 +21673,15 @@ def test_update_crypto_key_primary_version_rest_interceptors(null_interceptor): transports.KeyManagementServiceRestInterceptor, "post_update_crypto_key_primary_version", ) as post, mock.patch.object( + transports.KeyManagementServiceRestInterceptor, + "post_update_crypto_key_primary_version_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "pre_update_crypto_key_primary_version", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.UpdateCryptoKeyPrimaryVersionRequest.pb( service.UpdateCryptoKeyPrimaryVersionRequest() ) @@ -21552,6 +21705,7 @@ def test_update_crypto_key_primary_version_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.CryptoKey() + post_with_metadata.return_value = resources.CryptoKey(), metadata client.update_crypto_key_primary_version( request, @@ -21563,6 +21717,7 @@ def test_update_crypto_key_primary_version_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_destroy_crypto_key_version_rest_bad_request( @@ -21677,10 +21832,14 @@ def test_destroy_crypto_key_version_rest_interceptors(null_interceptor): transports.KeyManagementServiceRestInterceptor, "post_destroy_crypto_key_version", ) as post, mock.patch.object( + transports.KeyManagementServiceRestInterceptor, + "post_destroy_crypto_key_version_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "pre_destroy_crypto_key_version" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.DestroyCryptoKeyVersionRequest.pb( service.DestroyCryptoKeyVersionRequest() ) @@ -21704,6 +21863,7 @@ def test_destroy_crypto_key_version_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.CryptoKeyVersion() + post_with_metadata.return_value = resources.CryptoKeyVersion(), metadata client.destroy_crypto_key_version( request, @@ -21715,6 +21875,7 @@ def test_destroy_crypto_key_version_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_restore_crypto_key_version_rest_bad_request( @@ -21829,10 +21990,14 @@ def test_restore_crypto_key_version_rest_interceptors(null_interceptor): transports.KeyManagementServiceRestInterceptor, "post_restore_crypto_key_version", ) as post, mock.patch.object( + transports.KeyManagementServiceRestInterceptor, + "post_restore_crypto_key_version_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "pre_restore_crypto_key_version" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.RestoreCryptoKeyVersionRequest.pb( service.RestoreCryptoKeyVersionRequest() ) @@ -21856,6 +22021,7 @@ def test_restore_crypto_key_version_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.CryptoKeyVersion() + post_with_metadata.return_value = resources.CryptoKeyVersion(), metadata client.restore_crypto_key_version( request, @@ -21867,6 +22033,7 @@ def test_restore_crypto_key_version_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_encrypt_rest_bad_request(request_type=service.EncryptRequest): @@ -21961,10 +22128,13 @@ def test_encrypt_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "post_encrypt" ) as post, mock.patch.object( + transports.KeyManagementServiceRestInterceptor, "post_encrypt_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "pre_encrypt" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.EncryptRequest.pb(service.EncryptRequest()) transcode.return_value = { "method": "post", @@ -21986,6 +22156,7 @@ def test_encrypt_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.EncryptResponse() + post_with_metadata.return_value = service.EncryptResponse(), metadata client.encrypt( request, @@ -21997,6 +22168,7 @@ def test_encrypt_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_decrypt_rest_bad_request(request_type=service.DecryptRequest): @@ -22087,10 +22259,13 @@ def test_decrypt_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "post_decrypt" ) as post, mock.patch.object( + transports.KeyManagementServiceRestInterceptor, "post_decrypt_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "pre_decrypt" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.DecryptRequest.pb(service.DecryptRequest()) transcode.return_value = { "method": "post", @@ -22112,6 +22287,7 @@ def test_decrypt_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.DecryptResponse() + post_with_metadata.return_value = service.DecryptResponse(), metadata client.decrypt( request, @@ -22123,6 +22299,7 @@ def test_decrypt_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_raw_encrypt_rest_bad_request(request_type=service.RawEncryptRequest): @@ -22223,10 +22400,13 @@ def test_raw_encrypt_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "post_raw_encrypt" ) as post, mock.patch.object( + transports.KeyManagementServiceRestInterceptor, "post_raw_encrypt_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "pre_raw_encrypt" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.RawEncryptRequest.pb(service.RawEncryptRequest()) transcode.return_value = { "method": "post", @@ -22248,6 +22428,7 @@ def test_raw_encrypt_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.RawEncryptResponse() + post_with_metadata.return_value = service.RawEncryptResponse(), metadata client.raw_encrypt( request, @@ -22259,6 +22440,7 @@ def test_raw_encrypt_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_raw_decrypt_rest_bad_request(request_type=service.RawDecryptRequest): @@ -22353,10 +22535,13 @@ def test_raw_decrypt_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "post_raw_decrypt" ) as post, mock.patch.object( + transports.KeyManagementServiceRestInterceptor, "post_raw_decrypt_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "pre_raw_decrypt" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.RawDecryptRequest.pb(service.RawDecryptRequest()) transcode.return_value = { "method": "post", @@ -22378,6 +22563,7 @@ def test_raw_decrypt_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.RawDecryptResponse() + post_with_metadata.return_value = service.RawDecryptResponse(), metadata client.raw_decrypt( request, @@ -22389,6 +22575,7 @@ def test_raw_decrypt_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_asymmetric_sign_rest_bad_request(request_type=service.AsymmetricSignRequest): @@ -22483,10 +22670,14 @@ def test_asymmetric_sign_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "post_asymmetric_sign" ) as post, mock.patch.object( + transports.KeyManagementServiceRestInterceptor, + "post_asymmetric_sign_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "pre_asymmetric_sign" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.AsymmetricSignRequest.pb(service.AsymmetricSignRequest()) transcode.return_value = { "method": "post", @@ -22510,6 +22701,7 @@ def test_asymmetric_sign_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.AsymmetricSignResponse() + post_with_metadata.return_value = service.AsymmetricSignResponse(), metadata client.asymmetric_sign( request, @@ -22521,6 +22713,7 @@ def test_asymmetric_sign_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_asymmetric_decrypt_rest_bad_request( @@ -22613,10 +22806,14 @@ def test_asymmetric_decrypt_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "post_asymmetric_decrypt" ) as post, mock.patch.object( + transports.KeyManagementServiceRestInterceptor, + "post_asymmetric_decrypt_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "pre_asymmetric_decrypt" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.AsymmetricDecryptRequest.pb( service.AsymmetricDecryptRequest() ) @@ -22642,6 +22839,7 @@ def test_asymmetric_decrypt_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.AsymmetricDecryptResponse() + post_with_metadata.return_value = service.AsymmetricDecryptResponse(), metadata client.asymmetric_decrypt( request, @@ -22653,6 +22851,7 @@ def test_asymmetric_decrypt_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_mac_sign_rest_bad_request(request_type=service.MacSignRequest): @@ -22745,10 +22944,13 @@ def test_mac_sign_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "post_mac_sign" ) as post, mock.patch.object( + transports.KeyManagementServiceRestInterceptor, "post_mac_sign_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "pre_mac_sign" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.MacSignRequest.pb(service.MacSignRequest()) transcode.return_value = { "method": "post", @@ -22770,6 +22972,7 @@ def test_mac_sign_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.MacSignResponse() + post_with_metadata.return_value = service.MacSignResponse(), metadata client.mac_sign( request, @@ -22781,6 +22984,7 @@ def test_mac_sign_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_mac_verify_rest_bad_request(request_type=service.MacVerifyRequest): @@ -22877,10 +23081,13 @@ def test_mac_verify_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "post_mac_verify" ) as post, mock.patch.object( + transports.KeyManagementServiceRestInterceptor, "post_mac_verify_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "pre_mac_verify" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.MacVerifyRequest.pb(service.MacVerifyRequest()) transcode.return_value = { "method": "post", @@ -22902,6 +23109,7 @@ def test_mac_verify_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.MacVerifyResponse() + post_with_metadata.return_value = service.MacVerifyResponse(), metadata client.mac_verify( request, @@ -22913,6 +23121,7 @@ def test_mac_verify_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_generate_random_bytes_rest_bad_request( @@ -22997,10 +23206,14 @@ def test_generate_random_bytes_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "post_generate_random_bytes" ) as post, mock.patch.object( + transports.KeyManagementServiceRestInterceptor, + "post_generate_random_bytes_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.KeyManagementServiceRestInterceptor, "pre_generate_random_bytes" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GenerateRandomBytesRequest.pb( service.GenerateRandomBytesRequest() ) @@ -23026,6 +23239,10 @@ def test_generate_random_bytes_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.GenerateRandomBytesResponse() + post_with_metadata.return_value = ( + service.GenerateRandomBytesResponse(), + metadata, + ) client.generate_random_bytes( request, @@ -23037,6 +23254,7 @@ def test_generate_random_bytes_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_location_rest_bad_request(request_type=locations_pb2.GetLocationRequest): diff --git a/packages/google-cloud-language/google/cloud/language/gapic_version.py b/packages/google-cloud-language/google/cloud/language/gapic_version.py index e154065d8da8..558c8aab67c5 100644 --- a/packages/google-cloud-language/google/cloud/language/gapic_version.py +++ b/packages/google-cloud-language/google/cloud/language/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "2.16.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-language/google/cloud/language_v1/gapic_version.py b/packages/google-cloud-language/google/cloud/language_v1/gapic_version.py index e154065d8da8..558c8aab67c5 100644 --- a/packages/google-cloud-language/google/cloud/language_v1/gapic_version.py +++ b/packages/google-cloud-language/google/cloud/language_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "2.16.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-language/google/cloud/language_v1/services/language_service/client.py b/packages/google-cloud-language/google/cloud/language_v1/services/language_service/client.py index 2058479edad8..9f14d5f9cb02 100644 --- a/packages/google-cloud-language/google/cloud/language_v1/services/language_service/client.py +++ b/packages/google-cloud-language/google/cloud/language_v1/services/language_service/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -463,6 +465,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. diff --git a/packages/google-cloud-language/google/cloud/language_v1/services/language_service/transports/rest.py b/packages/google-cloud-language/google/cloud/language_v1/services/language_service/transports/rest.py index 73a3c51d80e6..75907eaf35fc 100644 --- a/packages/google-cloud-language/google/cloud/language_v1/services/language_service/transports/rest.py +++ b/packages/google-cloud-language/google/cloud/language_v1/services/language_service/transports/rest.py @@ -149,12 +149,38 @@ def post_analyze_entities( ) -> language_service.AnalyzeEntitiesResponse: """Post-rpc interceptor for analyze_entities - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_analyze_entities_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the LanguageService server but before - it is returned to user code. + it is returned to user code. This `post_analyze_entities` interceptor runs + before the `post_analyze_entities_with_metadata` interceptor. """ return response + def post_analyze_entities_with_metadata( + self, + response: language_service.AnalyzeEntitiesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + language_service.AnalyzeEntitiesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for analyze_entities + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the LanguageService server but before it is returned to user code. + + We recommend only using this `post_analyze_entities_with_metadata` + interceptor in new development instead of the `post_analyze_entities` interceptor. + When both interceptors are used, this `post_analyze_entities_with_metadata` interceptor runs after the + `post_analyze_entities` interceptor. The (possibly modified) response returned by + `post_analyze_entities` will be passed to + `post_analyze_entities_with_metadata`. + """ + return response, metadata + def pre_analyze_entity_sentiment( self, request: language_service.AnalyzeEntitySentimentRequest, @@ -175,12 +201,38 @@ def post_analyze_entity_sentiment( ) -> language_service.AnalyzeEntitySentimentResponse: """Post-rpc interceptor for analyze_entity_sentiment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_analyze_entity_sentiment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the LanguageService server but before - it is returned to user code. + it is returned to user code. This `post_analyze_entity_sentiment` interceptor runs + before the `post_analyze_entity_sentiment_with_metadata` interceptor. """ return response + def post_analyze_entity_sentiment_with_metadata( + self, + response: language_service.AnalyzeEntitySentimentResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + language_service.AnalyzeEntitySentimentResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for analyze_entity_sentiment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the LanguageService server but before it is returned to user code. + + We recommend only using this `post_analyze_entity_sentiment_with_metadata` + interceptor in new development instead of the `post_analyze_entity_sentiment` interceptor. + When both interceptors are used, this `post_analyze_entity_sentiment_with_metadata` interceptor runs after the + `post_analyze_entity_sentiment` interceptor. The (possibly modified) response returned by + `post_analyze_entity_sentiment` will be passed to + `post_analyze_entity_sentiment_with_metadata`. + """ + return response, metadata + def pre_analyze_sentiment( self, request: language_service.AnalyzeSentimentRequest, @@ -201,12 +253,38 @@ def post_analyze_sentiment( ) -> language_service.AnalyzeSentimentResponse: """Post-rpc interceptor for analyze_sentiment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_analyze_sentiment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the LanguageService server but before - it is returned to user code. + it is returned to user code. This `post_analyze_sentiment` interceptor runs + before the `post_analyze_sentiment_with_metadata` interceptor. """ return response + def post_analyze_sentiment_with_metadata( + self, + response: language_service.AnalyzeSentimentResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + language_service.AnalyzeSentimentResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for analyze_sentiment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the LanguageService server but before it is returned to user code. + + We recommend only using this `post_analyze_sentiment_with_metadata` + interceptor in new development instead of the `post_analyze_sentiment` interceptor. + When both interceptors are used, this `post_analyze_sentiment_with_metadata` interceptor runs after the + `post_analyze_sentiment` interceptor. The (possibly modified) response returned by + `post_analyze_sentiment` will be passed to + `post_analyze_sentiment_with_metadata`. + """ + return response, metadata + def pre_analyze_syntax( self, request: language_service.AnalyzeSyntaxRequest, @@ -226,12 +304,37 @@ def post_analyze_syntax( ) -> language_service.AnalyzeSyntaxResponse: """Post-rpc interceptor for analyze_syntax - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_analyze_syntax_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the LanguageService server but before - it is returned to user code. + it is returned to user code. This `post_analyze_syntax` interceptor runs + before the `post_analyze_syntax_with_metadata` interceptor. """ return response + def post_analyze_syntax_with_metadata( + self, + response: language_service.AnalyzeSyntaxResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + language_service.AnalyzeSyntaxResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for analyze_syntax + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the LanguageService server but before it is returned to user code. + + We recommend only using this `post_analyze_syntax_with_metadata` + interceptor in new development instead of the `post_analyze_syntax` interceptor. + When both interceptors are used, this `post_analyze_syntax_with_metadata` interceptor runs after the + `post_analyze_syntax` interceptor. The (possibly modified) response returned by + `post_analyze_syntax` will be passed to + `post_analyze_syntax_with_metadata`. + """ + return response, metadata + def pre_annotate_text( self, request: language_service.AnnotateTextRequest, @@ -251,12 +354,37 @@ def post_annotate_text( ) -> language_service.AnnotateTextResponse: """Post-rpc interceptor for annotate_text - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_annotate_text_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the LanguageService server but before - it is returned to user code. + it is returned to user code. This `post_annotate_text` interceptor runs + before the `post_annotate_text_with_metadata` interceptor. """ return response + def post_annotate_text_with_metadata( + self, + response: language_service.AnnotateTextResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + language_service.AnnotateTextResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for annotate_text + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the LanguageService server but before it is returned to user code. + + We recommend only using this `post_annotate_text_with_metadata` + interceptor in new development instead of the `post_annotate_text` interceptor. + When both interceptors are used, this `post_annotate_text_with_metadata` interceptor runs after the + `post_annotate_text` interceptor. The (possibly modified) response returned by + `post_annotate_text` will be passed to + `post_annotate_text_with_metadata`. + """ + return response, metadata + def pre_classify_text( self, request: language_service.ClassifyTextRequest, @@ -276,12 +404,37 @@ def post_classify_text( ) -> language_service.ClassifyTextResponse: """Post-rpc interceptor for classify_text - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_classify_text_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the LanguageService server but before - it is returned to user code. + it is returned to user code. This `post_classify_text` interceptor runs + before the `post_classify_text_with_metadata` interceptor. """ return response + def post_classify_text_with_metadata( + self, + response: language_service.ClassifyTextResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + language_service.ClassifyTextResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for classify_text + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the LanguageService server but before it is returned to user code. + + We recommend only using this `post_classify_text_with_metadata` + interceptor in new development instead of the `post_classify_text` interceptor. + When both interceptors are used, this `post_classify_text_with_metadata` interceptor runs after the + `post_classify_text` interceptor. The (possibly modified) response returned by + `post_classify_text` will be passed to + `post_classify_text_with_metadata`. + """ + return response, metadata + def pre_moderate_text( self, request: language_service.ModerateTextRequest, @@ -301,12 +454,37 @@ def post_moderate_text( ) -> language_service.ModerateTextResponse: """Post-rpc interceptor for moderate_text - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_moderate_text_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the LanguageService server but before - it is returned to user code. + it is returned to user code. This `post_moderate_text` interceptor runs + before the `post_moderate_text_with_metadata` interceptor. """ return response + def post_moderate_text_with_metadata( + self, + response: language_service.ModerateTextResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + language_service.ModerateTextResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for moderate_text + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the LanguageService server but before it is returned to user code. + + We recommend only using this `post_moderate_text_with_metadata` + interceptor in new development instead of the `post_moderate_text` interceptor. + When both interceptors are used, this `post_moderate_text_with_metadata` interceptor runs after the + `post_moderate_text` interceptor. The (possibly modified) response returned by + `post_moderate_text` will be passed to + `post_moderate_text_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class LanguageServiceRestStub: @@ -520,6 +698,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_analyze_entities(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_analyze_entities_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -676,6 +858,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_analyze_entity_sentiment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_analyze_entity_sentiment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -831,6 +1017,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_analyze_sentiment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_analyze_sentiment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -979,6 +1169,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_analyze_syntax(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_analyze_syntax_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1132,6 +1326,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_annotate_text(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_annotate_text_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1283,6 +1481,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_classify_text(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_classify_text_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1434,6 +1636,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_moderate_text(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_moderate_text_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-language/google/cloud/language_v1beta2/gapic_version.py b/packages/google-cloud-language/google/cloud/language_v1beta2/gapic_version.py index e154065d8da8..558c8aab67c5 100644 --- a/packages/google-cloud-language/google/cloud/language_v1beta2/gapic_version.py +++ b/packages/google-cloud-language/google/cloud/language_v1beta2/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "2.16.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-language/google/cloud/language_v1beta2/services/language_service/client.py b/packages/google-cloud-language/google/cloud/language_v1beta2/services/language_service/client.py index 5d8084a08c12..502d26195fba 100644 --- a/packages/google-cloud-language/google/cloud/language_v1beta2/services/language_service/client.py +++ b/packages/google-cloud-language/google/cloud/language_v1beta2/services/language_service/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -463,6 +465,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. diff --git a/packages/google-cloud-language/google/cloud/language_v1beta2/services/language_service/transports/rest.py b/packages/google-cloud-language/google/cloud/language_v1beta2/services/language_service/transports/rest.py index 6f6988dfb252..4330b43743a2 100644 --- a/packages/google-cloud-language/google/cloud/language_v1beta2/services/language_service/transports/rest.py +++ b/packages/google-cloud-language/google/cloud/language_v1beta2/services/language_service/transports/rest.py @@ -149,12 +149,38 @@ def post_analyze_entities( ) -> language_service.AnalyzeEntitiesResponse: """Post-rpc interceptor for analyze_entities - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_analyze_entities_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the LanguageService server but before - it is returned to user code. + it is returned to user code. This `post_analyze_entities` interceptor runs + before the `post_analyze_entities_with_metadata` interceptor. """ return response + def post_analyze_entities_with_metadata( + self, + response: language_service.AnalyzeEntitiesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + language_service.AnalyzeEntitiesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for analyze_entities + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the LanguageService server but before it is returned to user code. + + We recommend only using this `post_analyze_entities_with_metadata` + interceptor in new development instead of the `post_analyze_entities` interceptor. + When both interceptors are used, this `post_analyze_entities_with_metadata` interceptor runs after the + `post_analyze_entities` interceptor. The (possibly modified) response returned by + `post_analyze_entities` will be passed to + `post_analyze_entities_with_metadata`. + """ + return response, metadata + def pre_analyze_entity_sentiment( self, request: language_service.AnalyzeEntitySentimentRequest, @@ -175,12 +201,38 @@ def post_analyze_entity_sentiment( ) -> language_service.AnalyzeEntitySentimentResponse: """Post-rpc interceptor for analyze_entity_sentiment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_analyze_entity_sentiment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the LanguageService server but before - it is returned to user code. + it is returned to user code. This `post_analyze_entity_sentiment` interceptor runs + before the `post_analyze_entity_sentiment_with_metadata` interceptor. """ return response + def post_analyze_entity_sentiment_with_metadata( + self, + response: language_service.AnalyzeEntitySentimentResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + language_service.AnalyzeEntitySentimentResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for analyze_entity_sentiment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the LanguageService server but before it is returned to user code. + + We recommend only using this `post_analyze_entity_sentiment_with_metadata` + interceptor in new development instead of the `post_analyze_entity_sentiment` interceptor. + When both interceptors are used, this `post_analyze_entity_sentiment_with_metadata` interceptor runs after the + `post_analyze_entity_sentiment` interceptor. The (possibly modified) response returned by + `post_analyze_entity_sentiment` will be passed to + `post_analyze_entity_sentiment_with_metadata`. + """ + return response, metadata + def pre_analyze_sentiment( self, request: language_service.AnalyzeSentimentRequest, @@ -201,12 +253,38 @@ def post_analyze_sentiment( ) -> language_service.AnalyzeSentimentResponse: """Post-rpc interceptor for analyze_sentiment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_analyze_sentiment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the LanguageService server but before - it is returned to user code. + it is returned to user code. This `post_analyze_sentiment` interceptor runs + before the `post_analyze_sentiment_with_metadata` interceptor. """ return response + def post_analyze_sentiment_with_metadata( + self, + response: language_service.AnalyzeSentimentResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + language_service.AnalyzeSentimentResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for analyze_sentiment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the LanguageService server but before it is returned to user code. + + We recommend only using this `post_analyze_sentiment_with_metadata` + interceptor in new development instead of the `post_analyze_sentiment` interceptor. + When both interceptors are used, this `post_analyze_sentiment_with_metadata` interceptor runs after the + `post_analyze_sentiment` interceptor. The (possibly modified) response returned by + `post_analyze_sentiment` will be passed to + `post_analyze_sentiment_with_metadata`. + """ + return response, metadata + def pre_analyze_syntax( self, request: language_service.AnalyzeSyntaxRequest, @@ -226,12 +304,37 @@ def post_analyze_syntax( ) -> language_service.AnalyzeSyntaxResponse: """Post-rpc interceptor for analyze_syntax - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_analyze_syntax_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the LanguageService server but before - it is returned to user code. + it is returned to user code. This `post_analyze_syntax` interceptor runs + before the `post_analyze_syntax_with_metadata` interceptor. """ return response + def post_analyze_syntax_with_metadata( + self, + response: language_service.AnalyzeSyntaxResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + language_service.AnalyzeSyntaxResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for analyze_syntax + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the LanguageService server but before it is returned to user code. + + We recommend only using this `post_analyze_syntax_with_metadata` + interceptor in new development instead of the `post_analyze_syntax` interceptor. + When both interceptors are used, this `post_analyze_syntax_with_metadata` interceptor runs after the + `post_analyze_syntax` interceptor. The (possibly modified) response returned by + `post_analyze_syntax` will be passed to + `post_analyze_syntax_with_metadata`. + """ + return response, metadata + def pre_annotate_text( self, request: language_service.AnnotateTextRequest, @@ -251,12 +354,37 @@ def post_annotate_text( ) -> language_service.AnnotateTextResponse: """Post-rpc interceptor for annotate_text - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_annotate_text_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the LanguageService server but before - it is returned to user code. + it is returned to user code. This `post_annotate_text` interceptor runs + before the `post_annotate_text_with_metadata` interceptor. """ return response + def post_annotate_text_with_metadata( + self, + response: language_service.AnnotateTextResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + language_service.AnnotateTextResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for annotate_text + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the LanguageService server but before it is returned to user code. + + We recommend only using this `post_annotate_text_with_metadata` + interceptor in new development instead of the `post_annotate_text` interceptor. + When both interceptors are used, this `post_annotate_text_with_metadata` interceptor runs after the + `post_annotate_text` interceptor. The (possibly modified) response returned by + `post_annotate_text` will be passed to + `post_annotate_text_with_metadata`. + """ + return response, metadata + def pre_classify_text( self, request: language_service.ClassifyTextRequest, @@ -276,12 +404,37 @@ def post_classify_text( ) -> language_service.ClassifyTextResponse: """Post-rpc interceptor for classify_text - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_classify_text_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the LanguageService server but before - it is returned to user code. + it is returned to user code. This `post_classify_text` interceptor runs + before the `post_classify_text_with_metadata` interceptor. """ return response + def post_classify_text_with_metadata( + self, + response: language_service.ClassifyTextResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + language_service.ClassifyTextResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for classify_text + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the LanguageService server but before it is returned to user code. + + We recommend only using this `post_classify_text_with_metadata` + interceptor in new development instead of the `post_classify_text` interceptor. + When both interceptors are used, this `post_classify_text_with_metadata` interceptor runs after the + `post_classify_text` interceptor. The (possibly modified) response returned by + `post_classify_text` will be passed to + `post_classify_text_with_metadata`. + """ + return response, metadata + def pre_moderate_text( self, request: language_service.ModerateTextRequest, @@ -301,12 +454,37 @@ def post_moderate_text( ) -> language_service.ModerateTextResponse: """Post-rpc interceptor for moderate_text - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_moderate_text_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the LanguageService server but before - it is returned to user code. + it is returned to user code. This `post_moderate_text` interceptor runs + before the `post_moderate_text_with_metadata` interceptor. """ return response + def post_moderate_text_with_metadata( + self, + response: language_service.ModerateTextResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + language_service.ModerateTextResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for moderate_text + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the LanguageService server but before it is returned to user code. + + We recommend only using this `post_moderate_text_with_metadata` + interceptor in new development instead of the `post_moderate_text` interceptor. + When both interceptors are used, this `post_moderate_text_with_metadata` interceptor runs after the + `post_moderate_text` interceptor. The (possibly modified) response returned by + `post_moderate_text` will be passed to + `post_moderate_text_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class LanguageServiceRestStub: @@ -520,6 +698,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_analyze_entities(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_analyze_entities_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -676,6 +858,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_analyze_entity_sentiment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_analyze_entity_sentiment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -831,6 +1017,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_analyze_sentiment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_analyze_sentiment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -979,6 +1169,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_analyze_syntax(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_analyze_syntax_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1132,6 +1326,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_annotate_text(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_annotate_text_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1283,6 +1481,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_classify_text(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_classify_text_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1434,6 +1636,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_moderate_text(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_moderate_text_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-language/google/cloud/language_v2/gapic_version.py b/packages/google-cloud-language/google/cloud/language_v2/gapic_version.py index e154065d8da8..558c8aab67c5 100644 --- a/packages/google-cloud-language/google/cloud/language_v2/gapic_version.py +++ b/packages/google-cloud-language/google/cloud/language_v2/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "2.16.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-language/google/cloud/language_v2/services/language_service/client.py b/packages/google-cloud-language/google/cloud/language_v2/services/language_service/client.py index 313ab60a80ff..a544854b8dad 100644 --- a/packages/google-cloud-language/google/cloud/language_v2/services/language_service/client.py +++ b/packages/google-cloud-language/google/cloud/language_v2/services/language_service/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -463,6 +465,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. diff --git a/packages/google-cloud-language/google/cloud/language_v2/services/language_service/transports/rest.py b/packages/google-cloud-language/google/cloud/language_v2/services/language_service/transports/rest.py index c15066427335..66e3e0e5725b 100644 --- a/packages/google-cloud-language/google/cloud/language_v2/services/language_service/transports/rest.py +++ b/packages/google-cloud-language/google/cloud/language_v2/services/language_service/transports/rest.py @@ -133,12 +133,38 @@ def post_analyze_entities( ) -> language_service.AnalyzeEntitiesResponse: """Post-rpc interceptor for analyze_entities - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_analyze_entities_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the LanguageService server but before - it is returned to user code. + it is returned to user code. This `post_analyze_entities` interceptor runs + before the `post_analyze_entities_with_metadata` interceptor. """ return response + def post_analyze_entities_with_metadata( + self, + response: language_service.AnalyzeEntitiesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + language_service.AnalyzeEntitiesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for analyze_entities + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the LanguageService server but before it is returned to user code. + + We recommend only using this `post_analyze_entities_with_metadata` + interceptor in new development instead of the `post_analyze_entities` interceptor. + When both interceptors are used, this `post_analyze_entities_with_metadata` interceptor runs after the + `post_analyze_entities` interceptor. The (possibly modified) response returned by + `post_analyze_entities` will be passed to + `post_analyze_entities_with_metadata`. + """ + return response, metadata + def pre_analyze_sentiment( self, request: language_service.AnalyzeSentimentRequest, @@ -159,12 +185,38 @@ def post_analyze_sentiment( ) -> language_service.AnalyzeSentimentResponse: """Post-rpc interceptor for analyze_sentiment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_analyze_sentiment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the LanguageService server but before - it is returned to user code. + it is returned to user code. This `post_analyze_sentiment` interceptor runs + before the `post_analyze_sentiment_with_metadata` interceptor. """ return response + def post_analyze_sentiment_with_metadata( + self, + response: language_service.AnalyzeSentimentResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + language_service.AnalyzeSentimentResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for analyze_sentiment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the LanguageService server but before it is returned to user code. + + We recommend only using this `post_analyze_sentiment_with_metadata` + interceptor in new development instead of the `post_analyze_sentiment` interceptor. + When both interceptors are used, this `post_analyze_sentiment_with_metadata` interceptor runs after the + `post_analyze_sentiment` interceptor. The (possibly modified) response returned by + `post_analyze_sentiment` will be passed to + `post_analyze_sentiment_with_metadata`. + """ + return response, metadata + def pre_annotate_text( self, request: language_service.AnnotateTextRequest, @@ -184,12 +236,37 @@ def post_annotate_text( ) -> language_service.AnnotateTextResponse: """Post-rpc interceptor for annotate_text - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_annotate_text_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the LanguageService server but before - it is returned to user code. + it is returned to user code. This `post_annotate_text` interceptor runs + before the `post_annotate_text_with_metadata` interceptor. """ return response + def post_annotate_text_with_metadata( + self, + response: language_service.AnnotateTextResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + language_service.AnnotateTextResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for annotate_text + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the LanguageService server but before it is returned to user code. + + We recommend only using this `post_annotate_text_with_metadata` + interceptor in new development instead of the `post_annotate_text` interceptor. + When both interceptors are used, this `post_annotate_text_with_metadata` interceptor runs after the + `post_annotate_text` interceptor. The (possibly modified) response returned by + `post_annotate_text` will be passed to + `post_annotate_text_with_metadata`. + """ + return response, metadata + def pre_classify_text( self, request: language_service.ClassifyTextRequest, @@ -209,12 +286,37 @@ def post_classify_text( ) -> language_service.ClassifyTextResponse: """Post-rpc interceptor for classify_text - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_classify_text_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the LanguageService server but before - it is returned to user code. + it is returned to user code. This `post_classify_text` interceptor runs + before the `post_classify_text_with_metadata` interceptor. """ return response + def post_classify_text_with_metadata( + self, + response: language_service.ClassifyTextResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + language_service.ClassifyTextResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for classify_text + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the LanguageService server but before it is returned to user code. + + We recommend only using this `post_classify_text_with_metadata` + interceptor in new development instead of the `post_classify_text` interceptor. + When both interceptors are used, this `post_classify_text_with_metadata` interceptor runs after the + `post_classify_text` interceptor. The (possibly modified) response returned by + `post_classify_text` will be passed to + `post_classify_text_with_metadata`. + """ + return response, metadata + def pre_moderate_text( self, request: language_service.ModerateTextRequest, @@ -234,12 +336,37 @@ def post_moderate_text( ) -> language_service.ModerateTextResponse: """Post-rpc interceptor for moderate_text - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_moderate_text_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the LanguageService server but before - it is returned to user code. + it is returned to user code. This `post_moderate_text` interceptor runs + before the `post_moderate_text_with_metadata` interceptor. """ return response + def post_moderate_text_with_metadata( + self, + response: language_service.ModerateTextResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + language_service.ModerateTextResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for moderate_text + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the LanguageService server but before it is returned to user code. + + We recommend only using this `post_moderate_text_with_metadata` + interceptor in new development instead of the `post_moderate_text` interceptor. + When both interceptors are used, this `post_moderate_text_with_metadata` interceptor runs after the + `post_moderate_text` interceptor. The (possibly modified) response returned by + `post_moderate_text` will be passed to + `post_moderate_text_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class LanguageServiceRestStub: @@ -453,6 +580,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_analyze_entities(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_analyze_entities_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -606,6 +737,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_analyze_sentiment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_analyze_sentiment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -758,6 +893,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_annotate_text(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_annotate_text_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -909,6 +1048,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_classify_text(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_classify_text_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1060,6 +1203,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_moderate_text(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_moderate_text_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-language/samples/generated_samples/snippet_metadata_google.cloud.language.v1.json b/packages/google-cloud-language/samples/generated_samples/snippet_metadata_google.cloud.language.v1.json index a59b9c7dac35..63e590c52df1 100644 --- a/packages/google-cloud-language/samples/generated_samples/snippet_metadata_google.cloud.language.v1.json +++ b/packages/google-cloud-language/samples/generated_samples/snippet_metadata_google.cloud.language.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-language", - "version": "2.16.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-language/samples/generated_samples/snippet_metadata_google.cloud.language.v1beta2.json b/packages/google-cloud-language/samples/generated_samples/snippet_metadata_google.cloud.language.v1beta2.json index 4aaea43d83d6..7d778c7f768b 100644 --- a/packages/google-cloud-language/samples/generated_samples/snippet_metadata_google.cloud.language.v1beta2.json +++ b/packages/google-cloud-language/samples/generated_samples/snippet_metadata_google.cloud.language.v1beta2.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-language", - "version": "2.16.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-language/samples/generated_samples/snippet_metadata_google.cloud.language.v2.json b/packages/google-cloud-language/samples/generated_samples/snippet_metadata_google.cloud.language.v2.json index c7575a563b47..1c4afcc2c090 100644 --- a/packages/google-cloud-language/samples/generated_samples/snippet_metadata_google.cloud.language.v2.json +++ b/packages/google-cloud-language/samples/generated_samples/snippet_metadata_google.cloud.language.v2.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-language", - "version": "2.16.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-language/tests/unit/gapic/language_v1/test_language_service.py b/packages/google-cloud-language/tests/unit/gapic/language_v1/test_language_service.py index 85e241a13e72..fe42c55828e4 100644 --- a/packages/google-cloud-language/tests/unit/gapic/language_v1/test_language_service.py +++ b/packages/google-cloud-language/tests/unit/gapic/language_v1/test_language_service.py @@ -59,6 +59,13 @@ ) from google.cloud.language_v1.types import language_service +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -317,6 +324,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = LanguageServiceClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=["foo"]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + if show_cred_info: + assert error.details == ["foo", CRED_INFO_STRING] + else: + assert error.details == ["foo"] + + +@pytest.mark.parametrize("error_code", [401, 403, 404, 500]) +def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code): + cred = mock.Mock([]) + assert not hasattr(cred, "get_cred_info") + client = LanguageServiceClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -4868,10 +4918,14 @@ def test_analyze_sentiment_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.LanguageServiceRestInterceptor, "post_analyze_sentiment" ) as post, mock.patch.object( + transports.LanguageServiceRestInterceptor, + "post_analyze_sentiment_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.LanguageServiceRestInterceptor, "pre_analyze_sentiment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = language_service.AnalyzeSentimentRequest.pb( language_service.AnalyzeSentimentRequest() ) @@ -4897,6 +4951,10 @@ def test_analyze_sentiment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = language_service.AnalyzeSentimentResponse() + post_with_metadata.return_value = ( + language_service.AnalyzeSentimentResponse(), + metadata, + ) client.analyze_sentiment( request, @@ -4908,6 +4966,7 @@ def test_analyze_sentiment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_analyze_entities_rest_bad_request( @@ -4992,10 +5051,13 @@ def test_analyze_entities_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.LanguageServiceRestInterceptor, "post_analyze_entities" ) as post, mock.patch.object( + transports.LanguageServiceRestInterceptor, "post_analyze_entities_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.LanguageServiceRestInterceptor, "pre_analyze_entities" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = language_service.AnalyzeEntitiesRequest.pb( language_service.AnalyzeEntitiesRequest() ) @@ -5021,6 +5083,10 @@ def test_analyze_entities_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = language_service.AnalyzeEntitiesResponse() + post_with_metadata.return_value = ( + language_service.AnalyzeEntitiesResponse(), + metadata, + ) client.analyze_entities( request, @@ -5032,6 +5098,7 @@ def test_analyze_entities_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_analyze_entity_sentiment_rest_bad_request( @@ -5116,10 +5183,14 @@ def test_analyze_entity_sentiment_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.LanguageServiceRestInterceptor, "post_analyze_entity_sentiment" ) as post, mock.patch.object( + transports.LanguageServiceRestInterceptor, + "post_analyze_entity_sentiment_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.LanguageServiceRestInterceptor, "pre_analyze_entity_sentiment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = language_service.AnalyzeEntitySentimentRequest.pb( language_service.AnalyzeEntitySentimentRequest() ) @@ -5145,6 +5216,10 @@ def test_analyze_entity_sentiment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = language_service.AnalyzeEntitySentimentResponse() + post_with_metadata.return_value = ( + language_service.AnalyzeEntitySentimentResponse(), + metadata, + ) client.analyze_entity_sentiment( request, @@ -5156,6 +5231,7 @@ def test_analyze_entity_sentiment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_analyze_syntax_rest_bad_request( @@ -5240,10 +5316,13 @@ def test_analyze_syntax_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.LanguageServiceRestInterceptor, "post_analyze_syntax" ) as post, mock.patch.object( + transports.LanguageServiceRestInterceptor, "post_analyze_syntax_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.LanguageServiceRestInterceptor, "pre_analyze_syntax" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = language_service.AnalyzeSyntaxRequest.pb( language_service.AnalyzeSyntaxRequest() ) @@ -5269,6 +5348,10 @@ def test_analyze_syntax_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = language_service.AnalyzeSyntaxResponse() + post_with_metadata.return_value = ( + language_service.AnalyzeSyntaxResponse(), + metadata, + ) client.analyze_syntax( request, @@ -5280,6 +5363,7 @@ def test_analyze_syntax_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_classify_text_rest_bad_request( @@ -5361,10 +5445,13 @@ def test_classify_text_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.LanguageServiceRestInterceptor, "post_classify_text" ) as post, mock.patch.object( + transports.LanguageServiceRestInterceptor, "post_classify_text_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.LanguageServiceRestInterceptor, "pre_classify_text" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = language_service.ClassifyTextRequest.pb( language_service.ClassifyTextRequest() ) @@ -5390,6 +5477,10 @@ def test_classify_text_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = language_service.ClassifyTextResponse() + post_with_metadata.return_value = ( + language_service.ClassifyTextResponse(), + metadata, + ) client.classify_text( request, @@ -5401,6 +5492,7 @@ def test_classify_text_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_moderate_text_rest_bad_request( @@ -5482,10 +5574,13 @@ def test_moderate_text_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.LanguageServiceRestInterceptor, "post_moderate_text" ) as post, mock.patch.object( + transports.LanguageServiceRestInterceptor, "post_moderate_text_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.LanguageServiceRestInterceptor, "pre_moderate_text" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = language_service.ModerateTextRequest.pb( language_service.ModerateTextRequest() ) @@ -5511,6 +5606,10 @@ def test_moderate_text_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = language_service.ModerateTextResponse() + post_with_metadata.return_value = ( + language_service.ModerateTextResponse(), + metadata, + ) client.moderate_text( request, @@ -5522,6 +5621,7 @@ def test_moderate_text_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_annotate_text_rest_bad_request( @@ -5606,10 +5706,13 @@ def test_annotate_text_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.LanguageServiceRestInterceptor, "post_annotate_text" ) as post, mock.patch.object( + transports.LanguageServiceRestInterceptor, "post_annotate_text_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.LanguageServiceRestInterceptor, "pre_annotate_text" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = language_service.AnnotateTextRequest.pb( language_service.AnnotateTextRequest() ) @@ -5635,6 +5738,10 @@ def test_annotate_text_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = language_service.AnnotateTextResponse() + post_with_metadata.return_value = ( + language_service.AnnotateTextResponse(), + metadata, + ) client.annotate_text( request, @@ -5646,6 +5753,7 @@ def test_annotate_text_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_initialize_client_w_rest(): diff --git a/packages/google-cloud-language/tests/unit/gapic/language_v1beta2/test_language_service.py b/packages/google-cloud-language/tests/unit/gapic/language_v1beta2/test_language_service.py index 8dc21f885917..5f0fee4f9b06 100644 --- a/packages/google-cloud-language/tests/unit/gapic/language_v1beta2/test_language_service.py +++ b/packages/google-cloud-language/tests/unit/gapic/language_v1beta2/test_language_service.py @@ -59,6 +59,13 @@ ) from google.cloud.language_v1beta2.types import language_service +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -317,6 +324,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = LanguageServiceClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=["foo"]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + if show_cred_info: + assert error.details == ["foo", CRED_INFO_STRING] + else: + assert error.details == ["foo"] + + +@pytest.mark.parametrize("error_code", [401, 403, 404, 500]) +def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code): + cred = mock.Mock([]) + assert not hasattr(cred, "get_cred_info") + client = LanguageServiceClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -4869,10 +4919,14 @@ def test_analyze_sentiment_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.LanguageServiceRestInterceptor, "post_analyze_sentiment" ) as post, mock.patch.object( + transports.LanguageServiceRestInterceptor, + "post_analyze_sentiment_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.LanguageServiceRestInterceptor, "pre_analyze_sentiment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = language_service.AnalyzeSentimentRequest.pb( language_service.AnalyzeSentimentRequest() ) @@ -4898,6 +4952,10 @@ def test_analyze_sentiment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = language_service.AnalyzeSentimentResponse() + post_with_metadata.return_value = ( + language_service.AnalyzeSentimentResponse(), + metadata, + ) client.analyze_sentiment( request, @@ -4909,6 +4967,7 @@ def test_analyze_sentiment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_analyze_entities_rest_bad_request( @@ -4993,10 +5052,13 @@ def test_analyze_entities_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.LanguageServiceRestInterceptor, "post_analyze_entities" ) as post, mock.patch.object( + transports.LanguageServiceRestInterceptor, "post_analyze_entities_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.LanguageServiceRestInterceptor, "pre_analyze_entities" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = language_service.AnalyzeEntitiesRequest.pb( language_service.AnalyzeEntitiesRequest() ) @@ -5022,6 +5084,10 @@ def test_analyze_entities_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = language_service.AnalyzeEntitiesResponse() + post_with_metadata.return_value = ( + language_service.AnalyzeEntitiesResponse(), + metadata, + ) client.analyze_entities( request, @@ -5033,6 +5099,7 @@ def test_analyze_entities_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_analyze_entity_sentiment_rest_bad_request( @@ -5117,10 +5184,14 @@ def test_analyze_entity_sentiment_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.LanguageServiceRestInterceptor, "post_analyze_entity_sentiment" ) as post, mock.patch.object( + transports.LanguageServiceRestInterceptor, + "post_analyze_entity_sentiment_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.LanguageServiceRestInterceptor, "pre_analyze_entity_sentiment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = language_service.AnalyzeEntitySentimentRequest.pb( language_service.AnalyzeEntitySentimentRequest() ) @@ -5146,6 +5217,10 @@ def test_analyze_entity_sentiment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = language_service.AnalyzeEntitySentimentResponse() + post_with_metadata.return_value = ( + language_service.AnalyzeEntitySentimentResponse(), + metadata, + ) client.analyze_entity_sentiment( request, @@ -5157,6 +5232,7 @@ def test_analyze_entity_sentiment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_analyze_syntax_rest_bad_request( @@ -5241,10 +5317,13 @@ def test_analyze_syntax_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.LanguageServiceRestInterceptor, "post_analyze_syntax" ) as post, mock.patch.object( + transports.LanguageServiceRestInterceptor, "post_analyze_syntax_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.LanguageServiceRestInterceptor, "pre_analyze_syntax" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = language_service.AnalyzeSyntaxRequest.pb( language_service.AnalyzeSyntaxRequest() ) @@ -5270,6 +5349,10 @@ def test_analyze_syntax_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = language_service.AnalyzeSyntaxResponse() + post_with_metadata.return_value = ( + language_service.AnalyzeSyntaxResponse(), + metadata, + ) client.analyze_syntax( request, @@ -5281,6 +5364,7 @@ def test_analyze_syntax_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_classify_text_rest_bad_request( @@ -5362,10 +5446,13 @@ def test_classify_text_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.LanguageServiceRestInterceptor, "post_classify_text" ) as post, mock.patch.object( + transports.LanguageServiceRestInterceptor, "post_classify_text_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.LanguageServiceRestInterceptor, "pre_classify_text" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = language_service.ClassifyTextRequest.pb( language_service.ClassifyTextRequest() ) @@ -5391,6 +5478,10 @@ def test_classify_text_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = language_service.ClassifyTextResponse() + post_with_metadata.return_value = ( + language_service.ClassifyTextResponse(), + metadata, + ) client.classify_text( request, @@ -5402,6 +5493,7 @@ def test_classify_text_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_moderate_text_rest_bad_request( @@ -5483,10 +5575,13 @@ def test_moderate_text_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.LanguageServiceRestInterceptor, "post_moderate_text" ) as post, mock.patch.object( + transports.LanguageServiceRestInterceptor, "post_moderate_text_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.LanguageServiceRestInterceptor, "pre_moderate_text" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = language_service.ModerateTextRequest.pb( language_service.ModerateTextRequest() ) @@ -5512,6 +5607,10 @@ def test_moderate_text_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = language_service.ModerateTextResponse() + post_with_metadata.return_value = ( + language_service.ModerateTextResponse(), + metadata, + ) client.moderate_text( request, @@ -5523,6 +5622,7 @@ def test_moderate_text_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_annotate_text_rest_bad_request( @@ -5607,10 +5707,13 @@ def test_annotate_text_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.LanguageServiceRestInterceptor, "post_annotate_text" ) as post, mock.patch.object( + transports.LanguageServiceRestInterceptor, "post_annotate_text_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.LanguageServiceRestInterceptor, "pre_annotate_text" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = language_service.AnnotateTextRequest.pb( language_service.AnnotateTextRequest() ) @@ -5636,6 +5739,10 @@ def test_annotate_text_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = language_service.AnnotateTextResponse() + post_with_metadata.return_value = ( + language_service.AnnotateTextResponse(), + metadata, + ) client.annotate_text( request, @@ -5647,6 +5754,7 @@ def test_annotate_text_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_initialize_client_w_rest(): diff --git a/packages/google-cloud-language/tests/unit/gapic/language_v2/test_language_service.py b/packages/google-cloud-language/tests/unit/gapic/language_v2/test_language_service.py index b67a51eac44a..db75d07dc4b9 100644 --- a/packages/google-cloud-language/tests/unit/gapic/language_v2/test_language_service.py +++ b/packages/google-cloud-language/tests/unit/gapic/language_v2/test_language_service.py @@ -59,6 +59,13 @@ ) from google.cloud.language_v2.types import language_service +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -317,6 +324,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = LanguageServiceClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=["foo"]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + if show_cred_info: + assert error.details == ["foo", CRED_INFO_STRING] + else: + assert error.details == ["foo"] + + +@pytest.mark.parametrize("error_code", [401, 403, 404, 500]) +def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code): + cred = mock.Mock([]) + assert not hasattr(cred, "get_cred_info") + client = LanguageServiceClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -3884,10 +3934,14 @@ def test_analyze_sentiment_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.LanguageServiceRestInterceptor, "post_analyze_sentiment" ) as post, mock.patch.object( + transports.LanguageServiceRestInterceptor, + "post_analyze_sentiment_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.LanguageServiceRestInterceptor, "pre_analyze_sentiment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = language_service.AnalyzeSentimentRequest.pb( language_service.AnalyzeSentimentRequest() ) @@ -3913,6 +3967,10 @@ def test_analyze_sentiment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = language_service.AnalyzeSentimentResponse() + post_with_metadata.return_value = ( + language_service.AnalyzeSentimentResponse(), + metadata, + ) client.analyze_sentiment( request, @@ -3924,6 +3982,7 @@ def test_analyze_sentiment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_analyze_entities_rest_bad_request( @@ -4010,10 +4069,13 @@ def test_analyze_entities_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.LanguageServiceRestInterceptor, "post_analyze_entities" ) as post, mock.patch.object( + transports.LanguageServiceRestInterceptor, "post_analyze_entities_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.LanguageServiceRestInterceptor, "pre_analyze_entities" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = language_service.AnalyzeEntitiesRequest.pb( language_service.AnalyzeEntitiesRequest() ) @@ -4039,6 +4101,10 @@ def test_analyze_entities_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = language_service.AnalyzeEntitiesResponse() + post_with_metadata.return_value = ( + language_service.AnalyzeEntitiesResponse(), + metadata, + ) client.analyze_entities( request, @@ -4050,6 +4116,7 @@ def test_analyze_entities_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_classify_text_rest_bad_request( @@ -4136,10 +4203,13 @@ def test_classify_text_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.LanguageServiceRestInterceptor, "post_classify_text" ) as post, mock.patch.object( + transports.LanguageServiceRestInterceptor, "post_classify_text_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.LanguageServiceRestInterceptor, "pre_classify_text" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = language_service.ClassifyTextRequest.pb( language_service.ClassifyTextRequest() ) @@ -4165,6 +4235,10 @@ def test_classify_text_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = language_service.ClassifyTextResponse() + post_with_metadata.return_value = ( + language_service.ClassifyTextResponse(), + metadata, + ) client.classify_text( request, @@ -4176,6 +4250,7 @@ def test_classify_text_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_moderate_text_rest_bad_request( @@ -4262,10 +4337,13 @@ def test_moderate_text_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.LanguageServiceRestInterceptor, "post_moderate_text" ) as post, mock.patch.object( + transports.LanguageServiceRestInterceptor, "post_moderate_text_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.LanguageServiceRestInterceptor, "pre_moderate_text" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = language_service.ModerateTextRequest.pb( language_service.ModerateTextRequest() ) @@ -4291,6 +4369,10 @@ def test_moderate_text_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = language_service.ModerateTextResponse() + post_with_metadata.return_value = ( + language_service.ModerateTextResponse(), + metadata, + ) client.moderate_text( request, @@ -4302,6 +4384,7 @@ def test_moderate_text_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_annotate_text_rest_bad_request( @@ -4388,10 +4471,13 @@ def test_annotate_text_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.LanguageServiceRestInterceptor, "post_annotate_text" ) as post, mock.patch.object( + transports.LanguageServiceRestInterceptor, "post_annotate_text_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.LanguageServiceRestInterceptor, "pre_annotate_text" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = language_service.AnnotateTextRequest.pb( language_service.AnnotateTextRequest() ) @@ -4417,6 +4503,10 @@ def test_annotate_text_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = language_service.AnnotateTextResponse() + post_with_metadata.return_value = ( + language_service.AnnotateTextResponse(), + metadata, + ) client.annotate_text( request, @@ -4428,6 +4518,7 @@ def test_annotate_text_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_initialize_client_w_rest(): diff --git a/packages/google-cloud-life-sciences/google/cloud/lifesciences/gapic_version.py b/packages/google-cloud-life-sciences/google/cloud/lifesciences/gapic_version.py index 956522e5b1bb..558c8aab67c5 100644 --- a/packages/google-cloud-life-sciences/google/cloud/lifesciences/gapic_version.py +++ b/packages/google-cloud-life-sciences/google/cloud/lifesciences/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.9.15" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-life-sciences/google/cloud/lifesciences_v2beta/gapic_version.py b/packages/google-cloud-life-sciences/google/cloud/lifesciences_v2beta/gapic_version.py index 956522e5b1bb..558c8aab67c5 100644 --- a/packages/google-cloud-life-sciences/google/cloud/lifesciences_v2beta/gapic_version.py +++ b/packages/google-cloud-life-sciences/google/cloud/lifesciences_v2beta/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.9.15" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-life-sciences/google/cloud/lifesciences_v2beta/services/workflows_service_v2_beta/client.py b/packages/google-cloud-life-sciences/google/cloud/lifesciences_v2beta/services/workflows_service_v2_beta/client.py index d3bab5e50c9c..960b7b636b26 100644 --- a/packages/google-cloud-life-sciences/google/cloud/lifesciences_v2beta/services/workflows_service_v2_beta/client.py +++ b/packages/google-cloud-life-sciences/google/cloud/lifesciences_v2beta/services/workflows_service_v2_beta/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -470,6 +472,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. @@ -844,16 +873,20 @@ def list_operations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def get_operation( self, @@ -899,16 +932,20 @@ def get_operation( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def cancel_operation( self, @@ -1009,16 +1046,20 @@ def get_location( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def list_locations( self, @@ -1064,16 +1105,20 @@ def list_locations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-life-sciences/google/cloud/lifesciences_v2beta/services/workflows_service_v2_beta/transports/rest.py b/packages/google-cloud-life-sciences/google/cloud/lifesciences_v2beta/services/workflows_service_v2_beta/transports/rest.py index 715e0ac658a6..b1e5e45e4b87 100644 --- a/packages/google-cloud-life-sciences/google/cloud/lifesciences_v2beta/services/workflows_service_v2_beta/transports/rest.py +++ b/packages/google-cloud-life-sciences/google/cloud/lifesciences_v2beta/services/workflows_service_v2_beta/transports/rest.py @@ -101,12 +101,35 @@ def post_run_pipeline( ) -> operations_pb2.Operation: """Post-rpc interceptor for run_pipeline - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_run_pipeline_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the WorkflowsServiceV2Beta server but before - it is returned to user code. + it is returned to user code. This `post_run_pipeline` interceptor runs + before the `post_run_pipeline_with_metadata` interceptor. """ return response + def post_run_pipeline_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for run_pipeline + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the WorkflowsServiceV2Beta server but before it is returned to user code. + + We recommend only using this `post_run_pipeline_with_metadata` + interceptor in new development instead of the `post_run_pipeline` interceptor. + When both interceptors are used, this `post_run_pipeline_with_metadata` interceptor runs after the + `post_run_pipeline` interceptor. The (possibly modified) response returned by + `post_run_pipeline` will be passed to + `post_run_pipeline_with_metadata`. + """ + return response, metadata + def pre_get_location( self, request: locations_pb2.GetLocationRequest, @@ -494,6 +517,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_run_pipeline(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_run_pipeline_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-life-sciences/samples/generated_samples/snippet_metadata_google.cloud.lifesciences.v2beta.json b/packages/google-cloud-life-sciences/samples/generated_samples/snippet_metadata_google.cloud.lifesciences.v2beta.json index e6a22e747c46..60e9f560b8da 100644 --- a/packages/google-cloud-life-sciences/samples/generated_samples/snippet_metadata_google.cloud.lifesciences.v2beta.json +++ b/packages/google-cloud-life-sciences/samples/generated_samples/snippet_metadata_google.cloud.lifesciences.v2beta.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-life-sciences", - "version": "0.9.15" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-life-sciences/tests/unit/gapic/lifesciences_v2beta/test_workflows_service_v2_beta.py b/packages/google-cloud-life-sciences/tests/unit/gapic/lifesciences_v2beta/test_workflows_service_v2_beta.py index b45fadc77aec..78b669312dbb 100644 --- a/packages/google-cloud-life-sciences/tests/unit/gapic/lifesciences_v2beta/test_workflows_service_v2_beta.py +++ b/packages/google-cloud-life-sciences/tests/unit/gapic/lifesciences_v2beta/test_workflows_service_v2_beta.py @@ -71,6 +71,13 @@ ) from google.cloud.lifesciences_v2beta.types import workflows +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -346,6 +353,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = WorkflowsServiceV2BetaClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=["foo"]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + if show_cred_info: + assert error.details == ["foo", CRED_INFO_STRING] + else: + assert error.details == ["foo"] + + +@pytest.mark.parametrize("error_code", [401, 403, 404, 500]) +def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code): + cred = mock.Mock([]) + assert not hasattr(cred, "get_cred_info") + client = WorkflowsServiceV2BetaClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -1746,10 +1796,14 @@ def test_run_pipeline_rest_interceptors(null_interceptor): ), mock.patch.object( transports.WorkflowsServiceV2BetaRestInterceptor, "post_run_pipeline" ) as post, mock.patch.object( + transports.WorkflowsServiceV2BetaRestInterceptor, + "post_run_pipeline_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.WorkflowsServiceV2BetaRestInterceptor, "pre_run_pipeline" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = workflows.RunPipelineRequest.pb(workflows.RunPipelineRequest()) transcode.return_value = { "method": "post", @@ -1771,6 +1825,7 @@ def test_run_pipeline_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.run_pipeline( request, @@ -1782,6 +1837,7 @@ def test_run_pipeline_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_location_rest_bad_request(request_type=locations_pb2.GetLocationRequest): diff --git a/packages/google-cloud-managed-identities/google/cloud/managedidentities/gapic_version.py b/packages/google-cloud-managed-identities/google/cloud/managedidentities/gapic_version.py index 50d842f376d0..558c8aab67c5 100644 --- a/packages/google-cloud-managed-identities/google/cloud/managedidentities/gapic_version.py +++ b/packages/google-cloud-managed-identities/google/cloud/managedidentities/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.11.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-managed-identities/google/cloud/managedidentities_v1/gapic_version.py b/packages/google-cloud-managed-identities/google/cloud/managedidentities_v1/gapic_version.py index 50d842f376d0..558c8aab67c5 100644 --- a/packages/google-cloud-managed-identities/google/cloud/managedidentities_v1/gapic_version.py +++ b/packages/google-cloud-managed-identities/google/cloud/managedidentities_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.11.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-managed-identities/google/cloud/managedidentities_v1/services/managed_identities_service/client.py b/packages/google-cloud-managed-identities/google/cloud/managedidentities_v1/services/managed_identities_service/client.py index dc8c514e6864..7b06d8cb80ca 100644 --- a/packages/google-cloud-managed-identities/google/cloud/managedidentities_v1/services/managed_identities_service/client.py +++ b/packages/google-cloud-managed-identities/google/cloud/managedidentities_v1/services/managed_identities_service/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -525,6 +527,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. diff --git a/packages/google-cloud-managed-identities/samples/generated_samples/snippet_metadata_google.cloud.managedidentities.v1.json b/packages/google-cloud-managed-identities/samples/generated_samples/snippet_metadata_google.cloud.managedidentities.v1.json index bd3edb2af418..35a39604e0b8 100644 --- a/packages/google-cloud-managed-identities/samples/generated_samples/snippet_metadata_google.cloud.managedidentities.v1.json +++ b/packages/google-cloud-managed-identities/samples/generated_samples/snippet_metadata_google.cloud.managedidentities.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-managed-identities", - "version": "1.11.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-managed-identities/tests/unit/gapic/managedidentities_v1/test_managed_identities_service.py b/packages/google-cloud-managed-identities/tests/unit/gapic/managedidentities_v1/test_managed_identities_service.py index 3961248e3092..270ef81bf2db 100644 --- a/packages/google-cloud-managed-identities/tests/unit/gapic/managedidentities_v1/test_managed_identities_service.py +++ b/packages/google-cloud-managed-identities/tests/unit/gapic/managedidentities_v1/test_managed_identities_service.py @@ -22,6 +22,7 @@ except ImportError: # pragma: NO COVER import mock +import json import math from google.api_core import api_core_version @@ -68,6 +69,13 @@ ) from google.cloud.managedidentities_v1.types import managed_identities_service, resource +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -343,6 +351,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = ManagedIdentitiesServiceClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=["foo"]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + if show_cred_info: + assert error.details == ["foo", CRED_INFO_STRING] + else: + assert error.details == ["foo"] + + +@pytest.mark.parametrize("error_code", [401, 403, 404, 500]) +def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code): + cred = mock.Mock([]) + assert not hasattr(cred, "get_cred_info") + client = ManagedIdentitiesServiceClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [