diff --git a/packages/google-cloud-bigquery-logging/google/cloud/bigquery_logging/gapic_version.py b/packages/google-cloud-bigquery-logging/google/cloud/bigquery_logging/gapic_version.py index de27578dd493..558c8aab67c5 100644 --- a/packages/google-cloud-bigquery-logging/google/cloud/bigquery_logging/gapic_version.py +++ b/packages/google-cloud-bigquery-logging/google/cloud/bigquery_logging/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.5.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-bigquery-logging/google/cloud/bigquery_logging_v1/gapic_version.py b/packages/google-cloud-bigquery-logging/google/cloud/bigquery_logging_v1/gapic_version.py index de27578dd493..558c8aab67c5 100644 --- a/packages/google-cloud-bigquery-logging/google/cloud/bigquery_logging_v1/gapic_version.py +++ b/packages/google-cloud-bigquery-logging/google/cloud/bigquery_logging_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.5.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-bigquery-migration/google/cloud/bigquery_migration/gapic_version.py b/packages/google-cloud-bigquery-migration/google/cloud/bigquery_migration/gapic_version.py index 2566b8be8361..558c8aab67c5 100644 --- a/packages/google-cloud-bigquery-migration/google/cloud/bigquery_migration/gapic_version.py +++ b/packages/google-cloud-bigquery-migration/google/cloud/bigquery_migration/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.11.12" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-bigquery-migration/google/cloud/bigquery_migration_v2/gapic_version.py b/packages/google-cloud-bigquery-migration/google/cloud/bigquery_migration_v2/gapic_version.py index 2566b8be8361..558c8aab67c5 100644 --- a/packages/google-cloud-bigquery-migration/google/cloud/bigquery_migration_v2/gapic_version.py +++ b/packages/google-cloud-bigquery-migration/google/cloud/bigquery_migration_v2/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.11.12" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-bigquery-migration/google/cloud/bigquery_migration_v2/services/migration_service/client.py b/packages/google-cloud-bigquery-migration/google/cloud/bigquery_migration_v2/services/migration_service/client.py index 00c0357c7680..6a20be7f6df2 100644 --- a/packages/google-cloud-bigquery-migration/google/cloud/bigquery_migration_v2/services/migration_service/client.py +++ b/packages/google-cloud-bigquery-migration/google/cloud/bigquery_migration_v2/services/migration_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 @@ -514,6 +516,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-bigquery-migration/google/cloud/bigquery_migration_v2alpha/gapic_version.py b/packages/google-cloud-bigquery-migration/google/cloud/bigquery_migration_v2alpha/gapic_version.py index 2566b8be8361..558c8aab67c5 100644 --- a/packages/google-cloud-bigquery-migration/google/cloud/bigquery_migration_v2alpha/gapic_version.py +++ b/packages/google-cloud-bigquery-migration/google/cloud/bigquery_migration_v2alpha/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.11.12" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-bigquery-migration/google/cloud/bigquery_migration_v2alpha/services/migration_service/client.py b/packages/google-cloud-bigquery-migration/google/cloud/bigquery_migration_v2alpha/services/migration_service/client.py index f25c72cba44f..7c3f57c69688 100644 --- a/packages/google-cloud-bigquery-migration/google/cloud/bigquery_migration_v2alpha/services/migration_service/client.py +++ b/packages/google-cloud-bigquery-migration/google/cloud/bigquery_migration_v2alpha/services/migration_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 @@ -514,6 +516,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-bigquery-migration/google/cloud/bigquery_migration_v2alpha/services/sql_translation_service/client.py b/packages/google-cloud-bigquery-migration/google/cloud/bigquery_migration_v2alpha/services/sql_translation_service/client.py index f474b7a3e006..339907fd733b 100644 --- a/packages/google-cloud-bigquery-migration/google/cloud/bigquery_migration_v2alpha/services/sql_translation_service/client.py +++ b/packages/google-cloud-bigquery-migration/google/cloud/bigquery_migration_v2alpha/services/sql_translation_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-bigquery-migration/samples/generated_samples/snippet_metadata_google.cloud.bigquery.migration.v2.json b/packages/google-cloud-bigquery-migration/samples/generated_samples/snippet_metadata_google.cloud.bigquery.migration.v2.json index ce2e706a2d89..07e44d919e85 100644 --- a/packages/google-cloud-bigquery-migration/samples/generated_samples/snippet_metadata_google.cloud.bigquery.migration.v2.json +++ b/packages/google-cloud-bigquery-migration/samples/generated_samples/snippet_metadata_google.cloud.bigquery.migration.v2.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-bigquery-migration", - "version": "0.11.12" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-bigquery-migration/samples/generated_samples/snippet_metadata_google.cloud.bigquery.migration.v2alpha.json b/packages/google-cloud-bigquery-migration/samples/generated_samples/snippet_metadata_google.cloud.bigquery.migration.v2alpha.json index cb9fde2bd57e..d849f516e6d6 100644 --- a/packages/google-cloud-bigquery-migration/samples/generated_samples/snippet_metadata_google.cloud.bigquery.migration.v2alpha.json +++ b/packages/google-cloud-bigquery-migration/samples/generated_samples/snippet_metadata_google.cloud.bigquery.migration.v2alpha.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-bigquery-migration", - "version": "0.11.12" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-bigquery-migration/tests/unit/gapic/bigquery_migration_v2/test_migration_service.py b/packages/google-cloud-bigquery-migration/tests/unit/gapic/bigquery_migration_v2/test_migration_service.py index 52e18ce616db..5a5dda640d55 100644 --- a/packages/google-cloud-bigquery-migration/tests/unit/gapic/bigquery_migration_v2/test_migration_service.py +++ b/packages/google-cloud-bigquery-migration/tests/unit/gapic/bigquery_migration_v2/test_migration_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 @@ -69,6 +70,13 @@ translation_usability, ) +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 @@ -328,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 = MigrationServiceClient(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 = MigrationServiceClient(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-bigquery-migration/tests/unit/gapic/bigquery_migration_v2alpha/test_migration_service.py b/packages/google-cloud-bigquery-migration/tests/unit/gapic/bigquery_migration_v2alpha/test_migration_service.py index ec6917df7b1c..9f0f1531dfdc 100644 --- a/packages/google-cloud-bigquery-migration/tests/unit/gapic/bigquery_migration_v2alpha/test_migration_service.py +++ b/packages/google-cloud-bigquery-migration/tests/unit/gapic/bigquery_migration_v2alpha/test_migration_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 @@ -66,6 +67,13 @@ translation_task, ) +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 @@ -325,6 +333,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 = MigrationServiceClient(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 = MigrationServiceClient(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-bigquery-migration/tests/unit/gapic/bigquery_migration_v2alpha/test_sql_translation_service.py b/packages/google-cloud-bigquery-migration/tests/unit/gapic/bigquery_migration_v2alpha/test_sql_translation_service.py index b4d046a3b632..c5b5cea11e35 100644 --- a/packages/google-cloud-bigquery-migration/tests/unit/gapic/bigquery_migration_v2alpha/test_sql_translation_service.py +++ b/packages/google-cloud-bigquery-migration/tests/unit/gapic/bigquery_migration_v2alpha/test_sql_translation_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 @@ -54,6 +55,13 @@ ) from google.cloud.bigquery_migration_v2alpha.types import translation_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 @@ -329,6 +337,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 = SqlTranslationServiceClient(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 = SqlTranslationServiceClient(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-bigquery-reservation/google/cloud/bigquery_reservation/gapic_version.py b/packages/google-cloud-bigquery-reservation/google/cloud/bigquery_reservation/gapic_version.py index cf18a472a8a2..558c8aab67c5 100644 --- a/packages/google-cloud-bigquery-reservation/google/cloud/bigquery_reservation/gapic_version.py +++ b/packages/google-cloud-bigquery-reservation/google/cloud/bigquery_reservation/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-bigquery-reservation/google/cloud/bigquery_reservation_v1/gapic_version.py b/packages/google-cloud-bigquery-reservation/google/cloud/bigquery_reservation_v1/gapic_version.py index cf18a472a8a2..558c8aab67c5 100644 --- a/packages/google-cloud-bigquery-reservation/google/cloud/bigquery_reservation_v1/gapic_version.py +++ b/packages/google-cloud-bigquery-reservation/google/cloud/bigquery_reservation_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-bigquery-reservation/google/cloud/bigquery_reservation_v1/services/reservation_service/client.py b/packages/google-cloud-bigquery-reservation/google/cloud/bigquery_reservation_v1/services/reservation_service/client.py index a4d2d1aaf5b8..4e74d1b430e8 100644 --- a/packages/google-cloud-bigquery-reservation/google/cloud/bigquery_reservation_v1/services/reservation_service/client.py +++ b/packages/google-cloud-bigquery-reservation/google/cloud/bigquery_reservation_v1/services/reservation_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 @@ -573,6 +575,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-bigquery-reservation/google/cloud/bigquery_reservation_v1/services/reservation_service/transports/rest.py b/packages/google-cloud-bigquery-reservation/google/cloud/bigquery_reservation_v1/services/reservation_service/transports/rest.py index a62771c411d0..093e65abb526 100644 --- a/packages/google-cloud-bigquery-reservation/google/cloud/bigquery_reservation_v1/services/reservation_service/transports/rest.py +++ b/packages/google-cloud-bigquery-reservation/google/cloud/bigquery_reservation_v1/services/reservation_service/transports/rest.py @@ -259,12 +259,35 @@ def post_create_assignment( ) -> reservation.Assignment: """Post-rpc interceptor for create_assignment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_assignment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ReservationService server but before - it is returned to user code. + it is returned to user code. This `post_create_assignment` interceptor runs + before the `post_create_assignment_with_metadata` interceptor. """ return response + def post_create_assignment_with_metadata( + self, + response: reservation.Assignment, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[reservation.Assignment, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_assignment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ReservationService server but before it is returned to user code. + + We recommend only using this `post_create_assignment_with_metadata` + interceptor in new development instead of the `post_create_assignment` interceptor. + When both interceptors are used, this `post_create_assignment_with_metadata` interceptor runs after the + `post_create_assignment` interceptor. The (possibly modified) response returned by + `post_create_assignment` will be passed to + `post_create_assignment_with_metadata`. + """ + return response, metadata + def pre_create_capacity_commitment( self, request: reservation.CreateCapacityCommitmentRequest, @@ -285,12 +308,35 @@ def post_create_capacity_commitment( ) -> reservation.CapacityCommitment: """Post-rpc interceptor for create_capacity_commitment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_capacity_commitment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ReservationService server but before - it is returned to user code. + it is returned to user code. This `post_create_capacity_commitment` interceptor runs + before the `post_create_capacity_commitment_with_metadata` interceptor. """ return response + def post_create_capacity_commitment_with_metadata( + self, + response: reservation.CapacityCommitment, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[reservation.CapacityCommitment, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_capacity_commitment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ReservationService server but before it is returned to user code. + + We recommend only using this `post_create_capacity_commitment_with_metadata` + interceptor in new development instead of the `post_create_capacity_commitment` interceptor. + When both interceptors are used, this `post_create_capacity_commitment_with_metadata` interceptor runs after the + `post_create_capacity_commitment` interceptor. The (possibly modified) response returned by + `post_create_capacity_commitment` will be passed to + `post_create_capacity_commitment_with_metadata`. + """ + return response, metadata + def pre_create_reservation( self, request: gcbr_reservation.CreateReservationRequest, @@ -311,12 +357,35 @@ def post_create_reservation( ) -> gcbr_reservation.Reservation: """Post-rpc interceptor for create_reservation - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_reservation_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ReservationService server but before - it is returned to user code. + it is returned to user code. This `post_create_reservation` interceptor runs + before the `post_create_reservation_with_metadata` interceptor. """ return response + def post_create_reservation_with_metadata( + self, + response: gcbr_reservation.Reservation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gcbr_reservation.Reservation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_reservation + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ReservationService server but before it is returned to user code. + + We recommend only using this `post_create_reservation_with_metadata` + interceptor in new development instead of the `post_create_reservation` interceptor. + When both interceptors are used, this `post_create_reservation_with_metadata` interceptor runs after the + `post_create_reservation` interceptor. The (possibly modified) response returned by + `post_create_reservation` will be passed to + `post_create_reservation_with_metadata`. + """ + return response, metadata + def pre_delete_assignment( self, request: reservation.DeleteAssignmentRequest, @@ -379,12 +448,35 @@ def post_failover_reservation( ) -> reservation.Reservation: """Post-rpc interceptor for failover_reservation - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_failover_reservation_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ReservationService server but before - it is returned to user code. + it is returned to user code. This `post_failover_reservation` interceptor runs + before the `post_failover_reservation_with_metadata` interceptor. """ return response + def post_failover_reservation_with_metadata( + self, + response: reservation.Reservation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[reservation.Reservation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for failover_reservation + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ReservationService server but before it is returned to user code. + + We recommend only using this `post_failover_reservation_with_metadata` + interceptor in new development instead of the `post_failover_reservation` interceptor. + When both interceptors are used, this `post_failover_reservation_with_metadata` interceptor runs after the + `post_failover_reservation` interceptor. The (possibly modified) response returned by + `post_failover_reservation` will be passed to + `post_failover_reservation_with_metadata`. + """ + return response, metadata + def pre_get_bi_reservation( self, request: reservation.GetBiReservationRequest, @@ -404,12 +496,35 @@ def post_get_bi_reservation( ) -> reservation.BiReservation: """Post-rpc interceptor for get_bi_reservation - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_bi_reservation_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ReservationService server but before - it is returned to user code. + it is returned to user code. This `post_get_bi_reservation` interceptor runs + before the `post_get_bi_reservation_with_metadata` interceptor. """ return response + def post_get_bi_reservation_with_metadata( + self, + response: reservation.BiReservation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[reservation.BiReservation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_bi_reservation + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ReservationService server but before it is returned to user code. + + We recommend only using this `post_get_bi_reservation_with_metadata` + interceptor in new development instead of the `post_get_bi_reservation` interceptor. + When both interceptors are used, this `post_get_bi_reservation_with_metadata` interceptor runs after the + `post_get_bi_reservation` interceptor. The (possibly modified) response returned by + `post_get_bi_reservation` will be passed to + `post_get_bi_reservation_with_metadata`. + """ + return response, metadata + def pre_get_capacity_commitment( self, request: reservation.GetCapacityCommitmentRequest, @@ -430,12 +545,35 @@ def post_get_capacity_commitment( ) -> reservation.CapacityCommitment: """Post-rpc interceptor for get_capacity_commitment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_capacity_commitment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ReservationService server but before - it is returned to user code. + it is returned to user code. This `post_get_capacity_commitment` interceptor runs + before the `post_get_capacity_commitment_with_metadata` interceptor. """ return response + def post_get_capacity_commitment_with_metadata( + self, + response: reservation.CapacityCommitment, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[reservation.CapacityCommitment, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_capacity_commitment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ReservationService server but before it is returned to user code. + + We recommend only using this `post_get_capacity_commitment_with_metadata` + interceptor in new development instead of the `post_get_capacity_commitment` interceptor. + When both interceptors are used, this `post_get_capacity_commitment_with_metadata` interceptor runs after the + `post_get_capacity_commitment` interceptor. The (possibly modified) response returned by + `post_get_capacity_commitment` will be passed to + `post_get_capacity_commitment_with_metadata`. + """ + return response, metadata + def pre_get_reservation( self, request: reservation.GetReservationRequest, @@ -455,12 +593,35 @@ def post_get_reservation( ) -> reservation.Reservation: """Post-rpc interceptor for get_reservation - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_reservation_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ReservationService server but before - it is returned to user code. + it is returned to user code. This `post_get_reservation` interceptor runs + before the `post_get_reservation_with_metadata` interceptor. """ return response + def post_get_reservation_with_metadata( + self, + response: reservation.Reservation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[reservation.Reservation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_reservation + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ReservationService server but before it is returned to user code. + + We recommend only using this `post_get_reservation_with_metadata` + interceptor in new development instead of the `post_get_reservation` interceptor. + When both interceptors are used, this `post_get_reservation_with_metadata` interceptor runs after the + `post_get_reservation` interceptor. The (possibly modified) response returned by + `post_get_reservation` will be passed to + `post_get_reservation_with_metadata`. + """ + return response, metadata + def pre_list_assignments( self, request: reservation.ListAssignmentsRequest, @@ -480,12 +641,37 @@ def post_list_assignments( ) -> reservation.ListAssignmentsResponse: """Post-rpc interceptor for list_assignments - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_assignments_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ReservationService server but before - it is returned to user code. + it is returned to user code. This `post_list_assignments` interceptor runs + before the `post_list_assignments_with_metadata` interceptor. """ return response + def post_list_assignments_with_metadata( + self, + response: reservation.ListAssignmentsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + reservation.ListAssignmentsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_assignments + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ReservationService server but before it is returned to user code. + + We recommend only using this `post_list_assignments_with_metadata` + interceptor in new development instead of the `post_list_assignments` interceptor. + When both interceptors are used, this `post_list_assignments_with_metadata` interceptor runs after the + `post_list_assignments` interceptor. The (possibly modified) response returned by + `post_list_assignments` will be passed to + `post_list_assignments_with_metadata`. + """ + return response, metadata + def pre_list_capacity_commitments( self, request: reservation.ListCapacityCommitmentsRequest, @@ -506,12 +692,38 @@ def post_list_capacity_commitments( ) -> reservation.ListCapacityCommitmentsResponse: """Post-rpc interceptor for list_capacity_commitments - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_capacity_commitments_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ReservationService server but before - it is returned to user code. + it is returned to user code. This `post_list_capacity_commitments` interceptor runs + before the `post_list_capacity_commitments_with_metadata` interceptor. """ return response + def post_list_capacity_commitments_with_metadata( + self, + response: reservation.ListCapacityCommitmentsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + reservation.ListCapacityCommitmentsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_capacity_commitments + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ReservationService server but before it is returned to user code. + + We recommend only using this `post_list_capacity_commitments_with_metadata` + interceptor in new development instead of the `post_list_capacity_commitments` interceptor. + When both interceptors are used, this `post_list_capacity_commitments_with_metadata` interceptor runs after the + `post_list_capacity_commitments` interceptor. The (possibly modified) response returned by + `post_list_capacity_commitments` will be passed to + `post_list_capacity_commitments_with_metadata`. + """ + return response, metadata + def pre_list_reservations( self, request: reservation.ListReservationsRequest, @@ -531,12 +743,37 @@ def post_list_reservations( ) -> reservation.ListReservationsResponse: """Post-rpc interceptor for list_reservations - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_reservations_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ReservationService server but before - it is returned to user code. + it is returned to user code. This `post_list_reservations` interceptor runs + before the `post_list_reservations_with_metadata` interceptor. """ return response + def post_list_reservations_with_metadata( + self, + response: reservation.ListReservationsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + reservation.ListReservationsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_reservations + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ReservationService server but before it is returned to user code. + + We recommend only using this `post_list_reservations_with_metadata` + interceptor in new development instead of the `post_list_reservations` interceptor. + When both interceptors are used, this `post_list_reservations_with_metadata` interceptor runs after the + `post_list_reservations` interceptor. The (possibly modified) response returned by + `post_list_reservations` will be passed to + `post_list_reservations_with_metadata`. + """ + return response, metadata + def pre_merge_capacity_commitments( self, request: reservation.MergeCapacityCommitmentsRequest, @@ -557,12 +794,35 @@ def post_merge_capacity_commitments( ) -> reservation.CapacityCommitment: """Post-rpc interceptor for merge_capacity_commitments - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_merge_capacity_commitments_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ReservationService server but before - it is returned to user code. + it is returned to user code. This `post_merge_capacity_commitments` interceptor runs + before the `post_merge_capacity_commitments_with_metadata` interceptor. """ return response + def post_merge_capacity_commitments_with_metadata( + self, + response: reservation.CapacityCommitment, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[reservation.CapacityCommitment, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for merge_capacity_commitments + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ReservationService server but before it is returned to user code. + + We recommend only using this `post_merge_capacity_commitments_with_metadata` + interceptor in new development instead of the `post_merge_capacity_commitments` interceptor. + When both interceptors are used, this `post_merge_capacity_commitments_with_metadata` interceptor runs after the + `post_merge_capacity_commitments` interceptor. The (possibly modified) response returned by + `post_merge_capacity_commitments` will be passed to + `post_merge_capacity_commitments_with_metadata`. + """ + return response, metadata + def pre_move_assignment( self, request: reservation.MoveAssignmentRequest, @@ -582,12 +842,35 @@ def post_move_assignment( ) -> reservation.Assignment: """Post-rpc interceptor for move_assignment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_move_assignment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ReservationService server but before - it is returned to user code. + it is returned to user code. This `post_move_assignment` interceptor runs + before the `post_move_assignment_with_metadata` interceptor. """ return response + def post_move_assignment_with_metadata( + self, + response: reservation.Assignment, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[reservation.Assignment, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for move_assignment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ReservationService server but before it is returned to user code. + + We recommend only using this `post_move_assignment_with_metadata` + interceptor in new development instead of the `post_move_assignment` interceptor. + When both interceptors are used, this `post_move_assignment_with_metadata` interceptor runs after the + `post_move_assignment` interceptor. The (possibly modified) response returned by + `post_move_assignment` will be passed to + `post_move_assignment_with_metadata`. + """ + return response, metadata + def pre_search_all_assignments( self, request: reservation.SearchAllAssignmentsRequest, @@ -607,12 +890,38 @@ def post_search_all_assignments( ) -> reservation.SearchAllAssignmentsResponse: """Post-rpc interceptor for search_all_assignments - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_search_all_assignments_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ReservationService server but before - it is returned to user code. + it is returned to user code. This `post_search_all_assignments` interceptor runs + before the `post_search_all_assignments_with_metadata` interceptor. """ return response + def post_search_all_assignments_with_metadata( + self, + response: reservation.SearchAllAssignmentsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + reservation.SearchAllAssignmentsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for search_all_assignments + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ReservationService server but before it is returned to user code. + + We recommend only using this `post_search_all_assignments_with_metadata` + interceptor in new development instead of the `post_search_all_assignments` interceptor. + When both interceptors are used, this `post_search_all_assignments_with_metadata` interceptor runs after the + `post_search_all_assignments` interceptor. The (possibly modified) response returned by + `post_search_all_assignments` will be passed to + `post_search_all_assignments_with_metadata`. + """ + return response, metadata + def pre_search_assignments( self, request: reservation.SearchAssignmentsRequest, @@ -632,12 +941,37 @@ def post_search_assignments( ) -> reservation.SearchAssignmentsResponse: """Post-rpc interceptor for search_assignments - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_search_assignments_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ReservationService server but before - it is returned to user code. + it is returned to user code. This `post_search_assignments` interceptor runs + before the `post_search_assignments_with_metadata` interceptor. """ return response + def post_search_assignments_with_metadata( + self, + response: reservation.SearchAssignmentsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + reservation.SearchAssignmentsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for search_assignments + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ReservationService server but before it is returned to user code. + + We recommend only using this `post_search_assignments_with_metadata` + interceptor in new development instead of the `post_search_assignments` interceptor. + When both interceptors are used, this `post_search_assignments_with_metadata` interceptor runs after the + `post_search_assignments` interceptor. The (possibly modified) response returned by + `post_search_assignments` will be passed to + `post_search_assignments_with_metadata`. + """ + return response, metadata + def pre_split_capacity_commitment( self, request: reservation.SplitCapacityCommitmentRequest, @@ -658,12 +992,38 @@ def post_split_capacity_commitment( ) -> reservation.SplitCapacityCommitmentResponse: """Post-rpc interceptor for split_capacity_commitment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_split_capacity_commitment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ReservationService server but before - it is returned to user code. + it is returned to user code. This `post_split_capacity_commitment` interceptor runs + before the `post_split_capacity_commitment_with_metadata` interceptor. """ return response + def post_split_capacity_commitment_with_metadata( + self, + response: reservation.SplitCapacityCommitmentResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + reservation.SplitCapacityCommitmentResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for split_capacity_commitment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ReservationService server but before it is returned to user code. + + We recommend only using this `post_split_capacity_commitment_with_metadata` + interceptor in new development instead of the `post_split_capacity_commitment` interceptor. + When both interceptors are used, this `post_split_capacity_commitment_with_metadata` interceptor runs after the + `post_split_capacity_commitment` interceptor. The (possibly modified) response returned by + `post_split_capacity_commitment` will be passed to + `post_split_capacity_commitment_with_metadata`. + """ + return response, metadata + def pre_update_assignment( self, request: reservation.UpdateAssignmentRequest, @@ -683,12 +1043,35 @@ def post_update_assignment( ) -> reservation.Assignment: """Post-rpc interceptor for update_assignment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_assignment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ReservationService server but before - it is returned to user code. + it is returned to user code. This `post_update_assignment` interceptor runs + before the `post_update_assignment_with_metadata` interceptor. """ return response + def post_update_assignment_with_metadata( + self, + response: reservation.Assignment, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[reservation.Assignment, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_assignment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ReservationService server but before it is returned to user code. + + We recommend only using this `post_update_assignment_with_metadata` + interceptor in new development instead of the `post_update_assignment` interceptor. + When both interceptors are used, this `post_update_assignment_with_metadata` interceptor runs after the + `post_update_assignment` interceptor. The (possibly modified) response returned by + `post_update_assignment` will be passed to + `post_update_assignment_with_metadata`. + """ + return response, metadata + def pre_update_bi_reservation( self, request: reservation.UpdateBiReservationRequest, @@ -708,12 +1091,35 @@ def post_update_bi_reservation( ) -> reservation.BiReservation: """Post-rpc interceptor for update_bi_reservation - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_bi_reservation_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ReservationService server but before - it is returned to user code. + it is returned to user code. This `post_update_bi_reservation` interceptor runs + before the `post_update_bi_reservation_with_metadata` interceptor. """ return response + def post_update_bi_reservation_with_metadata( + self, + response: reservation.BiReservation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[reservation.BiReservation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_bi_reservation + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ReservationService server but before it is returned to user code. + + We recommend only using this `post_update_bi_reservation_with_metadata` + interceptor in new development instead of the `post_update_bi_reservation` interceptor. + When both interceptors are used, this `post_update_bi_reservation_with_metadata` interceptor runs after the + `post_update_bi_reservation` interceptor. The (possibly modified) response returned by + `post_update_bi_reservation` will be passed to + `post_update_bi_reservation_with_metadata`. + """ + return response, metadata + def pre_update_capacity_commitment( self, request: reservation.UpdateCapacityCommitmentRequest, @@ -734,12 +1140,35 @@ def post_update_capacity_commitment( ) -> reservation.CapacityCommitment: """Post-rpc interceptor for update_capacity_commitment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_capacity_commitment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ReservationService server but before - it is returned to user code. + it is returned to user code. This `post_update_capacity_commitment` interceptor runs + before the `post_update_capacity_commitment_with_metadata` interceptor. """ return response + def post_update_capacity_commitment_with_metadata( + self, + response: reservation.CapacityCommitment, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[reservation.CapacityCommitment, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_capacity_commitment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ReservationService server but before it is returned to user code. + + We recommend only using this `post_update_capacity_commitment_with_metadata` + interceptor in new development instead of the `post_update_capacity_commitment` interceptor. + When both interceptors are used, this `post_update_capacity_commitment_with_metadata` interceptor runs after the + `post_update_capacity_commitment` interceptor. The (possibly modified) response returned by + `post_update_capacity_commitment` will be passed to + `post_update_capacity_commitment_with_metadata`. + """ + return response, metadata + def pre_update_reservation( self, request: gcbr_reservation.UpdateReservationRequest, @@ -760,12 +1189,35 @@ def post_update_reservation( ) -> gcbr_reservation.Reservation: """Post-rpc interceptor for update_reservation - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_reservation_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ReservationService server but before - it is returned to user code. + it is returned to user code. This `post_update_reservation` interceptor runs + before the `post_update_reservation_with_metadata` interceptor. """ return response + def post_update_reservation_with_metadata( + self, + response: gcbr_reservation.Reservation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gcbr_reservation.Reservation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_reservation + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ReservationService server but before it is returned to user code. + + We recommend only using this `post_update_reservation_with_metadata` + interceptor in new development instead of the `post_update_reservation` interceptor. + When both interceptors are used, this `post_update_reservation_with_metadata` interceptor runs after the + `post_update_reservation` interceptor. The (possibly modified) response returned by + `post_update_reservation` will be passed to + `post_update_reservation_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class ReservationServiceRestStub: @@ -1000,6 +1452,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_assignment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_assignment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1167,6 +1623,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_capacity_commitment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_capacity_commitment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1319,6 +1779,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_reservation(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_reservation_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1808,6 +2272,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_failover_reservation(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_failover_reservation_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1952,6 +2420,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_bi_reservation(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_bi_reservation_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2112,6 +2584,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_capacity_commitment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_capacity_commitment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2256,6 +2732,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_reservation(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_reservation_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2402,6 +2882,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_assignments(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_assignments_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2552,6 +3036,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_capacity_commitments(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_capacity_commitments_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2700,6 +3188,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_reservations(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_reservations_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2869,6 +3361,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_merge_capacity_commitments(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_merge_capacity_commitments_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3027,6 +3523,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_move_assignment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_move_assignment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3177,6 +3677,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_search_all_assignments(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_search_all_assignments_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3327,6 +3831,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_search_assignments(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_search_assignments_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3483,6 +3991,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_split_capacity_commitment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_split_capacity_commitment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3638,6 +4150,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_assignment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_assignment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3789,6 +4305,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_bi_reservation(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_bi_reservation_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3956,6 +4476,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_capacity_commitment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_capacity_commitment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4108,6 +4632,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_reservation(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_reservation_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-bigquery-reservation/samples/generated_samples/snippet_metadata_google.cloud.bigquery.reservation.v1.json b/packages/google-cloud-bigquery-reservation/samples/generated_samples/snippet_metadata_google.cloud.bigquery.reservation.v1.json index ed01a737c315..4cdd226b3806 100644 --- a/packages/google-cloud-bigquery-reservation/samples/generated_samples/snippet_metadata_google.cloud.bigquery.reservation.v1.json +++ b/packages/google-cloud-bigquery-reservation/samples/generated_samples/snippet_metadata_google.cloud.bigquery.reservation.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-bigquery-reservation", - "version": "1.15.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-bigquery-reservation/tests/unit/gapic/bigquery_reservation_v1/test_reservation_service.py b/packages/google-cloud-bigquery-reservation/tests/unit/gapic/bigquery_reservation_v1/test_reservation_service.py index 970a335958c8..ef279d853b76 100644 --- a/packages/google-cloud-bigquery-reservation/tests/unit/gapic/bigquery_reservation_v1/test_reservation_service.py +++ b/packages/google-cloud-bigquery-reservation/tests/unit/gapic/bigquery_reservation_v1/test_reservation_service.py @@ -65,6 +65,13 @@ from google.cloud.bigquery_reservation_v1.types import reservation as gcbr_reservation from google.cloud.bigquery_reservation_v1.types import reservation +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 = ReservationServiceClient(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 = ReservationServiceClient(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", [ @@ -15349,10 +15399,14 @@ def test_create_reservation_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ReservationServiceRestInterceptor, "post_create_reservation" ) as post, mock.patch.object( + transports.ReservationServiceRestInterceptor, + "post_create_reservation_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ReservationServiceRestInterceptor, "pre_create_reservation" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = gcbr_reservation.CreateReservationRequest.pb( gcbr_reservation.CreateReservationRequest() ) @@ -15378,6 +15432,7 @@ def test_create_reservation_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcbr_reservation.Reservation() + post_with_metadata.return_value = gcbr_reservation.Reservation(), metadata client.create_reservation( request, @@ -15389,6 +15444,7 @@ def test_create_reservation_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_reservations_rest_bad_request( @@ -15473,10 +15529,14 @@ def test_list_reservations_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ReservationServiceRestInterceptor, "post_list_reservations" ) as post, mock.patch.object( + transports.ReservationServiceRestInterceptor, + "post_list_reservations_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ReservationServiceRestInterceptor, "pre_list_reservations" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = reservation.ListReservationsRequest.pb( reservation.ListReservationsRequest() ) @@ -15502,6 +15562,10 @@ def test_list_reservations_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = reservation.ListReservationsResponse() + post_with_metadata.return_value = ( + reservation.ListReservationsResponse(), + metadata, + ) client.list_reservations( request, @@ -15513,6 +15577,7 @@ def test_list_reservations_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_reservation_rest_bad_request( @@ -15613,10 +15678,14 @@ def test_get_reservation_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ReservationServiceRestInterceptor, "post_get_reservation" ) as post, mock.patch.object( + transports.ReservationServiceRestInterceptor, + "post_get_reservation_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ReservationServiceRestInterceptor, "pre_get_reservation" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = reservation.GetReservationRequest.pb( reservation.GetReservationRequest() ) @@ -15640,6 +15709,7 @@ def test_get_reservation_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = reservation.Reservation() + post_with_metadata.return_value = reservation.Reservation(), metadata client.get_reservation( request, @@ -15651,6 +15721,7 @@ def test_get_reservation_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_reservation_rest_bad_request( @@ -15949,10 +16020,14 @@ def test_update_reservation_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ReservationServiceRestInterceptor, "post_update_reservation" ) as post, mock.patch.object( + transports.ReservationServiceRestInterceptor, + "post_update_reservation_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ReservationServiceRestInterceptor, "pre_update_reservation" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = gcbr_reservation.UpdateReservationRequest.pb( gcbr_reservation.UpdateReservationRequest() ) @@ -15978,6 +16053,7 @@ def test_update_reservation_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcbr_reservation.Reservation() + post_with_metadata.return_value = gcbr_reservation.Reservation(), metadata client.update_reservation( request, @@ -15989,6 +16065,7 @@ def test_update_reservation_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_failover_reservation_rest_bad_request( @@ -16089,10 +16166,14 @@ def test_failover_reservation_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ReservationServiceRestInterceptor, "post_failover_reservation" ) as post, mock.patch.object( + transports.ReservationServiceRestInterceptor, + "post_failover_reservation_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ReservationServiceRestInterceptor, "pre_failover_reservation" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = reservation.FailoverReservationRequest.pb( reservation.FailoverReservationRequest() ) @@ -16116,6 +16197,7 @@ def test_failover_reservation_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = reservation.Reservation() + post_with_metadata.return_value = reservation.Reservation(), metadata client.failover_reservation( request, @@ -16127,6 +16209,7 @@ def test_failover_reservation_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_capacity_commitment_rest_bad_request( @@ -16316,10 +16399,14 @@ def test_create_capacity_commitment_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ReservationServiceRestInterceptor, "post_create_capacity_commitment" ) as post, mock.patch.object( + transports.ReservationServiceRestInterceptor, + "post_create_capacity_commitment_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ReservationServiceRestInterceptor, "pre_create_capacity_commitment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = reservation.CreateCapacityCommitmentRequest.pb( reservation.CreateCapacityCommitmentRequest() ) @@ -16345,6 +16432,7 @@ def test_create_capacity_commitment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = reservation.CapacityCommitment() + post_with_metadata.return_value = reservation.CapacityCommitment(), metadata client.create_capacity_commitment( request, @@ -16356,6 +16444,7 @@ def test_create_capacity_commitment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_capacity_commitments_rest_bad_request( @@ -16440,10 +16529,14 @@ def test_list_capacity_commitments_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ReservationServiceRestInterceptor, "post_list_capacity_commitments" ) as post, mock.patch.object( + transports.ReservationServiceRestInterceptor, + "post_list_capacity_commitments_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ReservationServiceRestInterceptor, "pre_list_capacity_commitments" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = reservation.ListCapacityCommitmentsRequest.pb( reservation.ListCapacityCommitmentsRequest() ) @@ -16469,6 +16562,10 @@ def test_list_capacity_commitments_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = reservation.ListCapacityCommitmentsResponse() + post_with_metadata.return_value = ( + reservation.ListCapacityCommitmentsResponse(), + metadata, + ) client.list_capacity_commitments( request, @@ -16480,6 +16577,7 @@ def test_list_capacity_commitments_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_capacity_commitment_rest_bad_request( @@ -16582,10 +16680,14 @@ def test_get_capacity_commitment_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ReservationServiceRestInterceptor, "post_get_capacity_commitment" ) as post, mock.patch.object( + transports.ReservationServiceRestInterceptor, + "post_get_capacity_commitment_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ReservationServiceRestInterceptor, "pre_get_capacity_commitment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = reservation.GetCapacityCommitmentRequest.pb( reservation.GetCapacityCommitmentRequest() ) @@ -16611,6 +16713,7 @@ def test_get_capacity_commitment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = reservation.CapacityCommitment() + post_with_metadata.return_value = reservation.CapacityCommitment(), metadata client.get_capacity_commitment( request, @@ -16622,6 +16725,7 @@ def test_get_capacity_commitment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_capacity_commitment_rest_bad_request( @@ -16932,10 +17036,14 @@ def test_update_capacity_commitment_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ReservationServiceRestInterceptor, "post_update_capacity_commitment" ) as post, mock.patch.object( + transports.ReservationServiceRestInterceptor, + "post_update_capacity_commitment_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ReservationServiceRestInterceptor, "pre_update_capacity_commitment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = reservation.UpdateCapacityCommitmentRequest.pb( reservation.UpdateCapacityCommitmentRequest() ) @@ -16961,6 +17069,7 @@ def test_update_capacity_commitment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = reservation.CapacityCommitment() + post_with_metadata.return_value = reservation.CapacityCommitment(), metadata client.update_capacity_commitment( request, @@ -16972,6 +17081,7 @@ def test_update_capacity_commitment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_split_capacity_commitment_rest_bad_request( @@ -17057,10 +17167,14 @@ def test_split_capacity_commitment_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ReservationServiceRestInterceptor, "post_split_capacity_commitment" ) as post, mock.patch.object( + transports.ReservationServiceRestInterceptor, + "post_split_capacity_commitment_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ReservationServiceRestInterceptor, "pre_split_capacity_commitment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = reservation.SplitCapacityCommitmentRequest.pb( reservation.SplitCapacityCommitmentRequest() ) @@ -17086,6 +17200,10 @@ def test_split_capacity_commitment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = reservation.SplitCapacityCommitmentResponse() + post_with_metadata.return_value = ( + reservation.SplitCapacityCommitmentResponse(), + metadata, + ) client.split_capacity_commitment( request, @@ -17097,6 +17215,7 @@ def test_split_capacity_commitment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_merge_capacity_commitments_rest_bad_request( @@ -17195,10 +17314,14 @@ def test_merge_capacity_commitments_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ReservationServiceRestInterceptor, "post_merge_capacity_commitments" ) as post, mock.patch.object( + transports.ReservationServiceRestInterceptor, + "post_merge_capacity_commitments_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ReservationServiceRestInterceptor, "pre_merge_capacity_commitments" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = reservation.MergeCapacityCommitmentsRequest.pb( reservation.MergeCapacityCommitmentsRequest() ) @@ -17224,6 +17347,7 @@ def test_merge_capacity_commitments_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = reservation.CapacityCommitment() + post_with_metadata.return_value = reservation.CapacityCommitment(), metadata client.merge_capacity_commitments( request, @@ -17235,6 +17359,7 @@ def test_merge_capacity_commitments_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_assignment_rest_bad_request( @@ -17398,10 +17523,14 @@ def test_create_assignment_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ReservationServiceRestInterceptor, "post_create_assignment" ) as post, mock.patch.object( + transports.ReservationServiceRestInterceptor, + "post_create_assignment_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ReservationServiceRestInterceptor, "pre_create_assignment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = reservation.CreateAssignmentRequest.pb( reservation.CreateAssignmentRequest() ) @@ -17425,6 +17554,7 @@ def test_create_assignment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = reservation.Assignment() + post_with_metadata.return_value = reservation.Assignment(), metadata client.create_assignment( request, @@ -17436,6 +17566,7 @@ def test_create_assignment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_assignments_rest_bad_request( @@ -17520,10 +17651,14 @@ def test_list_assignments_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ReservationServiceRestInterceptor, "post_list_assignments" ) as post, mock.patch.object( + transports.ReservationServiceRestInterceptor, + "post_list_assignments_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ReservationServiceRestInterceptor, "pre_list_assignments" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = reservation.ListAssignmentsRequest.pb( reservation.ListAssignmentsRequest() ) @@ -17549,6 +17684,10 @@ def test_list_assignments_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = reservation.ListAssignmentsResponse() + post_with_metadata.return_value = ( + reservation.ListAssignmentsResponse(), + metadata, + ) client.list_assignments( request, @@ -17560,6 +17699,7 @@ def test_list_assignments_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_assignment_rest_bad_request( @@ -17757,10 +17897,14 @@ def test_search_assignments_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ReservationServiceRestInterceptor, "post_search_assignments" ) as post, mock.patch.object( + transports.ReservationServiceRestInterceptor, + "post_search_assignments_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ReservationServiceRestInterceptor, "pre_search_assignments" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = reservation.SearchAssignmentsRequest.pb( reservation.SearchAssignmentsRequest() ) @@ -17786,6 +17930,10 @@ def test_search_assignments_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = reservation.SearchAssignmentsResponse() + post_with_metadata.return_value = ( + reservation.SearchAssignmentsResponse(), + metadata, + ) client.search_assignments( request, @@ -17797,6 +17945,7 @@ def test_search_assignments_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_search_all_assignments_rest_bad_request( @@ -17881,10 +18030,14 @@ def test_search_all_assignments_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ReservationServiceRestInterceptor, "post_search_all_assignments" ) as post, mock.patch.object( + transports.ReservationServiceRestInterceptor, + "post_search_all_assignments_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ReservationServiceRestInterceptor, "pre_search_all_assignments" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = reservation.SearchAllAssignmentsRequest.pb( reservation.SearchAllAssignmentsRequest() ) @@ -17910,6 +18063,10 @@ def test_search_all_assignments_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = reservation.SearchAllAssignmentsResponse() + post_with_metadata.return_value = ( + reservation.SearchAllAssignmentsResponse(), + metadata, + ) client.search_all_assignments( request, @@ -17921,6 +18078,7 @@ def test_search_all_assignments_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_move_assignment_rest_bad_request( @@ -18015,10 +18173,14 @@ def test_move_assignment_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ReservationServiceRestInterceptor, "post_move_assignment" ) as post, mock.patch.object( + transports.ReservationServiceRestInterceptor, + "post_move_assignment_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ReservationServiceRestInterceptor, "pre_move_assignment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = reservation.MoveAssignmentRequest.pb( reservation.MoveAssignmentRequest() ) @@ -18042,6 +18204,7 @@ def test_move_assignment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = reservation.Assignment() + post_with_metadata.return_value = reservation.Assignment(), metadata client.move_assignment( request, @@ -18053,6 +18216,7 @@ def test_move_assignment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_assignment_rest_bad_request( @@ -18224,10 +18388,14 @@ def test_update_assignment_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ReservationServiceRestInterceptor, "post_update_assignment" ) as post, mock.patch.object( + transports.ReservationServiceRestInterceptor, + "post_update_assignment_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ReservationServiceRestInterceptor, "pre_update_assignment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = reservation.UpdateAssignmentRequest.pb( reservation.UpdateAssignmentRequest() ) @@ -18251,6 +18419,7 @@ def test_update_assignment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = reservation.Assignment() + post_with_metadata.return_value = reservation.Assignment(), metadata client.update_assignment( request, @@ -18262,6 +18431,7 @@ def test_update_assignment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_bi_reservation_rest_bad_request( @@ -18348,10 +18518,14 @@ def test_get_bi_reservation_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ReservationServiceRestInterceptor, "post_get_bi_reservation" ) as post, mock.patch.object( + transports.ReservationServiceRestInterceptor, + "post_get_bi_reservation_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ReservationServiceRestInterceptor, "pre_get_bi_reservation" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = reservation.GetBiReservationRequest.pb( reservation.GetBiReservationRequest() ) @@ -18375,6 +18549,7 @@ def test_get_bi_reservation_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = reservation.BiReservation() + post_with_metadata.return_value = reservation.BiReservation(), metadata client.get_bi_reservation( request, @@ -18386,6 +18561,7 @@ def test_get_bi_reservation_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_bi_reservation_rest_bad_request( @@ -18555,10 +18731,14 @@ def test_update_bi_reservation_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ReservationServiceRestInterceptor, "post_update_bi_reservation" ) as post, mock.patch.object( + transports.ReservationServiceRestInterceptor, + "post_update_bi_reservation_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ReservationServiceRestInterceptor, "pre_update_bi_reservation" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = reservation.UpdateBiReservationRequest.pb( reservation.UpdateBiReservationRequest() ) @@ -18582,6 +18762,7 @@ def test_update_bi_reservation_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = reservation.BiReservation() + post_with_metadata.return_value = reservation.BiReservation(), metadata client.update_bi_reservation( request, @@ -18593,6 +18774,7 @@ def test_update_bi_reservation_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-billing-budgets/google/cloud/billing/budgets/gapic_version.py b/packages/google-cloud-billing-budgets/google/cloud/billing/budgets/gapic_version.py index 3e0ea3b28f0a..558c8aab67c5 100644 --- a/packages/google-cloud-billing-budgets/google/cloud/billing/budgets/gapic_version.py +++ b/packages/google-cloud-billing-budgets/google/cloud/billing/budgets/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-billing-budgets/google/cloud/billing/budgets_v1/gapic_version.py b/packages/google-cloud-billing-budgets/google/cloud/billing/budgets_v1/gapic_version.py index 3e0ea3b28f0a..558c8aab67c5 100644 --- a/packages/google-cloud-billing-budgets/google/cloud/billing/budgets_v1/gapic_version.py +++ b/packages/google-cloud-billing-budgets/google/cloud/billing/budgets_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-billing-budgets/google/cloud/billing/budgets_v1/services/budget_service/client.py b/packages/google-cloud-billing-budgets/google/cloud/billing/budgets_v1/services/budget_service/client.py index 31004c0485da..e32eb475ffeb 100644 --- a/packages/google-cloud-billing-budgets/google/cloud/billing/budgets_v1/services/budget_service/client.py +++ b/packages/google-cloud-billing-budgets/google/cloud/billing/budgets_v1/services/budget_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 @@ -484,6 +486,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-billing-budgets/google/cloud/billing/budgets_v1/services/budget_service/transports/rest.py b/packages/google-cloud-billing-budgets/google/cloud/billing/budgets_v1/services/budget_service/transports/rest.py index 890821cd16a1..27b3f775b32d 100644 --- a/packages/google-cloud-billing-budgets/google/cloud/billing/budgets_v1/services/budget_service/transports/rest.py +++ b/packages/google-cloud-billing-budgets/google/cloud/billing/budgets_v1/services/budget_service/transports/rest.py @@ -128,12 +128,35 @@ def pre_create_budget( def post_create_budget(self, response: budget_model.Budget) -> budget_model.Budget: """Post-rpc interceptor for create_budget - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_budget_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BudgetService server but before - it is returned to user code. + it is returned to user code. This `post_create_budget` interceptor runs + before the `post_create_budget_with_metadata` interceptor. """ return response + def post_create_budget_with_metadata( + self, + response: budget_model.Budget, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[budget_model.Budget, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_budget + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BudgetService server but before it is returned to user code. + + We recommend only using this `post_create_budget_with_metadata` + interceptor in new development instead of the `post_create_budget` interceptor. + When both interceptors are used, this `post_create_budget_with_metadata` interceptor runs after the + `post_create_budget` interceptor. The (possibly modified) response returned by + `post_create_budget` will be passed to + `post_create_budget_with_metadata`. + """ + return response, metadata + def pre_delete_budget( self, request: budget_service.DeleteBudgetRequest, @@ -165,12 +188,35 @@ def pre_get_budget( def post_get_budget(self, response: budget_model.Budget) -> budget_model.Budget: """Post-rpc interceptor for get_budget - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_budget_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BudgetService server but before - it is returned to user code. + it is returned to user code. This `post_get_budget` interceptor runs + before the `post_get_budget_with_metadata` interceptor. """ return response + def post_get_budget_with_metadata( + self, + response: budget_model.Budget, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[budget_model.Budget, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_budget + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BudgetService server but before it is returned to user code. + + We recommend only using this `post_get_budget_with_metadata` + interceptor in new development instead of the `post_get_budget` interceptor. + When both interceptors are used, this `post_get_budget_with_metadata` interceptor runs after the + `post_get_budget` interceptor. The (possibly modified) response returned by + `post_get_budget` will be passed to + `post_get_budget_with_metadata`. + """ + return response, metadata + def pre_list_budgets( self, request: budget_service.ListBudgetsRequest, @@ -190,12 +236,37 @@ def post_list_budgets( ) -> budget_service.ListBudgetsResponse: """Post-rpc interceptor for list_budgets - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_budgets_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BudgetService server but before - it is returned to user code. + it is returned to user code. This `post_list_budgets` interceptor runs + before the `post_list_budgets_with_metadata` interceptor. """ return response + def post_list_budgets_with_metadata( + self, + response: budget_service.ListBudgetsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + budget_service.ListBudgetsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_budgets + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BudgetService server but before it is returned to user code. + + We recommend only using this `post_list_budgets_with_metadata` + interceptor in new development instead of the `post_list_budgets` interceptor. + When both interceptors are used, this `post_list_budgets_with_metadata` interceptor runs after the + `post_list_budgets` interceptor. The (possibly modified) response returned by + `post_list_budgets` will be passed to + `post_list_budgets_with_metadata`. + """ + return response, metadata + def pre_update_budget( self, request: budget_service.UpdateBudgetRequest, @@ -213,12 +284,35 @@ def pre_update_budget( def post_update_budget(self, response: budget_model.Budget) -> budget_model.Budget: """Post-rpc interceptor for update_budget - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_budget_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BudgetService server but before - it is returned to user code. + it is returned to user code. This `post_update_budget` interceptor runs + before the `post_update_budget_with_metadata` interceptor. """ return response + def post_update_budget_with_metadata( + self, + response: budget_model.Budget, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[budget_model.Budget, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_budget + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BudgetService server but before it is returned to user code. + + We recommend only using this `post_update_budget_with_metadata` + interceptor in new development instead of the `post_update_budget` interceptor. + When both interceptors are used, this `post_update_budget_with_metadata` interceptor runs after the + `post_update_budget` interceptor. The (possibly modified) response returned by + `post_update_budget` will be passed to + `post_update_budget_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class BudgetServiceRestStub: @@ -440,6 +534,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_budget(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_budget_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -699,6 +797,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_budget(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_budget_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -841,6 +943,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_budgets(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_budgets_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -998,6 +1104,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_budget(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_budget_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-billing-budgets/google/cloud/billing/budgets_v1beta1/gapic_version.py b/packages/google-cloud-billing-budgets/google/cloud/billing/budgets_v1beta1/gapic_version.py index 3e0ea3b28f0a..558c8aab67c5 100644 --- a/packages/google-cloud-billing-budgets/google/cloud/billing/budgets_v1beta1/gapic_version.py +++ b/packages/google-cloud-billing-budgets/google/cloud/billing/budgets_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-billing-budgets/google/cloud/billing/budgets_v1beta1/services/budget_service/client.py b/packages/google-cloud-billing-budgets/google/cloud/billing/budgets_v1beta1/services/budget_service/client.py index 0513d45e3a6d..6b3b39bc93a6 100644 --- a/packages/google-cloud-billing-budgets/google/cloud/billing/budgets_v1beta1/services/budget_service/client.py +++ b/packages/google-cloud-billing-budgets/google/cloud/billing/budgets_v1beta1/services/budget_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 @@ -480,6 +482,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-billing-budgets/samples/generated_samples/snippet_metadata_google.cloud.billing.budgets.v1.json b/packages/google-cloud-billing-budgets/samples/generated_samples/snippet_metadata_google.cloud.billing.budgets.v1.json index 34b1ce5af4f0..c24b57dc687a 100644 --- a/packages/google-cloud-billing-budgets/samples/generated_samples/snippet_metadata_google.cloud.billing.budgets.v1.json +++ b/packages/google-cloud-billing-budgets/samples/generated_samples/snippet_metadata_google.cloud.billing.budgets.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-billing-budgets", - "version": "1.16.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-billing-budgets/samples/generated_samples/snippet_metadata_google.cloud.billing.budgets.v1beta1.json b/packages/google-cloud-billing-budgets/samples/generated_samples/snippet_metadata_google.cloud.billing.budgets.v1beta1.json index e9159d2a85ba..2c44cd8f7269 100644 --- a/packages/google-cloud-billing-budgets/samples/generated_samples/snippet_metadata_google.cloud.billing.budgets.v1beta1.json +++ b/packages/google-cloud-billing-budgets/samples/generated_samples/snippet_metadata_google.cloud.billing.budgets.v1beta1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-billing-budgets", - "version": "1.16.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-billing-budgets/tests/unit/gapic/budgets_v1/test_budget_service.py b/packages/google-cloud-billing-budgets/tests/unit/gapic/budgets_v1/test_budget_service.py index 3ecaef5f9e5a..66dbd136fb0f 100644 --- a/packages/google-cloud-billing-budgets/tests/unit/gapic/budgets_v1/test_budget_service.py +++ b/packages/google-cloud-billing-budgets/tests/unit/gapic/budgets_v1/test_budget_service.py @@ -64,6 +64,13 @@ ) from google.cloud.billing.budgets_v1.types import budget_model, budget_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 @@ -318,6 +325,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 = BudgetServiceClient(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 = BudgetServiceClient(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", [ @@ -4418,10 +4468,13 @@ def test_create_budget_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BudgetServiceRestInterceptor, "post_create_budget" ) as post, mock.patch.object( + transports.BudgetServiceRestInterceptor, "post_create_budget_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.BudgetServiceRestInterceptor, "pre_create_budget" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = budget_service.CreateBudgetRequest.pb( budget_service.CreateBudgetRequest() ) @@ -4445,6 +4498,7 @@ def test_create_budget_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = budget_model.Budget() + post_with_metadata.return_value = budget_model.Budget(), metadata client.create_budget( request, @@ -4456,6 +4510,7 @@ def test_create_budget_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_budget_rest_bad_request( @@ -4652,10 +4707,13 @@ def test_update_budget_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BudgetServiceRestInterceptor, "post_update_budget" ) as post, mock.patch.object( + transports.BudgetServiceRestInterceptor, "post_update_budget_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.BudgetServiceRestInterceptor, "pre_update_budget" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = budget_service.UpdateBudgetRequest.pb( budget_service.UpdateBudgetRequest() ) @@ -4679,6 +4737,7 @@ def test_update_budget_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = budget_model.Budget() + post_with_metadata.return_value = budget_model.Budget(), metadata client.update_budget( request, @@ -4690,6 +4749,7 @@ def test_update_budget_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_budget_rest_bad_request(request_type=budget_service.GetBudgetRequest): @@ -4776,10 +4836,13 @@ def test_get_budget_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BudgetServiceRestInterceptor, "post_get_budget" ) as post, mock.patch.object( + transports.BudgetServiceRestInterceptor, "post_get_budget_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.BudgetServiceRestInterceptor, "pre_get_budget" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = budget_service.GetBudgetRequest.pb( budget_service.GetBudgetRequest() ) @@ -4803,6 +4866,7 @@ def test_get_budget_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = budget_model.Budget() + post_with_metadata.return_value = budget_model.Budget(), metadata client.get_budget( request, @@ -4814,6 +4878,7 @@ def test_get_budget_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_budgets_rest_bad_request(request_type=budget_service.ListBudgetsRequest): @@ -4896,10 +4961,13 @@ def test_list_budgets_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BudgetServiceRestInterceptor, "post_list_budgets" ) as post, mock.patch.object( + transports.BudgetServiceRestInterceptor, "post_list_budgets_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.BudgetServiceRestInterceptor, "pre_list_budgets" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = budget_service.ListBudgetsRequest.pb( budget_service.ListBudgetsRequest() ) @@ -4925,6 +4993,7 @@ def test_list_budgets_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = budget_service.ListBudgetsResponse() + post_with_metadata.return_value = budget_service.ListBudgetsResponse(), metadata client.list_budgets( request, @@ -4936,6 +5005,7 @@ def test_list_budgets_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_budget_rest_bad_request( diff --git a/packages/google-cloud-billing-budgets/tests/unit/gapic/budgets_v1beta1/test_budget_service.py b/packages/google-cloud-billing-budgets/tests/unit/gapic/budgets_v1beta1/test_budget_service.py index 5b19669c64b4..80d130df32a4 100644 --- a/packages/google-cloud-billing-budgets/tests/unit/gapic/budgets_v1beta1/test_budget_service.py +++ b/packages/google-cloud-billing-budgets/tests/unit/gapic/budgets_v1beta1/test_budget_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 @@ -59,6 +60,13 @@ ) from google.cloud.billing.budgets_v1beta1.types import budget_model, budget_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 @@ -313,6 +321,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 = BudgetServiceClient(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 = BudgetServiceClient(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-billing/google/cloud/billing/gapic_version.py b/packages/google-cloud-billing/google/cloud/billing/gapic_version.py index cf18a472a8a2..558c8aab67c5 100644 --- a/packages/google-cloud-billing/google/cloud/billing/gapic_version.py +++ b/packages/google-cloud-billing/google/cloud/billing/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-billing/google/cloud/billing_v1/gapic_version.py b/packages/google-cloud-billing/google/cloud/billing_v1/gapic_version.py index cf18a472a8a2..558c8aab67c5 100644 --- a/packages/google-cloud-billing/google/cloud/billing_v1/gapic_version.py +++ b/packages/google-cloud-billing/google/cloud/billing_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-billing/google/cloud/billing_v1/services/cloud_billing/client.py b/packages/google-cloud-billing/google/cloud/billing_v1/services/cloud_billing/client.py index 14c05607a3b1..bab5c4ffbde3 100644 --- a/packages/google-cloud-billing/google/cloud/billing_v1/services/cloud_billing/client.py +++ b/packages/google-cloud-billing/google/cloud/billing_v1/services/cloud_billing/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-billing/google/cloud/billing_v1/services/cloud_billing/transports/rest.py b/packages/google-cloud-billing/google/cloud/billing_v1/services/cloud_billing/transports/rest.py index 025dccaacb6d..0219fb12369a 100644 --- a/packages/google-cloud-billing/google/cloud/billing_v1/services/cloud_billing/transports/rest.py +++ b/packages/google-cloud-billing/google/cloud/billing_v1/services/cloud_billing/transports/rest.py @@ -184,12 +184,35 @@ def post_create_billing_account( ) -> cloud_billing.BillingAccount: """Post-rpc interceptor for create_billing_account - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_billing_account_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudBilling server but before - it is returned to user code. + it is returned to user code. This `post_create_billing_account` interceptor runs + before the `post_create_billing_account_with_metadata` interceptor. """ return response + def post_create_billing_account_with_metadata( + self, + response: cloud_billing.BillingAccount, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cloud_billing.BillingAccount, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_billing_account + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudBilling server but before it is returned to user code. + + We recommend only using this `post_create_billing_account_with_metadata` + interceptor in new development instead of the `post_create_billing_account` interceptor. + When both interceptors are used, this `post_create_billing_account_with_metadata` interceptor runs after the + `post_create_billing_account` interceptor. The (possibly modified) response returned by + `post_create_billing_account` will be passed to + `post_create_billing_account_with_metadata`. + """ + return response, metadata + def pre_get_billing_account( self, request: cloud_billing.GetBillingAccountRequest, @@ -209,12 +232,35 @@ def post_get_billing_account( ) -> cloud_billing.BillingAccount: """Post-rpc interceptor for get_billing_account - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_billing_account_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudBilling server but before - it is returned to user code. + it is returned to user code. This `post_get_billing_account` interceptor runs + before the `post_get_billing_account_with_metadata` interceptor. """ return response + def post_get_billing_account_with_metadata( + self, + response: cloud_billing.BillingAccount, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cloud_billing.BillingAccount, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_billing_account + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudBilling server but before it is returned to user code. + + We recommend only using this `post_get_billing_account_with_metadata` + interceptor in new development instead of the `post_get_billing_account` interceptor. + When both interceptors are used, this `post_get_billing_account_with_metadata` interceptor runs after the + `post_get_billing_account` interceptor. The (possibly modified) response returned by + `post_get_billing_account` will be passed to + `post_get_billing_account_with_metadata`. + """ + return response, metadata + def pre_get_iam_policy( self, request: iam_policy_pb2.GetIamPolicyRequest, @@ -232,12 +278,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 CloudBilling 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 CloudBilling 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_project_billing_info( self, request: cloud_billing.GetProjectBillingInfoRequest, @@ -258,12 +327,37 @@ def post_get_project_billing_info( ) -> cloud_billing.ProjectBillingInfo: """Post-rpc interceptor for get_project_billing_info - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_project_billing_info_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudBilling server but before - it is returned to user code. + it is returned to user code. This `post_get_project_billing_info` interceptor runs + before the `post_get_project_billing_info_with_metadata` interceptor. """ return response + def post_get_project_billing_info_with_metadata( + self, + response: cloud_billing.ProjectBillingInfo, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + cloud_billing.ProjectBillingInfo, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_project_billing_info + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudBilling server but before it is returned to user code. + + We recommend only using this `post_get_project_billing_info_with_metadata` + interceptor in new development instead of the `post_get_project_billing_info` interceptor. + When both interceptors are used, this `post_get_project_billing_info_with_metadata` interceptor runs after the + `post_get_project_billing_info` interceptor. The (possibly modified) response returned by + `post_get_project_billing_info` will be passed to + `post_get_project_billing_info_with_metadata`. + """ + return response, metadata + def pre_list_billing_accounts( self, request: cloud_billing.ListBillingAccountsRequest, @@ -284,12 +378,38 @@ def post_list_billing_accounts( ) -> cloud_billing.ListBillingAccountsResponse: """Post-rpc interceptor for list_billing_accounts - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_billing_accounts_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudBilling server but before - it is returned to user code. + it is returned to user code. This `post_list_billing_accounts` interceptor runs + before the `post_list_billing_accounts_with_metadata` interceptor. """ return response + def post_list_billing_accounts_with_metadata( + self, + response: cloud_billing.ListBillingAccountsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + cloud_billing.ListBillingAccountsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_billing_accounts + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudBilling server but before it is returned to user code. + + We recommend only using this `post_list_billing_accounts_with_metadata` + interceptor in new development instead of the `post_list_billing_accounts` interceptor. + When both interceptors are used, this `post_list_billing_accounts_with_metadata` interceptor runs after the + `post_list_billing_accounts` interceptor. The (possibly modified) response returned by + `post_list_billing_accounts` will be passed to + `post_list_billing_accounts_with_metadata`. + """ + return response, metadata + def pre_list_project_billing_info( self, request: cloud_billing.ListProjectBillingInfoRequest, @@ -310,12 +430,38 @@ def post_list_project_billing_info( ) -> cloud_billing.ListProjectBillingInfoResponse: """Post-rpc interceptor for list_project_billing_info - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_project_billing_info_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudBilling server but before - it is returned to user code. + it is returned to user code. This `post_list_project_billing_info` interceptor runs + before the `post_list_project_billing_info_with_metadata` interceptor. """ return response + def post_list_project_billing_info_with_metadata( + self, + response: cloud_billing.ListProjectBillingInfoResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + cloud_billing.ListProjectBillingInfoResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_project_billing_info + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudBilling server but before it is returned to user code. + + We recommend only using this `post_list_project_billing_info_with_metadata` + interceptor in new development instead of the `post_list_project_billing_info` interceptor. + When both interceptors are used, this `post_list_project_billing_info_with_metadata` interceptor runs after the + `post_list_project_billing_info` interceptor. The (possibly modified) response returned by + `post_list_project_billing_info` will be passed to + `post_list_project_billing_info_with_metadata`. + """ + return response, metadata + def pre_move_billing_account( self, request: cloud_billing.MoveBillingAccountRequest, @@ -335,12 +481,35 @@ def post_move_billing_account( ) -> cloud_billing.BillingAccount: """Post-rpc interceptor for move_billing_account - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_move_billing_account_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudBilling server but before - it is returned to user code. + it is returned to user code. This `post_move_billing_account` interceptor runs + before the `post_move_billing_account_with_metadata` interceptor. """ return response + def post_move_billing_account_with_metadata( + self, + response: cloud_billing.BillingAccount, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cloud_billing.BillingAccount, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for move_billing_account + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudBilling server but before it is returned to user code. + + We recommend only using this `post_move_billing_account_with_metadata` + interceptor in new development instead of the `post_move_billing_account` interceptor. + When both interceptors are used, this `post_move_billing_account_with_metadata` interceptor runs after the + `post_move_billing_account` interceptor. The (possibly modified) response returned by + `post_move_billing_account` will be passed to + `post_move_billing_account_with_metadata`. + """ + return response, metadata + def pre_set_iam_policy( self, request: iam_policy_pb2.SetIamPolicyRequest, @@ -358,12 +527,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 CloudBilling 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 CloudBilling 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, @@ -384,12 +576,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 CloudBilling 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 CloudBilling 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_billing_account( self, request: cloud_billing.UpdateBillingAccountRequest, @@ -410,12 +628,35 @@ def post_update_billing_account( ) -> cloud_billing.BillingAccount: """Post-rpc interceptor for update_billing_account - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_billing_account_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudBilling server but before - it is returned to user code. + it is returned to user code. This `post_update_billing_account` interceptor runs + before the `post_update_billing_account_with_metadata` interceptor. """ return response + def post_update_billing_account_with_metadata( + self, + response: cloud_billing.BillingAccount, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cloud_billing.BillingAccount, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_billing_account + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudBilling server but before it is returned to user code. + + We recommend only using this `post_update_billing_account_with_metadata` + interceptor in new development instead of the `post_update_billing_account` interceptor. + When both interceptors are used, this `post_update_billing_account_with_metadata` interceptor runs after the + `post_update_billing_account` interceptor. The (possibly modified) response returned by + `post_update_billing_account` will be passed to + `post_update_billing_account_with_metadata`. + """ + return response, metadata + def pre_update_project_billing_info( self, request: cloud_billing.UpdateProjectBillingInfoRequest, @@ -436,12 +677,37 @@ def post_update_project_billing_info( ) -> cloud_billing.ProjectBillingInfo: """Post-rpc interceptor for update_project_billing_info - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_project_billing_info_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudBilling server but before - it is returned to user code. + it is returned to user code. This `post_update_project_billing_info` interceptor runs + before the `post_update_project_billing_info_with_metadata` interceptor. """ return response + def post_update_project_billing_info_with_metadata( + self, + response: cloud_billing.ProjectBillingInfo, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + cloud_billing.ProjectBillingInfo, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for update_project_billing_info + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudBilling server but before it is returned to user code. + + We recommend only using this `post_update_project_billing_info_with_metadata` + interceptor in new development instead of the `post_update_project_billing_info` interceptor. + When both interceptors are used, this `post_update_project_billing_info_with_metadata` interceptor runs after the + `post_update_project_billing_info` interceptor. The (possibly modified) response returned by + `post_update_project_billing_info` will be passed to + `post_update_project_billing_info_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class CloudBillingRestStub: @@ -658,6 +924,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_billing_account(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_billing_account_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -803,6 +1073,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_billing_account(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_billing_account_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1020,6 +1294,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 @@ -1168,6 +1446,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_project_billing_info(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_project_billing_info_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1312,6 +1594,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_billing_accounts(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_billing_accounts_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1456,6 +1742,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_project_billing_info(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_project_billing_info_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1609,6 +1899,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_move_billing_account(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_move_billing_account_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1834,6 +2128,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 @@ -1982,6 +2280,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 @@ -2133,6 +2435,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_billing_account(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_billing_account_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2291,6 +2597,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_project_billing_info(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_project_billing_info_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-billing/google/cloud/billing_v1/services/cloud_catalog/client.py b/packages/google-cloud-billing/google/cloud/billing_v1/services/cloud_catalog/client.py index f24bba9587a8..18f1fc5eb383 100644 --- a/packages/google-cloud-billing/google/cloud/billing_v1/services/cloud_catalog/client.py +++ b/packages/google-cloud-billing/google/cloud/billing_v1/services/cloud_catalog/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 @@ -495,6 +497,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-billing/google/cloud/billing_v1/services/cloud_catalog/transports/rest.py b/packages/google-cloud-billing/google/cloud/billing_v1/services/cloud_catalog/transports/rest.py index 81482d2bce28..e31bcc04aa1b 100644 --- a/packages/google-cloud-billing/google/cloud/billing_v1/services/cloud_catalog/transports/rest.py +++ b/packages/google-cloud-billing/google/cloud/billing_v1/services/cloud_catalog/transports/rest.py @@ -109,12 +109,37 @@ def post_list_services( ) -> cloud_catalog.ListServicesResponse: """Post-rpc interceptor for list_services - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_services_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudCatalog server but before - it is returned to user code. + it is returned to user code. This `post_list_services` interceptor runs + before the `post_list_services_with_metadata` interceptor. """ return response + def post_list_services_with_metadata( + self, + response: cloud_catalog.ListServicesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + cloud_catalog.ListServicesResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_services + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudCatalog server but before it is returned to user code. + + We recommend only using this `post_list_services_with_metadata` + interceptor in new development instead of the `post_list_services` interceptor. + When both interceptors are used, this `post_list_services_with_metadata` interceptor runs after the + `post_list_services` interceptor. The (possibly modified) response returned by + `post_list_services` will be passed to + `post_list_services_with_metadata`. + """ + return response, metadata + def pre_list_skus( self, request: cloud_catalog.ListSkusRequest, @@ -132,12 +157,35 @@ def post_list_skus( ) -> cloud_catalog.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 CloudCatalog 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: cloud_catalog.ListSkusResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cloud_catalog.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 CloudCatalog 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 + @dataclasses.dataclass class CloudCatalogRestStub: @@ -346,6 +394,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_services(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_services_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -490,6 +542,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 diff --git a/packages/google-cloud-billing/samples/generated_samples/snippet_metadata_google.cloud.billing.v1.json b/packages/google-cloud-billing/samples/generated_samples/snippet_metadata_google.cloud.billing.v1.json index 9299cad59cc3..027b84af0571 100644 --- a/packages/google-cloud-billing/samples/generated_samples/snippet_metadata_google.cloud.billing.v1.json +++ b/packages/google-cloud-billing/samples/generated_samples/snippet_metadata_google.cloud.billing.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-billing", - "version": "1.15.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-billing/tests/unit/gapic/billing_v1/test_cloud_billing.py b/packages/google-cloud-billing/tests/unit/gapic/billing_v1/test_cloud_billing.py index cfb8fc6b73b5..5628f20a03e3 100644 --- a/packages/google-cloud-billing/tests/unit/gapic/billing_v1/test_cloud_billing.py +++ b/packages/google-cloud-billing/tests/unit/gapic/billing_v1/test_cloud_billing.py @@ -65,6 +65,13 @@ ) from google.cloud.billing_v1.types import cloud_billing +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 = CloudBillingClient(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 = CloudBillingClient(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", [ @@ -8005,10 +8055,13 @@ def test_get_billing_account_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudBillingRestInterceptor, "post_get_billing_account" ) as post, mock.patch.object( + transports.CloudBillingRestInterceptor, "post_get_billing_account_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudBillingRestInterceptor, "pre_get_billing_account" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_billing.GetBillingAccountRequest.pb( cloud_billing.GetBillingAccountRequest() ) @@ -8034,6 +8087,7 @@ def test_get_billing_account_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloud_billing.BillingAccount() + post_with_metadata.return_value = cloud_billing.BillingAccount(), metadata client.get_billing_account( request, @@ -8045,6 +8099,7 @@ def test_get_billing_account_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_billing_accounts_rest_bad_request( @@ -8129,10 +8184,14 @@ def test_list_billing_accounts_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudBillingRestInterceptor, "post_list_billing_accounts" ) as post, mock.patch.object( + transports.CloudBillingRestInterceptor, + "post_list_billing_accounts_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudBillingRestInterceptor, "pre_list_billing_accounts" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_billing.ListBillingAccountsRequest.pb( cloud_billing.ListBillingAccountsRequest() ) @@ -8158,6 +8217,10 @@ def test_list_billing_accounts_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloud_billing.ListBillingAccountsResponse() + post_with_metadata.return_value = ( + cloud_billing.ListBillingAccountsResponse(), + metadata, + ) client.list_billing_accounts( request, @@ -8169,6 +8232,7 @@ def test_list_billing_accounts_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_billing_account_rest_bad_request( @@ -8338,10 +8402,14 @@ def test_update_billing_account_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudBillingRestInterceptor, "post_update_billing_account" ) as post, mock.patch.object( + transports.CloudBillingRestInterceptor, + "post_update_billing_account_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudBillingRestInterceptor, "pre_update_billing_account" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_billing.UpdateBillingAccountRequest.pb( cloud_billing.UpdateBillingAccountRequest() ) @@ -8367,6 +8435,7 @@ def test_update_billing_account_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloud_billing.BillingAccount() + post_with_metadata.return_value = cloud_billing.BillingAccount(), metadata client.update_billing_account( request, @@ -8378,6 +8447,7 @@ def test_update_billing_account_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_billing_account_rest_bad_request( @@ -8549,10 +8619,14 @@ def test_create_billing_account_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudBillingRestInterceptor, "post_create_billing_account" ) as post, mock.patch.object( + transports.CloudBillingRestInterceptor, + "post_create_billing_account_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudBillingRestInterceptor, "pre_create_billing_account" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_billing.CreateBillingAccountRequest.pb( cloud_billing.CreateBillingAccountRequest() ) @@ -8578,6 +8652,7 @@ def test_create_billing_account_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloud_billing.BillingAccount() + post_with_metadata.return_value = cloud_billing.BillingAccount(), metadata client.create_billing_account( request, @@ -8589,6 +8664,7 @@ def test_create_billing_account_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_project_billing_info_rest_bad_request( @@ -8673,10 +8749,14 @@ def test_list_project_billing_info_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudBillingRestInterceptor, "post_list_project_billing_info" ) as post, mock.patch.object( + transports.CloudBillingRestInterceptor, + "post_list_project_billing_info_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudBillingRestInterceptor, "pre_list_project_billing_info" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_billing.ListProjectBillingInfoRequest.pb( cloud_billing.ListProjectBillingInfoRequest() ) @@ -8702,6 +8782,10 @@ def test_list_project_billing_info_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloud_billing.ListProjectBillingInfoResponse() + post_with_metadata.return_value = ( + cloud_billing.ListProjectBillingInfoResponse(), + metadata, + ) client.list_project_billing_info( request, @@ -8713,6 +8797,7 @@ def test_list_project_billing_info_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_project_billing_info_rest_bad_request( @@ -8803,10 +8888,14 @@ def test_get_project_billing_info_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudBillingRestInterceptor, "post_get_project_billing_info" ) as post, mock.patch.object( + transports.CloudBillingRestInterceptor, + "post_get_project_billing_info_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudBillingRestInterceptor, "pre_get_project_billing_info" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_billing.GetProjectBillingInfoRequest.pb( cloud_billing.GetProjectBillingInfoRequest() ) @@ -8832,6 +8921,7 @@ def test_get_project_billing_info_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloud_billing.ProjectBillingInfo() + post_with_metadata.return_value = cloud_billing.ProjectBillingInfo(), metadata client.get_project_billing_info( request, @@ -8843,6 +8933,7 @@ def test_get_project_billing_info_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_project_billing_info_rest_bad_request( @@ -9010,10 +9101,14 @@ def test_update_project_billing_info_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudBillingRestInterceptor, "post_update_project_billing_info" ) as post, mock.patch.object( + transports.CloudBillingRestInterceptor, + "post_update_project_billing_info_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudBillingRestInterceptor, "pre_update_project_billing_info" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_billing.UpdateProjectBillingInfoRequest.pb( cloud_billing.UpdateProjectBillingInfoRequest() ) @@ -9039,6 +9134,7 @@ def test_update_project_billing_info_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloud_billing.ProjectBillingInfo() + post_with_metadata.return_value = cloud_billing.ProjectBillingInfo(), metadata client.update_project_billing_info( request, @@ -9050,6 +9146,7 @@ def test_update_project_billing_info_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( @@ -9133,10 +9230,13 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudBillingRestInterceptor, "post_get_iam_policy" ) as post, mock.patch.object( + transports.CloudBillingRestInterceptor, "post_get_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudBillingRestInterceptor, "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", @@ -9158,6 +9258,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, @@ -9169,6 +9270,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_set_iam_policy_rest_bad_request( @@ -9252,10 +9354,13 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudBillingRestInterceptor, "post_set_iam_policy" ) as post, mock.patch.object( + transports.CloudBillingRestInterceptor, "post_set_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudBillingRestInterceptor, "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", @@ -9277,6 +9382,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, @@ -9288,6 +9394,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_test_iam_permissions_rest_bad_request( @@ -9369,10 +9476,14 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudBillingRestInterceptor, "post_test_iam_permissions" ) as post, mock.patch.object( + transports.CloudBillingRestInterceptor, + "post_test_iam_permissions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudBillingRestInterceptor, "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", @@ -9396,6 +9507,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, @@ -9407,6 +9522,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_move_billing_account_rest_bad_request( @@ -9501,10 +9617,14 @@ def test_move_billing_account_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudBillingRestInterceptor, "post_move_billing_account" ) as post, mock.patch.object( + transports.CloudBillingRestInterceptor, + "post_move_billing_account_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudBillingRestInterceptor, "pre_move_billing_account" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_billing.MoveBillingAccountRequest.pb( cloud_billing.MoveBillingAccountRequest() ) @@ -9530,6 +9650,7 @@ def test_move_billing_account_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloud_billing.BillingAccount() + post_with_metadata.return_value = cloud_billing.BillingAccount(), metadata client.move_billing_account( request, @@ -9541,6 +9662,7 @@ def test_move_billing_account_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-billing/tests/unit/gapic/billing_v1/test_cloud_catalog.py b/packages/google-cloud-billing/tests/unit/gapic/billing_v1/test_cloud_catalog.py index e49ec3f945d9..331715137ed5 100644 --- a/packages/google-cloud-billing/tests/unit/gapic/billing_v1/test_cloud_catalog.py +++ b/packages/google-cloud-billing/tests/unit/gapic/billing_v1/test_cloud_catalog.py @@ -61,6 +61,13 @@ ) from google.cloud.billing_v1.types import cloud_catalog +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 = CloudCatalogClient(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 = CloudCatalogClient(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", [ @@ -2590,10 +2640,13 @@ def test_list_services_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudCatalogRestInterceptor, "post_list_services" ) as post, mock.patch.object( + transports.CloudCatalogRestInterceptor, "post_list_services_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudCatalogRestInterceptor, "pre_list_services" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_catalog.ListServicesRequest.pb( cloud_catalog.ListServicesRequest() ) @@ -2619,6 +2672,7 @@ def test_list_services_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloud_catalog.ListServicesResponse() + post_with_metadata.return_value = cloud_catalog.ListServicesResponse(), metadata client.list_services( request, @@ -2630,6 +2684,7 @@ def test_list_services_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=cloud_catalog.ListSkusRequest): @@ -2712,10 +2767,13 @@ def test_list_skus_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudCatalogRestInterceptor, "post_list_skus" ) as post, mock.patch.object( + transports.CloudCatalogRestInterceptor, "post_list_skus_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudCatalogRestInterceptor, "pre_list_skus" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_catalog.ListSkusRequest.pb(cloud_catalog.ListSkusRequest()) transcode.return_value = { "method": "post", @@ -2739,6 +2797,7 @@ def test_list_skus_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloud_catalog.ListSkusResponse() + post_with_metadata.return_value = cloud_catalog.ListSkusResponse(), metadata client.list_skus( request, @@ -2750,6 +2809,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_initialize_client_w_rest(): diff --git a/packages/google-cloud-binary-authorization/google/cloud/binaryauthorization/gapic_version.py b/packages/google-cloud-binary-authorization/google/cloud/binaryauthorization/gapic_version.py index 739fdfae141c..558c8aab67c5 100644 --- a/packages/google-cloud-binary-authorization/google/cloud/binaryauthorization/gapic_version.py +++ b/packages/google-cloud-binary-authorization/google/cloud/binaryauthorization/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.12.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-binary-authorization/google/cloud/binaryauthorization_v1/gapic_version.py b/packages/google-cloud-binary-authorization/google/cloud/binaryauthorization_v1/gapic_version.py index 739fdfae141c..558c8aab67c5 100644 --- a/packages/google-cloud-binary-authorization/google/cloud/binaryauthorization_v1/gapic_version.py +++ b/packages/google-cloud-binary-authorization/google/cloud/binaryauthorization_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.12.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-binary-authorization/google/cloud/binaryauthorization_v1/services/binauthz_management_service_v1/client.py b/packages/google-cloud-binary-authorization/google/cloud/binaryauthorization_v1/services/binauthz_management_service_v1/client.py index 83e9804a7776..8270d9c8d042 100644 --- a/packages/google-cloud-binary-authorization/google/cloud/binaryauthorization_v1/services/binauthz_management_service_v1/client.py +++ b/packages/google-cloud-binary-authorization/google/cloud/binaryauthorization_v1/services/binauthz_management_service_v1/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 @@ -511,6 +513,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-binary-authorization/google/cloud/binaryauthorization_v1/services/binauthz_management_service_v1/transports/rest.py b/packages/google-cloud-binary-authorization/google/cloud/binaryauthorization_v1/services/binauthz_management_service_v1/transports/rest.py index a2ecdb27bba1..fa2ff854ba2f 100644 --- a/packages/google-cloud-binary-authorization/google/cloud/binaryauthorization_v1/services/binauthz_management_service_v1/transports/rest.py +++ b/packages/google-cloud-binary-authorization/google/cloud/binaryauthorization_v1/services/binauthz_management_service_v1/transports/rest.py @@ -142,12 +142,35 @@ def pre_create_attestor( def post_create_attestor(self, response: resources.Attestor) -> resources.Attestor: """Post-rpc interceptor for create_attestor - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_attestor_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BinauthzManagementServiceV1 server but before - it is returned to user code. + it is returned to user code. This `post_create_attestor` interceptor runs + before the `post_create_attestor_with_metadata` interceptor. """ return response + def post_create_attestor_with_metadata( + self, + response: resources.Attestor, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.Attestor, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_attestor + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BinauthzManagementServiceV1 server but before it is returned to user code. + + We recommend only using this `post_create_attestor_with_metadata` + interceptor in new development instead of the `post_create_attestor` interceptor. + When both interceptors are used, this `post_create_attestor_with_metadata` interceptor runs after the + `post_create_attestor` interceptor. The (possibly modified) response returned by + `post_create_attestor` will be passed to + `post_create_attestor_with_metadata`. + """ + return response, metadata + def pre_delete_attestor( self, request: service.DeleteAttestorRequest, @@ -175,12 +198,35 @@ def pre_get_attestor( def post_get_attestor(self, response: resources.Attestor) -> resources.Attestor: """Post-rpc interceptor for get_attestor - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_attestor_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BinauthzManagementServiceV1 server but before - it is returned to user code. + it is returned to user code. This `post_get_attestor` interceptor runs + before the `post_get_attestor_with_metadata` interceptor. """ return response + def post_get_attestor_with_metadata( + self, + response: resources.Attestor, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.Attestor, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_attestor + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BinauthzManagementServiceV1 server but before it is returned to user code. + + We recommend only using this `post_get_attestor_with_metadata` + interceptor in new development instead of the `post_get_attestor` interceptor. + When both interceptors are used, this `post_get_attestor_with_metadata` interceptor runs after the + `post_get_attestor` interceptor. The (possibly modified) response returned by + `post_get_attestor` will be passed to + `post_get_attestor_with_metadata`. + """ + return response, metadata + def pre_get_policy( self, request: service.GetPolicyRequest, @@ -196,12 +242,35 @@ def pre_get_policy( def post_get_policy(self, response: resources.Policy) -> resources.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 BinauthzManagementServiceV1 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: resources.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.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 BinauthzManagementServiceV1 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_attestors( self, request: service.ListAttestorsRequest, @@ -219,12 +288,35 @@ def post_list_attestors( ) -> service.ListAttestorsResponse: """Post-rpc interceptor for list_attestors - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_attestors_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BinauthzManagementServiceV1 server but before - it is returned to user code. + it is returned to user code. This `post_list_attestors` interceptor runs + before the `post_list_attestors_with_metadata` interceptor. """ return response + def post_list_attestors_with_metadata( + self, + response: service.ListAttestorsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.ListAttestorsResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_attestors + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BinauthzManagementServiceV1 server but before it is returned to user code. + + We recommend only using this `post_list_attestors_with_metadata` + interceptor in new development instead of the `post_list_attestors` interceptor. + When both interceptors are used, this `post_list_attestors_with_metadata` interceptor runs after the + `post_list_attestors` interceptor. The (possibly modified) response returned by + `post_list_attestors` will be passed to + `post_list_attestors_with_metadata`. + """ + return response, metadata + def pre_update_attestor( self, request: service.UpdateAttestorRequest, @@ -240,12 +332,35 @@ def pre_update_attestor( def post_update_attestor(self, response: resources.Attestor) -> resources.Attestor: """Post-rpc interceptor for update_attestor - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_attestor_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BinauthzManagementServiceV1 server but before - it is returned to user code. + it is returned to user code. This `post_update_attestor` interceptor runs + before the `post_update_attestor_with_metadata` interceptor. """ return response + def post_update_attestor_with_metadata( + self, + response: resources.Attestor, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.Attestor, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_attestor + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BinauthzManagementServiceV1 server but before it is returned to user code. + + We recommend only using this `post_update_attestor_with_metadata` + interceptor in new development instead of the `post_update_attestor` interceptor. + When both interceptors are used, this `post_update_attestor_with_metadata` interceptor runs after the + `post_update_attestor` interceptor. The (possibly modified) response returned by + `post_update_attestor` will be passed to + `post_update_attestor_with_metadata`. + """ + return response, metadata + def pre_update_policy( self, request: service.UpdatePolicyRequest, @@ -261,12 +376,35 @@ def pre_update_policy( def post_update_policy(self, response: resources.Policy) -> resources.Policy: """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 BinauthzManagementServiceV1 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: resources.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.Policy, 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 BinauthzManagementServiceV1 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 + @dataclasses.dataclass class BinauthzManagementServiceV1RestStub: @@ -493,6 +631,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_attestor(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_attestor_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -751,6 +893,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_attestor(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_attestor_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -897,6 +1043,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 @@ -1043,6 +1193,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_attestors(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_attestors_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1197,6 +1351,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_attestor(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_attestor_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1349,6 +1507,10 @@ def __call__( json_format.Parse(response.content, pb_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-binary-authorization/google/cloud/binaryauthorization_v1/services/system_policy_v1/client.py b/packages/google-cloud-binary-authorization/google/cloud/binaryauthorization_v1/services/system_policy_v1/client.py index d4c7c39ef0e7..ac0ed835626a 100644 --- a/packages/google-cloud-binary-authorization/google/cloud/binaryauthorization_v1/services/system_policy_v1/client.py +++ b/packages/google-cloud-binary-authorization/google/cloud/binaryauthorization_v1/services/system_policy_v1/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 @@ -478,6 +480,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-binary-authorization/google/cloud/binaryauthorization_v1/services/system_policy_v1/transports/rest.py b/packages/google-cloud-binary-authorization/google/cloud/binaryauthorization_v1/services/system_policy_v1/transports/rest.py index c1b06a8b6c5b..23b5f9eda1ae 100644 --- a/packages/google-cloud-binary-authorization/google/cloud/binaryauthorization_v1/services/system_policy_v1/transports/rest.py +++ b/packages/google-cloud-binary-authorization/google/cloud/binaryauthorization_v1/services/system_policy_v1/transports/rest.py @@ -97,12 +97,35 @@ def pre_get_system_policy( def post_get_system_policy(self, response: resources.Policy) -> resources.Policy: """Post-rpc interceptor for get_system_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_system_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SystemPolicyV1 server but before - it is returned to user code. + it is returned to user code. This `post_get_system_policy` interceptor runs + before the `post_get_system_policy_with_metadata` interceptor. """ return response + def post_get_system_policy_with_metadata( + self, + response: resources.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.Policy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_system_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SystemPolicyV1 server but before it is returned to user code. + + We recommend only using this `post_get_system_policy_with_metadata` + interceptor in new development instead of the `post_get_system_policy` interceptor. + When both interceptors are used, this `post_get_system_policy_with_metadata` interceptor runs after the + `post_get_system_policy` interceptor. The (possibly modified) response returned by + `post_get_system_policy` will be passed to + `post_get_system_policy_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class SystemPolicyV1RestStub: @@ -312,6 +335,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_system_policy(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_system_policy_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-binary-authorization/google/cloud/binaryauthorization_v1/services/validation_helper_v1/client.py b/packages/google-cloud-binary-authorization/google/cloud/binaryauthorization_v1/services/validation_helper_v1/client.py index c2ea5ae38197..96d98733d5bf 100644 --- a/packages/google-cloud-binary-authorization/google/cloud/binaryauthorization_v1/services/validation_helper_v1/client.py +++ b/packages/google-cloud-binary-authorization/google/cloud/binaryauthorization_v1/services/validation_helper_v1/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 @@ -461,6 +463,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-binary-authorization/google/cloud/binaryauthorization_v1/services/validation_helper_v1/transports/rest.py b/packages/google-cloud-binary-authorization/google/cloud/binaryauthorization_v1/services/validation_helper_v1/transports/rest.py index 150b136a97d6..1e2241c81f0c 100644 --- a/packages/google-cloud-binary-authorization/google/cloud/binaryauthorization_v1/services/validation_helper_v1/transports/rest.py +++ b/packages/google-cloud-binary-authorization/google/cloud/binaryauthorization_v1/services/validation_helper_v1/transports/rest.py @@ -102,12 +102,38 @@ def post_validate_attestation_occurrence( ) -> service.ValidateAttestationOccurrenceResponse: """Post-rpc interceptor for validate_attestation_occurrence - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_validate_attestation_occurrence_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ValidationHelperV1 server but before - it is returned to user code. + it is returned to user code. This `post_validate_attestation_occurrence` interceptor runs + before the `post_validate_attestation_occurrence_with_metadata` interceptor. """ return response + def post_validate_attestation_occurrence_with_metadata( + self, + response: service.ValidateAttestationOccurrenceResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service.ValidateAttestationOccurrenceResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for validate_attestation_occurrence + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ValidationHelperV1 server but before it is returned to user code. + + We recommend only using this `post_validate_attestation_occurrence_with_metadata` + interceptor in new development instead of the `post_validate_attestation_occurrence` interceptor. + When both interceptors are used, this `post_validate_attestation_occurrence_with_metadata` interceptor runs after the + `post_validate_attestation_occurrence` interceptor. The (possibly modified) response returned by + `post_validate_attestation_occurrence` will be passed to + `post_validate_attestation_occurrence_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class ValidationHelperV1RestStub: @@ -325,6 +351,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_validate_attestation_occurrence(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_validate_attestation_occurrence_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-binary-authorization/google/cloud/binaryauthorization_v1beta1/gapic_version.py b/packages/google-cloud-binary-authorization/google/cloud/binaryauthorization_v1beta1/gapic_version.py index 739fdfae141c..558c8aab67c5 100644 --- a/packages/google-cloud-binary-authorization/google/cloud/binaryauthorization_v1beta1/gapic_version.py +++ b/packages/google-cloud-binary-authorization/google/cloud/binaryauthorization_v1beta1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.12.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-binary-authorization/google/cloud/binaryauthorization_v1beta1/services/binauthz_management_service_v1_beta1/client.py b/packages/google-cloud-binary-authorization/google/cloud/binaryauthorization_v1beta1/services/binauthz_management_service_v1_beta1/client.py index 3c9049d1f08f..d7073b528575 100644 --- a/packages/google-cloud-binary-authorization/google/cloud/binaryauthorization_v1beta1/services/binauthz_management_service_v1_beta1/client.py +++ b/packages/google-cloud-binary-authorization/google/cloud/binaryauthorization_v1beta1/services/binauthz_management_service_v1_beta1/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 @@ -514,6 +516,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-binary-authorization/google/cloud/binaryauthorization_v1beta1/services/binauthz_management_service_v1_beta1/transports/rest.py b/packages/google-cloud-binary-authorization/google/cloud/binaryauthorization_v1beta1/services/binauthz_management_service_v1_beta1/transports/rest.py index 9232ba96aeaf..66167ed2ba53 100644 --- a/packages/google-cloud-binary-authorization/google/cloud/binaryauthorization_v1beta1/services/binauthz_management_service_v1_beta1/transports/rest.py +++ b/packages/google-cloud-binary-authorization/google/cloud/binaryauthorization_v1beta1/services/binauthz_management_service_v1_beta1/transports/rest.py @@ -142,12 +142,35 @@ def pre_create_attestor( def post_create_attestor(self, response: resources.Attestor) -> resources.Attestor: """Post-rpc interceptor for create_attestor - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_attestor_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BinauthzManagementServiceV1Beta1 server but before - it is returned to user code. + it is returned to user code. This `post_create_attestor` interceptor runs + before the `post_create_attestor_with_metadata` interceptor. """ return response + def post_create_attestor_with_metadata( + self, + response: resources.Attestor, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.Attestor, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_attestor + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BinauthzManagementServiceV1Beta1 server but before it is returned to user code. + + We recommend only using this `post_create_attestor_with_metadata` + interceptor in new development instead of the `post_create_attestor` interceptor. + When both interceptors are used, this `post_create_attestor_with_metadata` interceptor runs after the + `post_create_attestor` interceptor. The (possibly modified) response returned by + `post_create_attestor` will be passed to + `post_create_attestor_with_metadata`. + """ + return response, metadata + def pre_delete_attestor( self, request: service.DeleteAttestorRequest, @@ -175,12 +198,35 @@ def pre_get_attestor( def post_get_attestor(self, response: resources.Attestor) -> resources.Attestor: """Post-rpc interceptor for get_attestor - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_attestor_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BinauthzManagementServiceV1Beta1 server but before - it is returned to user code. + it is returned to user code. This `post_get_attestor` interceptor runs + before the `post_get_attestor_with_metadata` interceptor. """ return response + def post_get_attestor_with_metadata( + self, + response: resources.Attestor, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.Attestor, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_attestor + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BinauthzManagementServiceV1Beta1 server but before it is returned to user code. + + We recommend only using this `post_get_attestor_with_metadata` + interceptor in new development instead of the `post_get_attestor` interceptor. + When both interceptors are used, this `post_get_attestor_with_metadata` interceptor runs after the + `post_get_attestor` interceptor. The (possibly modified) response returned by + `post_get_attestor` will be passed to + `post_get_attestor_with_metadata`. + """ + return response, metadata + def pre_get_policy( self, request: service.GetPolicyRequest, @@ -196,12 +242,35 @@ def pre_get_policy( def post_get_policy(self, response: resources.Policy) -> resources.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 BinauthzManagementServiceV1Beta1 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: resources.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.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 BinauthzManagementServiceV1Beta1 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_attestors( self, request: service.ListAttestorsRequest, @@ -219,12 +288,35 @@ def post_list_attestors( ) -> service.ListAttestorsResponse: """Post-rpc interceptor for list_attestors - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_attestors_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BinauthzManagementServiceV1Beta1 server but before - it is returned to user code. + it is returned to user code. This `post_list_attestors` interceptor runs + before the `post_list_attestors_with_metadata` interceptor. """ return response + def post_list_attestors_with_metadata( + self, + response: service.ListAttestorsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.ListAttestorsResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_attestors + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BinauthzManagementServiceV1Beta1 server but before it is returned to user code. + + We recommend only using this `post_list_attestors_with_metadata` + interceptor in new development instead of the `post_list_attestors` interceptor. + When both interceptors are used, this `post_list_attestors_with_metadata` interceptor runs after the + `post_list_attestors` interceptor. The (possibly modified) response returned by + `post_list_attestors` will be passed to + `post_list_attestors_with_metadata`. + """ + return response, metadata + def pre_update_attestor( self, request: service.UpdateAttestorRequest, @@ -240,12 +332,35 @@ def pre_update_attestor( def post_update_attestor(self, response: resources.Attestor) -> resources.Attestor: """Post-rpc interceptor for update_attestor - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_attestor_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BinauthzManagementServiceV1Beta1 server but before - it is returned to user code. + it is returned to user code. This `post_update_attestor` interceptor runs + before the `post_update_attestor_with_metadata` interceptor. """ return response + def post_update_attestor_with_metadata( + self, + response: resources.Attestor, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.Attestor, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_attestor + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BinauthzManagementServiceV1Beta1 server but before it is returned to user code. + + We recommend only using this `post_update_attestor_with_metadata` + interceptor in new development instead of the `post_update_attestor` interceptor. + When both interceptors are used, this `post_update_attestor_with_metadata` interceptor runs after the + `post_update_attestor` interceptor. The (possibly modified) response returned by + `post_update_attestor` will be passed to + `post_update_attestor_with_metadata`. + """ + return response, metadata + def pre_update_policy( self, request: service.UpdatePolicyRequest, @@ -261,12 +376,35 @@ def pre_update_policy( def post_update_policy(self, response: resources.Policy) -> resources.Policy: """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 BinauthzManagementServiceV1Beta1 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: resources.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.Policy, 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 BinauthzManagementServiceV1Beta1 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 + @dataclasses.dataclass class BinauthzManagementServiceV1Beta1RestStub: @@ -493,6 +631,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_attestor(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_attestor_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -747,6 +889,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_attestor(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_attestor_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -894,6 +1040,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 @@ -1038,6 +1188,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_attestors(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_attestors_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1190,6 +1344,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_attestor(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_attestor_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1341,6 +1499,10 @@ def __call__( json_format.Parse(response.content, pb_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-binary-authorization/google/cloud/binaryauthorization_v1beta1/services/system_policy_v1_beta1/client.py b/packages/google-cloud-binary-authorization/google/cloud/binaryauthorization_v1beta1/services/system_policy_v1_beta1/client.py index 43b7d624fc96..130cef79b3ae 100644 --- a/packages/google-cloud-binary-authorization/google/cloud/binaryauthorization_v1beta1/services/system_policy_v1_beta1/client.py +++ b/packages/google-cloud-binary-authorization/google/cloud/binaryauthorization_v1beta1/services/system_policy_v1_beta1/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 @@ -478,6 +480,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-binary-authorization/google/cloud/binaryauthorization_v1beta1/services/system_policy_v1_beta1/transports/rest.py b/packages/google-cloud-binary-authorization/google/cloud/binaryauthorization_v1beta1/services/system_policy_v1_beta1/transports/rest.py index c060c2bf08f3..5831544664fd 100644 --- a/packages/google-cloud-binary-authorization/google/cloud/binaryauthorization_v1beta1/services/system_policy_v1_beta1/transports/rest.py +++ b/packages/google-cloud-binary-authorization/google/cloud/binaryauthorization_v1beta1/services/system_policy_v1_beta1/transports/rest.py @@ -97,12 +97,35 @@ def pre_get_system_policy( def post_get_system_policy(self, response: resources.Policy) -> resources.Policy: """Post-rpc interceptor for get_system_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_system_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SystemPolicyV1Beta1 server but before - it is returned to user code. + it is returned to user code. This `post_get_system_policy` interceptor runs + before the `post_get_system_policy_with_metadata` interceptor. """ return response + def post_get_system_policy_with_metadata( + self, + response: resources.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.Policy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_system_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SystemPolicyV1Beta1 server but before it is returned to user code. + + We recommend only using this `post_get_system_policy_with_metadata` + interceptor in new development instead of the `post_get_system_policy` interceptor. + When both interceptors are used, this `post_get_system_policy_with_metadata` interceptor runs after the + `post_get_system_policy` interceptor. The (possibly modified) response returned by + `post_get_system_policy` will be passed to + `post_get_system_policy_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class SystemPolicyV1Beta1RestStub: @@ -314,6 +337,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_system_policy(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_system_policy_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-binary-authorization/samples/generated_samples/snippet_metadata_google.cloud.binaryauthorization.v1.json b/packages/google-cloud-binary-authorization/samples/generated_samples/snippet_metadata_google.cloud.binaryauthorization.v1.json index 4836a62dd96f..d3f819ebeddc 100644 --- a/packages/google-cloud-binary-authorization/samples/generated_samples/snippet_metadata_google.cloud.binaryauthorization.v1.json +++ b/packages/google-cloud-binary-authorization/samples/generated_samples/snippet_metadata_google.cloud.binaryauthorization.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-binary-authorization", - "version": "1.12.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-binary-authorization/samples/generated_samples/snippet_metadata_google.cloud.binaryauthorization.v1beta1.json b/packages/google-cloud-binary-authorization/samples/generated_samples/snippet_metadata_google.cloud.binaryauthorization.v1beta1.json index 44122e40fd65..1e9460cea8ee 100644 --- a/packages/google-cloud-binary-authorization/samples/generated_samples/snippet_metadata_google.cloud.binaryauthorization.v1beta1.json +++ b/packages/google-cloud-binary-authorization/samples/generated_samples/snippet_metadata_google.cloud.binaryauthorization.v1beta1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-binary-authorization", - "version": "1.12.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-binary-authorization/tests/unit/gapic/binaryauthorization_v1/test_binauthz_management_service_v1.py b/packages/google-cloud-binary-authorization/tests/unit/gapic/binaryauthorization_v1/test_binauthz_management_service_v1.py index db66ba0e415f..ab12fcc039b0 100644 --- a/packages/google-cloud-binary-authorization/tests/unit/gapic/binaryauthorization_v1/test_binauthz_management_service_v1.py +++ b/packages/google-cloud-binary-authorization/tests/unit/gapic/binaryauthorization_v1/test_binauthz_management_service_v1.py @@ -61,6 +61,13 @@ ) from google.cloud.binaryauthorization_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 @@ -344,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 = BinauthzManagementServiceV1Client(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 = BinauthzManagementServiceV1Client(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", [ @@ -5488,10 +5538,14 @@ def test_get_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BinauthzManagementServiceV1RestInterceptor, "post_get_policy" ) as post, mock.patch.object( + transports.BinauthzManagementServiceV1RestInterceptor, + "post_get_policy_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.BinauthzManagementServiceV1RestInterceptor, "pre_get_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetPolicyRequest.pb(service.GetPolicyRequest()) transcode.return_value = { "method": "post", @@ -5513,6 +5567,7 @@ def test_get_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Policy() + post_with_metadata.return_value = resources.Policy(), metadata client.get_policy( request, @@ -5524,6 +5579,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_update_policy_rest_bad_request(request_type=service.UpdatePolicyRequest): @@ -5699,10 +5755,14 @@ def test_update_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BinauthzManagementServiceV1RestInterceptor, "post_update_policy" ) as post, mock.patch.object( + transports.BinauthzManagementServiceV1RestInterceptor, + "post_update_policy_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.BinauthzManagementServiceV1RestInterceptor, "pre_update_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.UpdatePolicyRequest.pb(service.UpdatePolicyRequest()) transcode.return_value = { "method": "post", @@ -5724,6 +5784,7 @@ def test_update_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Policy() + post_with_metadata.return_value = resources.Policy(), metadata client.update_policy( request, @@ -5735,6 +5796,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_create_attestor_rest_bad_request(request_type=service.CreateAttestorRequest): @@ -5906,10 +5968,14 @@ def test_create_attestor_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BinauthzManagementServiceV1RestInterceptor, "post_create_attestor" ) as post, mock.patch.object( + transports.BinauthzManagementServiceV1RestInterceptor, + "post_create_attestor_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.BinauthzManagementServiceV1RestInterceptor, "pre_create_attestor" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateAttestorRequest.pb(service.CreateAttestorRequest()) transcode.return_value = { "method": "post", @@ -5931,6 +5997,7 @@ def test_create_attestor_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Attestor() + post_with_metadata.return_value = resources.Attestor(), metadata client.create_attestor( request, @@ -5942,6 +6009,7 @@ def test_create_attestor_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_attestor_rest_bad_request(request_type=service.GetAttestorRequest): @@ -6026,10 +6094,14 @@ def test_get_attestor_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BinauthzManagementServiceV1RestInterceptor, "post_get_attestor" ) as post, mock.patch.object( + transports.BinauthzManagementServiceV1RestInterceptor, + "post_get_attestor_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.BinauthzManagementServiceV1RestInterceptor, "pre_get_attestor" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetAttestorRequest.pb(service.GetAttestorRequest()) transcode.return_value = { "method": "post", @@ -6051,6 +6123,7 @@ def test_get_attestor_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Attestor() + post_with_metadata.return_value = resources.Attestor(), metadata client.get_attestor( request, @@ -6062,6 +6135,7 @@ def test_get_attestor_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_attestor_rest_bad_request(request_type=service.UpdateAttestorRequest): @@ -6233,10 +6307,14 @@ def test_update_attestor_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BinauthzManagementServiceV1RestInterceptor, "post_update_attestor" ) as post, mock.patch.object( + transports.BinauthzManagementServiceV1RestInterceptor, + "post_update_attestor_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.BinauthzManagementServiceV1RestInterceptor, "pre_update_attestor" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.UpdateAttestorRequest.pb(service.UpdateAttestorRequest()) transcode.return_value = { "method": "post", @@ -6258,6 +6336,7 @@ def test_update_attestor_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Attestor() + post_with_metadata.return_value = resources.Attestor(), metadata client.update_attestor( request, @@ -6269,6 +6348,7 @@ def test_update_attestor_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_attestors_rest_bad_request(request_type=service.ListAttestorsRequest): @@ -6351,10 +6431,14 @@ def test_list_attestors_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BinauthzManagementServiceV1RestInterceptor, "post_list_attestors" ) as post, mock.patch.object( + transports.BinauthzManagementServiceV1RestInterceptor, + "post_list_attestors_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.BinauthzManagementServiceV1RestInterceptor, "pre_list_attestors" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListAttestorsRequest.pb(service.ListAttestorsRequest()) transcode.return_value = { "method": "post", @@ -6378,6 +6462,7 @@ def test_list_attestors_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListAttestorsResponse() + post_with_metadata.return_value = service.ListAttestorsResponse(), metadata client.list_attestors( request, @@ -6389,6 +6474,7 @@ def test_list_attestors_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_attestor_rest_bad_request(request_type=service.DeleteAttestorRequest): diff --git a/packages/google-cloud-binary-authorization/tests/unit/gapic/binaryauthorization_v1/test_system_policy_v1.py b/packages/google-cloud-binary-authorization/tests/unit/gapic/binaryauthorization_v1/test_system_policy_v1.py index 938fc36413b1..6a99b249472c 100644 --- a/packages/google-cloud-binary-authorization/tests/unit/gapic/binaryauthorization_v1/test_system_policy_v1.py +++ b/packages/google-cloud-binary-authorization/tests/unit/gapic/binaryauthorization_v1/test_system_policy_v1.py @@ -60,6 +60,13 @@ ) from google.cloud.binaryauthorization_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 @@ -318,6 +325,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 = SystemPolicyV1Client(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 = SystemPolicyV1Client(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", [ @@ -1861,10 +1911,13 @@ def test_get_system_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SystemPolicyV1RestInterceptor, "post_get_system_policy" ) as post, mock.patch.object( + transports.SystemPolicyV1RestInterceptor, "post_get_system_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SystemPolicyV1RestInterceptor, "pre_get_system_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetSystemPolicyRequest.pb(service.GetSystemPolicyRequest()) transcode.return_value = { "method": "post", @@ -1886,6 +1939,7 @@ def test_get_system_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Policy() + post_with_metadata.return_value = resources.Policy(), metadata client.get_system_policy( request, @@ -1897,6 +1951,7 @@ def test_get_system_policy_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-binary-authorization/tests/unit/gapic/binaryauthorization_v1/test_validation_helper_v1.py b/packages/google-cloud-binary-authorization/tests/unit/gapic/binaryauthorization_v1/test_validation_helper_v1.py index 614c6fc6b159..e9fe91565768 100644 --- a/packages/google-cloud-binary-authorization/tests/unit/gapic/binaryauthorization_v1/test_validation_helper_v1.py +++ b/packages/google-cloud-binary-authorization/tests/unit/gapic/binaryauthorization_v1/test_validation_helper_v1.py @@ -59,6 +59,13 @@ ) from google.cloud.binaryauthorization_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 @@ -330,6 +337,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 = ValidationHelperV1Client(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 = ValidationHelperV1Client(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", [ @@ -1785,11 +1835,15 @@ def test_validate_attestation_occurrence_rest_interceptors(null_interceptor): transports.ValidationHelperV1RestInterceptor, "post_validate_attestation_occurrence", ) as post, mock.patch.object( + transports.ValidationHelperV1RestInterceptor, + "post_validate_attestation_occurrence_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ValidationHelperV1RestInterceptor, "pre_validate_attestation_occurrence", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ValidateAttestationOccurrenceRequest.pb( service.ValidateAttestationOccurrenceRequest() ) @@ -1815,6 +1869,10 @@ def test_validate_attestation_occurrence_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ValidateAttestationOccurrenceResponse() + post_with_metadata.return_value = ( + service.ValidateAttestationOccurrenceResponse(), + metadata, + ) client.validate_attestation_occurrence( request, @@ -1826,6 +1884,7 @@ def test_validate_attestation_occurrence_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-binary-authorization/tests/unit/gapic/binaryauthorization_v1beta1/test_binauthz_management_service_v1_beta1.py b/packages/google-cloud-binary-authorization/tests/unit/gapic/binaryauthorization_v1beta1/test_binauthz_management_service_v1_beta1.py index caacaa039933..36e754f926c4 100644 --- a/packages/google-cloud-binary-authorization/tests/unit/gapic/binaryauthorization_v1beta1/test_binauthz_management_service_v1_beta1.py +++ b/packages/google-cloud-binary-authorization/tests/unit/gapic/binaryauthorization_v1beta1/test_binauthz_management_service_v1_beta1.py @@ -61,6 +61,13 @@ ) from google.cloud.binaryauthorization_v1beta1.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 @@ -355,6 +362,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 = BinauthzManagementServiceV1Beta1Client(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 = BinauthzManagementServiceV1Beta1Client(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", [ @@ -5512,10 +5562,14 @@ def test_get_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BinauthzManagementServiceV1Beta1RestInterceptor, "post_get_policy" ) as post, mock.patch.object( + transports.BinauthzManagementServiceV1Beta1RestInterceptor, + "post_get_policy_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.BinauthzManagementServiceV1Beta1RestInterceptor, "pre_get_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetPolicyRequest.pb(service.GetPolicyRequest()) transcode.return_value = { "method": "post", @@ -5537,6 +5591,7 @@ def test_get_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Policy() + post_with_metadata.return_value = resources.Policy(), metadata client.get_policy( request, @@ -5548,6 +5603,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_update_policy_rest_bad_request(request_type=service.UpdatePolicyRequest): @@ -5723,10 +5779,14 @@ def test_update_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BinauthzManagementServiceV1Beta1RestInterceptor, "post_update_policy" ) as post, mock.patch.object( + transports.BinauthzManagementServiceV1Beta1RestInterceptor, + "post_update_policy_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.BinauthzManagementServiceV1Beta1RestInterceptor, "pre_update_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.UpdatePolicyRequest.pb(service.UpdatePolicyRequest()) transcode.return_value = { "method": "post", @@ -5748,6 +5808,7 @@ def test_update_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Policy() + post_with_metadata.return_value = resources.Policy(), metadata client.update_policy( request, @@ -5759,6 +5820,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_create_attestor_rest_bad_request(request_type=service.CreateAttestorRequest): @@ -5931,11 +5993,15 @@ def test_create_attestor_rest_interceptors(null_interceptor): transports.BinauthzManagementServiceV1Beta1RestInterceptor, "post_create_attestor", ) as post, mock.patch.object( + transports.BinauthzManagementServiceV1Beta1RestInterceptor, + "post_create_attestor_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.BinauthzManagementServiceV1Beta1RestInterceptor, "pre_create_attestor", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateAttestorRequest.pb(service.CreateAttestorRequest()) transcode.return_value = { "method": "post", @@ -5957,6 +6023,7 @@ def test_create_attestor_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Attestor() + post_with_metadata.return_value = resources.Attestor(), metadata client.create_attestor( request, @@ -5968,6 +6035,7 @@ def test_create_attestor_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_attestor_rest_bad_request(request_type=service.GetAttestorRequest): @@ -6052,10 +6120,14 @@ def test_get_attestor_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BinauthzManagementServiceV1Beta1RestInterceptor, "post_get_attestor" ) as post, mock.patch.object( + transports.BinauthzManagementServiceV1Beta1RestInterceptor, + "post_get_attestor_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.BinauthzManagementServiceV1Beta1RestInterceptor, "pre_get_attestor" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetAttestorRequest.pb(service.GetAttestorRequest()) transcode.return_value = { "method": "post", @@ -6077,6 +6149,7 @@ def test_get_attestor_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Attestor() + post_with_metadata.return_value = resources.Attestor(), metadata client.get_attestor( request, @@ -6088,6 +6161,7 @@ def test_get_attestor_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_attestor_rest_bad_request(request_type=service.UpdateAttestorRequest): @@ -6260,11 +6334,15 @@ def test_update_attestor_rest_interceptors(null_interceptor): transports.BinauthzManagementServiceV1Beta1RestInterceptor, "post_update_attestor", ) as post, mock.patch.object( + transports.BinauthzManagementServiceV1Beta1RestInterceptor, + "post_update_attestor_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.BinauthzManagementServiceV1Beta1RestInterceptor, "pre_update_attestor", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.UpdateAttestorRequest.pb(service.UpdateAttestorRequest()) transcode.return_value = { "method": "post", @@ -6286,6 +6364,7 @@ def test_update_attestor_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Attestor() + post_with_metadata.return_value = resources.Attestor(), metadata client.update_attestor( request, @@ -6297,6 +6376,7 @@ def test_update_attestor_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_attestors_rest_bad_request(request_type=service.ListAttestorsRequest): @@ -6380,10 +6460,14 @@ def test_list_attestors_rest_interceptors(null_interceptor): transports.BinauthzManagementServiceV1Beta1RestInterceptor, "post_list_attestors", ) as post, mock.patch.object( + transports.BinauthzManagementServiceV1Beta1RestInterceptor, + "post_list_attestors_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.BinauthzManagementServiceV1Beta1RestInterceptor, "pre_list_attestors" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListAttestorsRequest.pb(service.ListAttestorsRequest()) transcode.return_value = { "method": "post", @@ -6407,6 +6491,7 @@ def test_list_attestors_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListAttestorsResponse() + post_with_metadata.return_value = service.ListAttestorsResponse(), metadata client.list_attestors( request, @@ -6418,6 +6503,7 @@ def test_list_attestors_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_attestor_rest_bad_request(request_type=service.DeleteAttestorRequest): diff --git a/packages/google-cloud-binary-authorization/tests/unit/gapic/binaryauthorization_v1beta1/test_system_policy_v1_beta1.py b/packages/google-cloud-binary-authorization/tests/unit/gapic/binaryauthorization_v1beta1/test_system_policy_v1_beta1.py index a087ff6756ca..da5fa9ed9973 100644 --- a/packages/google-cloud-binary-authorization/tests/unit/gapic/binaryauthorization_v1beta1/test_system_policy_v1_beta1.py +++ b/packages/google-cloud-binary-authorization/tests/unit/gapic/binaryauthorization_v1beta1/test_system_policy_v1_beta1.py @@ -60,6 +60,13 @@ ) from google.cloud.binaryauthorization_v1beta1.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 @@ -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 = SystemPolicyV1Beta1Client(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 = SystemPolicyV1Beta1Client(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", [ @@ -1917,10 +1967,14 @@ def test_get_system_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SystemPolicyV1Beta1RestInterceptor, "post_get_system_policy" ) as post, mock.patch.object( + transports.SystemPolicyV1Beta1RestInterceptor, + "post_get_system_policy_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SystemPolicyV1Beta1RestInterceptor, "pre_get_system_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetSystemPolicyRequest.pb(service.GetSystemPolicyRequest()) transcode.return_value = { "method": "post", @@ -1942,6 +1996,7 @@ def test_get_system_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Policy() + post_with_metadata.return_value = resources.Policy(), metadata client.get_system_policy( request, @@ -1953,6 +2008,7 @@ def test_get_system_policy_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-build/google/cloud/devtools/cloudbuild/gapic_version.py b/packages/google-cloud-build/google/cloud/devtools/cloudbuild/gapic_version.py index 856a3fbea2a6..558c8aab67c5 100644 --- a/packages/google-cloud-build/google/cloud/devtools/cloudbuild/gapic_version.py +++ b/packages/google-cloud-build/google/cloud/devtools/cloudbuild/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "3.29.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-build/google/cloud/devtools/cloudbuild_v1/gapic_version.py b/packages/google-cloud-build/google/cloud/devtools/cloudbuild_v1/gapic_version.py index 856a3fbea2a6..558c8aab67c5 100644 --- a/packages/google-cloud-build/google/cloud/devtools/cloudbuild_v1/gapic_version.py +++ b/packages/google-cloud-build/google/cloud/devtools/cloudbuild_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "3.29.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-build/google/cloud/devtools/cloudbuild_v1/services/cloud_build/client.py b/packages/google-cloud-build/google/cloud/devtools/cloudbuild_v1/services/cloud_build/client.py index 348efb88cb69..ce824b0d6df8 100644 --- a/packages/google-cloud-build/google/cloud/devtools/cloudbuild_v1/services/cloud_build/client.py +++ b/packages/google-cloud-build/google/cloud/devtools/cloudbuild_v1/services/cloud_build/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 @@ -719,6 +721,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-build/google/cloud/devtools/cloudbuild_v1/services/cloud_build/transports/rest.py b/packages/google-cloud-build/google/cloud/devtools/cloudbuild_v1/services/cloud_build/transports/rest.py index f3b4ff8c54ec..1993e6e0b275 100644 --- a/packages/google-cloud-build/google/cloud/devtools/cloudbuild_v1/services/cloud_build/transports/rest.py +++ b/packages/google-cloud-build/google/cloud/devtools/cloudbuild_v1/services/cloud_build/transports/rest.py @@ -233,12 +233,35 @@ def post_approve_build( ) -> operations_pb2.Operation: """Post-rpc interceptor for approve_build - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_approve_build_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudBuild server but before - it is returned to user code. + it is returned to user code. This `post_approve_build` interceptor runs + before the `post_approve_build_with_metadata` interceptor. """ return response + def post_approve_build_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 approve_build + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudBuild server but before it is returned to user code. + + We recommend only using this `post_approve_build_with_metadata` + interceptor in new development instead of the `post_approve_build` interceptor. + When both interceptors are used, this `post_approve_build_with_metadata` interceptor runs after the + `post_approve_build` interceptor. The (possibly modified) response returned by + `post_approve_build` will be passed to + `post_approve_build_with_metadata`. + """ + return response, metadata + def pre_cancel_build( self, request: cloudbuild.CancelBuildRequest, @@ -254,12 +277,35 @@ def pre_cancel_build( def post_cancel_build(self, response: cloudbuild.Build) -> cloudbuild.Build: """Post-rpc interceptor for cancel_build - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_cancel_build_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudBuild server but before - it is returned to user code. + it is returned to user code. This `post_cancel_build` interceptor runs + before the `post_cancel_build_with_metadata` interceptor. """ return response + def post_cancel_build_with_metadata( + self, + response: cloudbuild.Build, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cloudbuild.Build, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for cancel_build + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudBuild server but before it is returned to user code. + + We recommend only using this `post_cancel_build_with_metadata` + interceptor in new development instead of the `post_cancel_build` interceptor. + When both interceptors are used, this `post_cancel_build_with_metadata` interceptor runs after the + `post_cancel_build` interceptor. The (possibly modified) response returned by + `post_cancel_build` will be passed to + `post_cancel_build_with_metadata`. + """ + return response, metadata + def pre_create_build( self, request: cloudbuild.CreateBuildRequest, @@ -277,12 +323,35 @@ def post_create_build( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_build - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_build_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudBuild server but before - it is returned to user code. + it is returned to user code. This `post_create_build` interceptor runs + before the `post_create_build_with_metadata` interceptor. """ return response + def post_create_build_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_build + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudBuild server but before it is returned to user code. + + We recommend only using this `post_create_build_with_metadata` + interceptor in new development instead of the `post_create_build` interceptor. + When both interceptors are used, this `post_create_build_with_metadata` interceptor runs after the + `post_create_build` interceptor. The (possibly modified) response returned by + `post_create_build` will be passed to + `post_create_build_with_metadata`. + """ + return response, metadata + def pre_create_build_trigger( self, request: cloudbuild.CreateBuildTriggerRequest, @@ -302,12 +371,35 @@ def post_create_build_trigger( ) -> cloudbuild.BuildTrigger: """Post-rpc interceptor for create_build_trigger - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_build_trigger_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudBuild server but before - it is returned to user code. + it is returned to user code. This `post_create_build_trigger` interceptor runs + before the `post_create_build_trigger_with_metadata` interceptor. """ return response + def post_create_build_trigger_with_metadata( + self, + response: cloudbuild.BuildTrigger, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cloudbuild.BuildTrigger, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_build_trigger + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudBuild server but before it is returned to user code. + + We recommend only using this `post_create_build_trigger_with_metadata` + interceptor in new development instead of the `post_create_build_trigger` interceptor. + When both interceptors are used, this `post_create_build_trigger_with_metadata` interceptor runs after the + `post_create_build_trigger` interceptor. The (possibly modified) response returned by + `post_create_build_trigger` will be passed to + `post_create_build_trigger_with_metadata`. + """ + return response, metadata + def pre_create_worker_pool( self, request: cloudbuild.CreateWorkerPoolRequest, @@ -327,12 +419,35 @@ def post_create_worker_pool( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_worker_pool - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_worker_pool_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudBuild server but before - it is returned to user code. + it is returned to user code. This `post_create_worker_pool` interceptor runs + before the `post_create_worker_pool_with_metadata` interceptor. """ return response + def post_create_worker_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_worker_pool + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudBuild server but before it is returned to user code. + + We recommend only using this `post_create_worker_pool_with_metadata` + interceptor in new development instead of the `post_create_worker_pool` interceptor. + When both interceptors are used, this `post_create_worker_pool_with_metadata` interceptor runs after the + `post_create_worker_pool` interceptor. The (possibly modified) response returned by + `post_create_worker_pool` will be passed to + `post_create_worker_pool_with_metadata`. + """ + return response, metadata + def pre_delete_build_trigger( self, request: cloudbuild.DeleteBuildTriggerRequest, @@ -366,12 +481,35 @@ def post_delete_worker_pool( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_worker_pool - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_worker_pool_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudBuild server but before - it is returned to user code. + it is returned to user code. This `post_delete_worker_pool` interceptor runs + before the `post_delete_worker_pool_with_metadata` interceptor. """ return response + def post_delete_worker_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_worker_pool + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudBuild server but before it is returned to user code. + + We recommend only using this `post_delete_worker_pool_with_metadata` + interceptor in new development instead of the `post_delete_worker_pool` interceptor. + When both interceptors are used, this `post_delete_worker_pool_with_metadata` interceptor runs after the + `post_delete_worker_pool` interceptor. The (possibly modified) response returned by + `post_delete_worker_pool` will be passed to + `post_delete_worker_pool_with_metadata`. + """ + return response, metadata + def pre_get_build( self, request: cloudbuild.GetBuildRequest, @@ -387,12 +525,35 @@ def pre_get_build( def post_get_build(self, response: cloudbuild.Build) -> cloudbuild.Build: """Post-rpc interceptor for get_build - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_build_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudBuild server but before - it is returned to user code. + it is returned to user code. This `post_get_build` interceptor runs + before the `post_get_build_with_metadata` interceptor. """ return response + def post_get_build_with_metadata( + self, + response: cloudbuild.Build, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cloudbuild.Build, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_build + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudBuild server but before it is returned to user code. + + We recommend only using this `post_get_build_with_metadata` + interceptor in new development instead of the `post_get_build` interceptor. + When both interceptors are used, this `post_get_build_with_metadata` interceptor runs after the + `post_get_build` interceptor. The (possibly modified) response returned by + `post_get_build` will be passed to + `post_get_build_with_metadata`. + """ + return response, metadata + def pre_get_build_trigger( self, request: cloudbuild.GetBuildTriggerRequest, @@ -412,12 +573,35 @@ def post_get_build_trigger( ) -> cloudbuild.BuildTrigger: """Post-rpc interceptor for get_build_trigger - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_build_trigger_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudBuild server but before - it is returned to user code. + it is returned to user code. This `post_get_build_trigger` interceptor runs + before the `post_get_build_trigger_with_metadata` interceptor. """ return response + def post_get_build_trigger_with_metadata( + self, + response: cloudbuild.BuildTrigger, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cloudbuild.BuildTrigger, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_build_trigger + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudBuild server but before it is returned to user code. + + We recommend only using this `post_get_build_trigger_with_metadata` + interceptor in new development instead of the `post_get_build_trigger` interceptor. + When both interceptors are used, this `post_get_build_trigger_with_metadata` interceptor runs after the + `post_get_build_trigger` interceptor. The (possibly modified) response returned by + `post_get_build_trigger` will be passed to + `post_get_build_trigger_with_metadata`. + """ + return response, metadata + def pre_get_worker_pool( self, request: cloudbuild.GetWorkerPoolRequest, @@ -437,12 +621,35 @@ def post_get_worker_pool( ) -> cloudbuild.WorkerPool: """Post-rpc interceptor for get_worker_pool - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_worker_pool_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudBuild server but before - it is returned to user code. + it is returned to user code. This `post_get_worker_pool` interceptor runs + before the `post_get_worker_pool_with_metadata` interceptor. """ return response + def post_get_worker_pool_with_metadata( + self, + response: cloudbuild.WorkerPool, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cloudbuild.WorkerPool, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_worker_pool + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudBuild server but before it is returned to user code. + + We recommend only using this `post_get_worker_pool_with_metadata` + interceptor in new development instead of the `post_get_worker_pool` interceptor. + When both interceptors are used, this `post_get_worker_pool_with_metadata` interceptor runs after the + `post_get_worker_pool` interceptor. The (possibly modified) response returned by + `post_get_worker_pool` will be passed to + `post_get_worker_pool_with_metadata`. + """ + return response, metadata + def pre_list_builds( self, request: cloudbuild.ListBuildsRequest, @@ -460,12 +667,35 @@ def post_list_builds( ) -> cloudbuild.ListBuildsResponse: """Post-rpc interceptor for list_builds - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_builds_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudBuild server but before - it is returned to user code. + it is returned to user code. This `post_list_builds` interceptor runs + before the `post_list_builds_with_metadata` interceptor. """ return response + def post_list_builds_with_metadata( + self, + response: cloudbuild.ListBuildsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cloudbuild.ListBuildsResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_builds + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudBuild server but before it is returned to user code. + + We recommend only using this `post_list_builds_with_metadata` + interceptor in new development instead of the `post_list_builds` interceptor. + When both interceptors are used, this `post_list_builds_with_metadata` interceptor runs after the + `post_list_builds` interceptor. The (possibly modified) response returned by + `post_list_builds` will be passed to + `post_list_builds_with_metadata`. + """ + return response, metadata + def pre_list_build_triggers( self, request: cloudbuild.ListBuildTriggersRequest, @@ -485,12 +715,37 @@ def post_list_build_triggers( ) -> cloudbuild.ListBuildTriggersResponse: """Post-rpc interceptor for list_build_triggers - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_build_triggers_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudBuild server but before - it is returned to user code. + it is returned to user code. This `post_list_build_triggers` interceptor runs + before the `post_list_build_triggers_with_metadata` interceptor. """ return response + def post_list_build_triggers_with_metadata( + self, + response: cloudbuild.ListBuildTriggersResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + cloudbuild.ListBuildTriggersResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_build_triggers + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudBuild server but before it is returned to user code. + + We recommend only using this `post_list_build_triggers_with_metadata` + interceptor in new development instead of the `post_list_build_triggers` interceptor. + When both interceptors are used, this `post_list_build_triggers_with_metadata` interceptor runs after the + `post_list_build_triggers` interceptor. The (possibly modified) response returned by + `post_list_build_triggers` will be passed to + `post_list_build_triggers_with_metadata`. + """ + return response, metadata + def pre_list_worker_pools( self, request: cloudbuild.ListWorkerPoolsRequest, @@ -510,12 +765,37 @@ def post_list_worker_pools( ) -> cloudbuild.ListWorkerPoolsResponse: """Post-rpc interceptor for list_worker_pools - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_worker_pools_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudBuild server but before - it is returned to user code. + it is returned to user code. This `post_list_worker_pools` interceptor runs + before the `post_list_worker_pools_with_metadata` interceptor. """ return response + def post_list_worker_pools_with_metadata( + self, + response: cloudbuild.ListWorkerPoolsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + cloudbuild.ListWorkerPoolsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_worker_pools + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudBuild server but before it is returned to user code. + + We recommend only using this `post_list_worker_pools_with_metadata` + interceptor in new development instead of the `post_list_worker_pools` interceptor. + When both interceptors are used, this `post_list_worker_pools_with_metadata` interceptor runs after the + `post_list_worker_pools` interceptor. The (possibly modified) response returned by + `post_list_worker_pools` will be passed to + `post_list_worker_pools_with_metadata`. + """ + return response, metadata + def pre_receive_trigger_webhook( self, request: cloudbuild.ReceiveTriggerWebhookRequest, @@ -535,12 +815,38 @@ def post_receive_trigger_webhook( ) -> cloudbuild.ReceiveTriggerWebhookResponse: """Post-rpc interceptor for receive_trigger_webhook - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_receive_trigger_webhook_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudBuild server but before - it is returned to user code. + it is returned to user code. This `post_receive_trigger_webhook` interceptor runs + before the `post_receive_trigger_webhook_with_metadata` interceptor. """ return response + def post_receive_trigger_webhook_with_metadata( + self, + response: cloudbuild.ReceiveTriggerWebhookResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + cloudbuild.ReceiveTriggerWebhookResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for receive_trigger_webhook + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudBuild server but before it is returned to user code. + + We recommend only using this `post_receive_trigger_webhook_with_metadata` + interceptor in new development instead of the `post_receive_trigger_webhook` interceptor. + When both interceptors are used, this `post_receive_trigger_webhook_with_metadata` interceptor runs after the + `post_receive_trigger_webhook` interceptor. The (possibly modified) response returned by + `post_receive_trigger_webhook` will be passed to + `post_receive_trigger_webhook_with_metadata`. + """ + return response, metadata + def pre_retry_build( self, request: cloudbuild.RetryBuildRequest, @@ -558,12 +864,35 @@ def post_retry_build( ) -> operations_pb2.Operation: """Post-rpc interceptor for retry_build - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_retry_build_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudBuild server but before - it is returned to user code. + it is returned to user code. This `post_retry_build` interceptor runs + before the `post_retry_build_with_metadata` interceptor. """ return response + def post_retry_build_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 retry_build + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudBuild server but before it is returned to user code. + + We recommend only using this `post_retry_build_with_metadata` + interceptor in new development instead of the `post_retry_build` interceptor. + When both interceptors are used, this `post_retry_build_with_metadata` interceptor runs after the + `post_retry_build` interceptor. The (possibly modified) response returned by + `post_retry_build` will be passed to + `post_retry_build_with_metadata`. + """ + return response, metadata + def pre_run_build_trigger( self, request: cloudbuild.RunBuildTriggerRequest, @@ -583,12 +912,35 @@ def post_run_build_trigger( ) -> operations_pb2.Operation: """Post-rpc interceptor for run_build_trigger - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_run_build_trigger_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudBuild server but before - it is returned to user code. + it is returned to user code. This `post_run_build_trigger` interceptor runs + before the `post_run_build_trigger_with_metadata` interceptor. """ return response + def post_run_build_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 run_build_trigger + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudBuild server but before it is returned to user code. + + We recommend only using this `post_run_build_trigger_with_metadata` + interceptor in new development instead of the `post_run_build_trigger` interceptor. + When both interceptors are used, this `post_run_build_trigger_with_metadata` interceptor runs after the + `post_run_build_trigger` interceptor. The (possibly modified) response returned by + `post_run_build_trigger` will be passed to + `post_run_build_trigger_with_metadata`. + """ + return response, metadata + def pre_update_build_trigger( self, request: cloudbuild.UpdateBuildTriggerRequest, @@ -608,12 +960,35 @@ def post_update_build_trigger( ) -> cloudbuild.BuildTrigger: """Post-rpc interceptor for update_build_trigger - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_build_trigger_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudBuild server but before - it is returned to user code. + it is returned to user code. This `post_update_build_trigger` interceptor runs + before the `post_update_build_trigger_with_metadata` interceptor. """ return response + def post_update_build_trigger_with_metadata( + self, + response: cloudbuild.BuildTrigger, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cloudbuild.BuildTrigger, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_build_trigger + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudBuild server but before it is returned to user code. + + We recommend only using this `post_update_build_trigger_with_metadata` + interceptor in new development instead of the `post_update_build_trigger` interceptor. + When both interceptors are used, this `post_update_build_trigger_with_metadata` interceptor runs after the + `post_update_build_trigger` interceptor. The (possibly modified) response returned by + `post_update_build_trigger` will be passed to + `post_update_build_trigger_with_metadata`. + """ + return response, metadata + def pre_update_worker_pool( self, request: cloudbuild.UpdateWorkerPoolRequest, @@ -633,12 +1008,35 @@ def post_update_worker_pool( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_worker_pool - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_worker_pool_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudBuild server but before - it is returned to user code. + it is returned to user code. This `post_update_worker_pool` interceptor runs + before the `post_update_worker_pool_with_metadata` interceptor. """ return response + def post_update_worker_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_worker_pool + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudBuild server but before it is returned to user code. + + We recommend only using this `post_update_worker_pool_with_metadata` + interceptor in new development instead of the `post_update_worker_pool` interceptor. + When both interceptors are used, this `post_update_worker_pool_with_metadata` interceptor runs after the + `post_update_worker_pool` interceptor. The (possibly modified) response returned by + `post_update_worker_pool` will be passed to + `post_update_worker_pool_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class CloudBuildRestStub: @@ -915,6 +1313,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_approve_build(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_approve_build_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1089,6 +1491,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_cancel_build(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_cancel_build_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1240,6 +1646,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_build(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_build_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1391,6 +1801,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_build_trigger(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_build_trigger_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1540,6 +1954,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_worker_pool(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_worker_pool_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1791,6 +2209,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_worker_pool(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_worker_pool_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1957,6 +2379,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_build(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_build_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2102,6 +2528,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_build_trigger(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_build_trigger_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2261,6 +2691,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_worker_pool(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_worker_pool_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2403,6 +2837,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_builds(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_builds_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2545,6 +2983,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_build_triggers(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_build_triggers_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2689,6 +3131,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_worker_pools(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_worker_pools_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2843,6 +3289,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_receive_trigger_webhook(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_receive_trigger_webhook_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2994,6 +3444,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_retry_build(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_retry_build_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3144,6 +3598,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_run_build_trigger(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_run_build_trigger_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3295,6 +3753,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_build_trigger(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_build_trigger_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3444,6 +3906,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_worker_pool(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_worker_pool_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-build/google/cloud/devtools/cloudbuild_v2/gapic_version.py b/packages/google-cloud-build/google/cloud/devtools/cloudbuild_v2/gapic_version.py index 856a3fbea2a6..558c8aab67c5 100644 --- a/packages/google-cloud-build/google/cloud/devtools/cloudbuild_v2/gapic_version.py +++ b/packages/google-cloud-build/google/cloud/devtools/cloudbuild_v2/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "3.29.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-build/google/cloud/devtools/cloudbuild_v2/services/repository_manager/client.py b/packages/google-cloud-build/google/cloud/devtools/cloudbuild_v2/services/repository_manager/client.py index af342d03425e..e6a62178a8be 100644 --- a/packages/google-cloud-build/google/cloud/devtools/cloudbuild_v2/services/repository_manager/client.py +++ b/packages/google-cloud-build/google/cloud/devtools/cloudbuild_v2/services/repository_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 @@ -566,6 +568,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. @@ -2514,16 +2543,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, @@ -2690,16 +2723,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, @@ -2812,16 +2849,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, @@ -2872,16 +2913,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-build/google/cloud/devtools/cloudbuild_v2/services/repository_manager/transports/rest.py b/packages/google-cloud-build/google/cloud/devtools/cloudbuild_v2/services/repository_manager/transports/rest.py index 423e06e151e9..919c70ccefda 100644 --- a/packages/google-cloud-build/google/cloud/devtools/cloudbuild_v2/services/repository_manager/transports/rest.py +++ b/packages/google-cloud-build/google/cloud/devtools/cloudbuild_v2/services/repository_manager/transports/rest.py @@ -210,12 +210,35 @@ def post_batch_create_repositories( ) -> operations_pb2.Operation: """Post-rpc interceptor for batch_create_repositories - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_batch_create_repositories_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RepositoryManager server but before - it is returned to user code. + it is returned to user code. This `post_batch_create_repositories` interceptor runs + before the `post_batch_create_repositories_with_metadata` interceptor. """ return response + def post_batch_create_repositories_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 batch_create_repositories + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RepositoryManager server but before it is returned to user code. + + We recommend only using this `post_batch_create_repositories_with_metadata` + interceptor in new development instead of the `post_batch_create_repositories` interceptor. + When both interceptors are used, this `post_batch_create_repositories_with_metadata` interceptor runs after the + `post_batch_create_repositories` interceptor. The (possibly modified) response returned by + `post_batch_create_repositories` will be passed to + `post_batch_create_repositories_with_metadata`. + """ + return response, metadata + def pre_create_connection( self, request: repositories.CreateConnectionRequest, @@ -235,12 +258,35 @@ def post_create_connection( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_connection - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_connection_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RepositoryManager server but before - it is returned to user code. + it is returned to user code. This `post_create_connection` interceptor runs + before the `post_create_connection_with_metadata` interceptor. """ return response + def post_create_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_connection + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RepositoryManager server but before it is returned to user code. + + We recommend only using this `post_create_connection_with_metadata` + interceptor in new development instead of the `post_create_connection` interceptor. + When both interceptors are used, this `post_create_connection_with_metadata` interceptor runs after the + `post_create_connection` interceptor. The (possibly modified) response returned by + `post_create_connection` will be passed to + `post_create_connection_with_metadata`. + """ + return response, metadata + def pre_create_repository( self, request: repositories.CreateRepositoryRequest, @@ -260,12 +306,35 @@ def post_create_repository( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_repository - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_repository_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RepositoryManager server but before - it is returned to user code. + it is returned to user code. This `post_create_repository` interceptor runs + before the `post_create_repository_with_metadata` interceptor. """ return response + def post_create_repository_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_repository + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RepositoryManager server but before it is returned to user code. + + We recommend only using this `post_create_repository_with_metadata` + interceptor in new development instead of the `post_create_repository` interceptor. + When both interceptors are used, this `post_create_repository_with_metadata` interceptor runs after the + `post_create_repository` interceptor. The (possibly modified) response returned by + `post_create_repository` will be passed to + `post_create_repository_with_metadata`. + """ + return response, metadata + def pre_delete_connection( self, request: repositories.DeleteConnectionRequest, @@ -285,12 +354,35 @@ def post_delete_connection( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_connection - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_connection_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RepositoryManager server but before - it is returned to user code. + it is returned to user code. This `post_delete_connection` interceptor runs + before the `post_delete_connection_with_metadata` interceptor. """ return response + def post_delete_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_connection + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RepositoryManager server but before it is returned to user code. + + We recommend only using this `post_delete_connection_with_metadata` + interceptor in new development instead of the `post_delete_connection` interceptor. + When both interceptors are used, this `post_delete_connection_with_metadata` interceptor runs after the + `post_delete_connection` interceptor. The (possibly modified) response returned by + `post_delete_connection` will be passed to + `post_delete_connection_with_metadata`. + """ + return response, metadata + def pre_delete_repository( self, request: repositories.DeleteRepositoryRequest, @@ -310,12 +402,35 @@ def post_delete_repository( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_repository - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_repository_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RepositoryManager server but before - it is returned to user code. + it is returned to user code. This `post_delete_repository` interceptor runs + before the `post_delete_repository_with_metadata` interceptor. """ return response + def post_delete_repository_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_repository + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RepositoryManager server but before it is returned to user code. + + We recommend only using this `post_delete_repository_with_metadata` + interceptor in new development instead of the `post_delete_repository` interceptor. + When both interceptors are used, this `post_delete_repository_with_metadata` interceptor runs after the + `post_delete_repository` interceptor. The (possibly modified) response returned by + `post_delete_repository` will be passed to + `post_delete_repository_with_metadata`. + """ + return response, metadata + def pre_fetch_git_refs( self, request: repositories.FetchGitRefsRequest, @@ -335,12 +450,37 @@ def post_fetch_git_refs( ) -> repositories.FetchGitRefsResponse: """Post-rpc interceptor for fetch_git_refs - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_fetch_git_refs_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RepositoryManager server but before - it is returned to user code. + it is returned to user code. This `post_fetch_git_refs` interceptor runs + before the `post_fetch_git_refs_with_metadata` interceptor. """ return response + def post_fetch_git_refs_with_metadata( + self, + response: repositories.FetchGitRefsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + repositories.FetchGitRefsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for fetch_git_refs + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RepositoryManager server but before it is returned to user code. + + We recommend only using this `post_fetch_git_refs_with_metadata` + interceptor in new development instead of the `post_fetch_git_refs` interceptor. + When both interceptors are used, this `post_fetch_git_refs_with_metadata` interceptor runs after the + `post_fetch_git_refs` interceptor. The (possibly modified) response returned by + `post_fetch_git_refs` will be passed to + `post_fetch_git_refs_with_metadata`. + """ + return response, metadata + def pre_fetch_linkable_repositories( self, request: repositories.FetchLinkableRepositoriesRequest, @@ -361,12 +501,38 @@ def post_fetch_linkable_repositories( ) -> repositories.FetchLinkableRepositoriesResponse: """Post-rpc interceptor for fetch_linkable_repositories - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_fetch_linkable_repositories_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RepositoryManager server but before - it is returned to user code. + it is returned to user code. This `post_fetch_linkable_repositories` interceptor runs + before the `post_fetch_linkable_repositories_with_metadata` interceptor. """ return response + def post_fetch_linkable_repositories_with_metadata( + self, + response: repositories.FetchLinkableRepositoriesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + repositories.FetchLinkableRepositoriesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for fetch_linkable_repositories + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RepositoryManager server but before it is returned to user code. + + We recommend only using this `post_fetch_linkable_repositories_with_metadata` + interceptor in new development instead of the `post_fetch_linkable_repositories` interceptor. + When both interceptors are used, this `post_fetch_linkable_repositories_with_metadata` interceptor runs after the + `post_fetch_linkable_repositories` interceptor. The (possibly modified) response returned by + `post_fetch_linkable_repositories` will be passed to + `post_fetch_linkable_repositories_with_metadata`. + """ + return response, metadata + def pre_fetch_read_token( self, request: repositories.FetchReadTokenRequest, @@ -386,12 +552,37 @@ def post_fetch_read_token( ) -> repositories.FetchReadTokenResponse: """Post-rpc interceptor for fetch_read_token - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_fetch_read_token_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RepositoryManager server but before - it is returned to user code. + it is returned to user code. This `post_fetch_read_token` interceptor runs + before the `post_fetch_read_token_with_metadata` interceptor. """ return response + def post_fetch_read_token_with_metadata( + self, + response: repositories.FetchReadTokenResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + repositories.FetchReadTokenResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for fetch_read_token + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RepositoryManager server but before it is returned to user code. + + We recommend only using this `post_fetch_read_token_with_metadata` + interceptor in new development instead of the `post_fetch_read_token` interceptor. + When both interceptors are used, this `post_fetch_read_token_with_metadata` interceptor runs after the + `post_fetch_read_token` interceptor. The (possibly modified) response returned by + `post_fetch_read_token` will be passed to + `post_fetch_read_token_with_metadata`. + """ + return response, metadata + def pre_fetch_read_write_token( self, request: repositories.FetchReadWriteTokenRequest, @@ -411,12 +602,38 @@ def post_fetch_read_write_token( ) -> repositories.FetchReadWriteTokenResponse: """Post-rpc interceptor for fetch_read_write_token - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_fetch_read_write_token_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RepositoryManager server but before - it is returned to user code. + it is returned to user code. This `post_fetch_read_write_token` interceptor runs + before the `post_fetch_read_write_token_with_metadata` interceptor. """ return response + def post_fetch_read_write_token_with_metadata( + self, + response: repositories.FetchReadWriteTokenResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + repositories.FetchReadWriteTokenResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for fetch_read_write_token + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RepositoryManager server but before it is returned to user code. + + We recommend only using this `post_fetch_read_write_token_with_metadata` + interceptor in new development instead of the `post_fetch_read_write_token` interceptor. + When both interceptors are used, this `post_fetch_read_write_token_with_metadata` interceptor runs after the + `post_fetch_read_write_token` interceptor. The (possibly modified) response returned by + `post_fetch_read_write_token` will be passed to + `post_fetch_read_write_token_with_metadata`. + """ + return response, metadata + def pre_get_connection( self, request: repositories.GetConnectionRequest, @@ -436,12 +653,35 @@ def post_get_connection( ) -> repositories.Connection: """Post-rpc interceptor for get_connection - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_connection_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RepositoryManager server but before - it is returned to user code. + it is returned to user code. This `post_get_connection` interceptor runs + before the `post_get_connection_with_metadata` interceptor. """ return response + def post_get_connection_with_metadata( + self, + response: repositories.Connection, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[repositories.Connection, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_connection + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RepositoryManager server but before it is returned to user code. + + We recommend only using this `post_get_connection_with_metadata` + interceptor in new development instead of the `post_get_connection` interceptor. + When both interceptors are used, this `post_get_connection_with_metadata` interceptor runs after the + `post_get_connection` interceptor. The (possibly modified) response returned by + `post_get_connection` will be passed to + `post_get_connection_with_metadata`. + """ + return response, metadata + def pre_get_repository( self, request: repositories.GetRepositoryRequest, @@ -461,12 +701,35 @@ def post_get_repository( ) -> repositories.Repository: """Post-rpc interceptor for get_repository - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_repository_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RepositoryManager server but before - it is returned to user code. + it is returned to user code. This `post_get_repository` interceptor runs + before the `post_get_repository_with_metadata` interceptor. """ return response + def post_get_repository_with_metadata( + self, + response: repositories.Repository, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[repositories.Repository, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_repository + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RepositoryManager server but before it is returned to user code. + + We recommend only using this `post_get_repository_with_metadata` + interceptor in new development instead of the `post_get_repository` interceptor. + When both interceptors are used, this `post_get_repository_with_metadata` interceptor runs after the + `post_get_repository` interceptor. The (possibly modified) response returned by + `post_get_repository` will be passed to + `post_get_repository_with_metadata`. + """ + return response, metadata + def pre_list_connections( self, request: repositories.ListConnectionsRequest, @@ -486,12 +749,37 @@ def post_list_connections( ) -> repositories.ListConnectionsResponse: """Post-rpc interceptor for list_connections - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_connections_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RepositoryManager server but before - it is returned to user code. + it is returned to user code. This `post_list_connections` interceptor runs + before the `post_list_connections_with_metadata` interceptor. """ return response + def post_list_connections_with_metadata( + self, + response: repositories.ListConnectionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + repositories.ListConnectionsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_connections + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RepositoryManager server but before it is returned to user code. + + We recommend only using this `post_list_connections_with_metadata` + interceptor in new development instead of the `post_list_connections` interceptor. + When both interceptors are used, this `post_list_connections_with_metadata` interceptor runs after the + `post_list_connections` interceptor. The (possibly modified) response returned by + `post_list_connections` will be passed to + `post_list_connections_with_metadata`. + """ + return response, metadata + def pre_list_repositories( self, request: repositories.ListRepositoriesRequest, @@ -511,12 +799,37 @@ def post_list_repositories( ) -> repositories.ListRepositoriesResponse: """Post-rpc interceptor for list_repositories - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_repositories_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RepositoryManager server but before - it is returned to user code. + it is returned to user code. This `post_list_repositories` interceptor runs + before the `post_list_repositories_with_metadata` interceptor. """ return response + def post_list_repositories_with_metadata( + self, + response: repositories.ListRepositoriesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + repositories.ListRepositoriesResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_repositories + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RepositoryManager server but before it is returned to user code. + + We recommend only using this `post_list_repositories_with_metadata` + interceptor in new development instead of the `post_list_repositories` interceptor. + When both interceptors are used, this `post_list_repositories_with_metadata` interceptor runs after the + `post_list_repositories` interceptor. The (possibly modified) response returned by + `post_list_repositories` will be passed to + `post_list_repositories_with_metadata`. + """ + return response, metadata + def pre_update_connection( self, request: repositories.UpdateConnectionRequest, @@ -536,12 +849,35 @@ def post_update_connection( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_connection - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_connection_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RepositoryManager server but before - it is returned to user code. + it is returned to user code. This `post_update_connection` interceptor runs + before the `post_update_connection_with_metadata` interceptor. """ return response + def post_update_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 update_connection + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RepositoryManager server but before it is returned to user code. + + We recommend only using this `post_update_connection_with_metadata` + interceptor in new development instead of the `post_update_connection` interceptor. + When both interceptors are used, this `post_update_connection_with_metadata` interceptor runs after the + `post_update_connection` interceptor. The (possibly modified) response returned by + `post_update_connection` will be passed to + `post_update_connection_with_metadata`. + """ + return response, metadata + def pre_get_iam_policy( self, request: iam_policy_pb2.GetIamPolicyRequest, @@ -921,6 +1257,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_batch_create_repositories(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_batch_create_repositories_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1071,6 +1411,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_connection(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_connection_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1221,6 +1565,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_repository(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_repository_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1365,6 +1713,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_connection(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_connection_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1509,6 +1861,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_repository(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_repository_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1649,6 +2005,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_fetch_git_refs(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_fetch_git_refs_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1800,6 +2160,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_fetch_linkable_repositories(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_fetch_linkable_repositories_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1953,6 +2317,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_fetch_read_token(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_fetch_read_token_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2109,6 +2477,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_fetch_read_write_token(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_fetch_read_write_token_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2256,6 +2628,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_connection(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_connection_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2400,6 +2776,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_repository(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_repository_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2546,6 +2926,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_connections(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_connections_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2694,6 +3078,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_repositories(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_repositories_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2846,6 +3234,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_connection(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_connection_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-build/samples/generated_samples/snippet_metadata_google.devtools.cloudbuild.v1.json b/packages/google-cloud-build/samples/generated_samples/snippet_metadata_google.devtools.cloudbuild.v1.json index 7d93c6bc8e87..48df7a914e6e 100644 --- a/packages/google-cloud-build/samples/generated_samples/snippet_metadata_google.devtools.cloudbuild.v1.json +++ b/packages/google-cloud-build/samples/generated_samples/snippet_metadata_google.devtools.cloudbuild.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-build", - "version": "3.29.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-build/samples/generated_samples/snippet_metadata_google.devtools.cloudbuild.v2.json b/packages/google-cloud-build/samples/generated_samples/snippet_metadata_google.devtools.cloudbuild.v2.json index 9ea8b0aae38b..b384db6d11b0 100644 --- a/packages/google-cloud-build/samples/generated_samples/snippet_metadata_google.devtools.cloudbuild.v2.json +++ b/packages/google-cloud-build/samples/generated_samples/snippet_metadata_google.devtools.cloudbuild.v2.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-build", - "version": "3.29.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-build/tests/unit/gapic/cloudbuild_v1/test_cloud_build.py b/packages/google-cloud-build/tests/unit/gapic/cloudbuild_v1/test_cloud_build.py index f865cb56cd4b..aad2528059e7 100644 --- a/packages/google-cloud-build/tests/unit/gapic/cloudbuild_v1/test_cloud_build.py +++ b/packages/google-cloud-build/tests/unit/gapic/cloudbuild_v1/test_cloud_build.py @@ -76,6 +76,13 @@ ) from google.cloud.devtools.cloudbuild_v1.types import cloudbuild +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 = CloudBuildClient(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 = CloudBuildClient(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", [ @@ -12981,10 +13031,13 @@ def test_create_build_rest_interceptors(null_interceptor): ), mock.patch.object( transports.CloudBuildRestInterceptor, "post_create_build" ) as post, mock.patch.object( + transports.CloudBuildRestInterceptor, "post_create_build_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudBuildRestInterceptor, "pre_create_build" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudbuild.CreateBuildRequest.pb(cloudbuild.CreateBuildRequest()) transcode.return_value = { "method": "post", @@ -13006,6 +13059,7 @@ def test_create_build_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_build( request, @@ -13017,6 +13071,7 @@ def test_create_build_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_build_rest_bad_request(request_type=cloudbuild.GetBuildRequest): @@ -13119,10 +13174,13 @@ def test_get_build_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudBuildRestInterceptor, "post_get_build" ) as post, mock.patch.object( + transports.CloudBuildRestInterceptor, "post_get_build_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudBuildRestInterceptor, "pre_get_build" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudbuild.GetBuildRequest.pb(cloudbuild.GetBuildRequest()) transcode.return_value = { "method": "post", @@ -13144,6 +13202,7 @@ def test_get_build_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloudbuild.Build() + post_with_metadata.return_value = cloudbuild.Build(), metadata client.get_build( request, @@ -13155,6 +13214,7 @@ def test_get_build_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_builds_rest_bad_request(request_type=cloudbuild.ListBuildsRequest): @@ -13237,10 +13297,13 @@ def test_list_builds_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudBuildRestInterceptor, "post_list_builds" ) as post, mock.patch.object( + transports.CloudBuildRestInterceptor, "post_list_builds_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudBuildRestInterceptor, "pre_list_builds" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudbuild.ListBuildsRequest.pb(cloudbuild.ListBuildsRequest()) transcode.return_value = { "method": "post", @@ -13264,6 +13327,7 @@ def test_list_builds_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloudbuild.ListBuildsResponse() + post_with_metadata.return_value = cloudbuild.ListBuildsResponse(), metadata client.list_builds( request, @@ -13275,6 +13339,7 @@ def test_list_builds_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_cancel_build_rest_bad_request(request_type=cloudbuild.CancelBuildRequest): @@ -13377,10 +13442,13 @@ def test_cancel_build_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudBuildRestInterceptor, "post_cancel_build" ) as post, mock.patch.object( + transports.CloudBuildRestInterceptor, "post_cancel_build_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudBuildRestInterceptor, "pre_cancel_build" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudbuild.CancelBuildRequest.pb(cloudbuild.CancelBuildRequest()) transcode.return_value = { "method": "post", @@ -13402,6 +13470,7 @@ def test_cancel_build_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloudbuild.Build() + post_with_metadata.return_value = cloudbuild.Build(), metadata client.cancel_build( request, @@ -13413,6 +13482,7 @@ def test_cancel_build_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_retry_build_rest_bad_request(request_type=cloudbuild.RetryBuildRequest): @@ -13491,10 +13561,13 @@ def test_retry_build_rest_interceptors(null_interceptor): ), mock.patch.object( transports.CloudBuildRestInterceptor, "post_retry_build" ) as post, mock.patch.object( + transports.CloudBuildRestInterceptor, "post_retry_build_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudBuildRestInterceptor, "pre_retry_build" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudbuild.RetryBuildRequest.pb(cloudbuild.RetryBuildRequest()) transcode.return_value = { "method": "post", @@ -13516,6 +13589,7 @@ def test_retry_build_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.retry_build( request, @@ -13527,6 +13601,7 @@ def test_retry_build_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_approve_build_rest_bad_request(request_type=cloudbuild.ApproveBuildRequest): @@ -13605,10 +13680,13 @@ def test_approve_build_rest_interceptors(null_interceptor): ), mock.patch.object( transports.CloudBuildRestInterceptor, "post_approve_build" ) as post, mock.patch.object( + transports.CloudBuildRestInterceptor, "post_approve_build_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudBuildRestInterceptor, "pre_approve_build" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudbuild.ApproveBuildRequest.pb(cloudbuild.ApproveBuildRequest()) transcode.return_value = { "method": "post", @@ -13630,6 +13708,7 @@ def test_approve_build_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.approve_build( request, @@ -13641,6 +13720,7 @@ def test_approve_build_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_build_trigger_rest_bad_request( @@ -14061,10 +14141,13 @@ def test_create_build_trigger_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudBuildRestInterceptor, "post_create_build_trigger" ) as post, mock.patch.object( + transports.CloudBuildRestInterceptor, "post_create_build_trigger_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudBuildRestInterceptor, "pre_create_build_trigger" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudbuild.CreateBuildTriggerRequest.pb( cloudbuild.CreateBuildTriggerRequest() ) @@ -14088,6 +14171,7 @@ def test_create_build_trigger_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloudbuild.BuildTrigger() + post_with_metadata.return_value = cloudbuild.BuildTrigger(), metadata client.create_build_trigger( request, @@ -14099,6 +14183,7 @@ def test_create_build_trigger_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_build_trigger_rest_bad_request( @@ -14202,10 +14287,13 @@ def test_get_build_trigger_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudBuildRestInterceptor, "post_get_build_trigger" ) as post, mock.patch.object( + transports.CloudBuildRestInterceptor, "post_get_build_trigger_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudBuildRestInterceptor, "pre_get_build_trigger" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudbuild.GetBuildTriggerRequest.pb( cloudbuild.GetBuildTriggerRequest() ) @@ -14229,6 +14317,7 @@ def test_get_build_trigger_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloudbuild.BuildTrigger() + post_with_metadata.return_value = cloudbuild.BuildTrigger(), metadata client.get_build_trigger( request, @@ -14240,6 +14329,7 @@ def test_get_build_trigger_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_build_triggers_rest_bad_request( @@ -14324,10 +14414,13 @@ def test_list_build_triggers_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudBuildRestInterceptor, "post_list_build_triggers" ) as post, mock.patch.object( + transports.CloudBuildRestInterceptor, "post_list_build_triggers_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudBuildRestInterceptor, "pre_list_build_triggers" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudbuild.ListBuildTriggersRequest.pb( cloudbuild.ListBuildTriggersRequest() ) @@ -14353,6 +14446,10 @@ def test_list_build_triggers_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloudbuild.ListBuildTriggersResponse() + post_with_metadata.return_value = ( + cloudbuild.ListBuildTriggersResponse(), + metadata, + ) client.list_build_triggers( request, @@ -14364,6 +14461,7 @@ def test_list_build_triggers_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_build_trigger_rest_bad_request( @@ -14893,10 +14991,13 @@ def test_update_build_trigger_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudBuildRestInterceptor, "post_update_build_trigger" ) as post, mock.patch.object( + transports.CloudBuildRestInterceptor, "post_update_build_trigger_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudBuildRestInterceptor, "pre_update_build_trigger" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudbuild.UpdateBuildTriggerRequest.pb( cloudbuild.UpdateBuildTriggerRequest() ) @@ -14920,6 +15021,7 @@ def test_update_build_trigger_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloudbuild.BuildTrigger() + post_with_metadata.return_value = cloudbuild.BuildTrigger(), metadata client.update_build_trigger( request, @@ -14931,6 +15033,7 @@ def test_update_build_trigger_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_run_build_trigger_rest_bad_request( @@ -15088,10 +15191,13 @@ def test_run_build_trigger_rest_interceptors(null_interceptor): ), mock.patch.object( transports.CloudBuildRestInterceptor, "post_run_build_trigger" ) as post, mock.patch.object( + transports.CloudBuildRestInterceptor, "post_run_build_trigger_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudBuildRestInterceptor, "pre_run_build_trigger" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudbuild.RunBuildTriggerRequest.pb( cloudbuild.RunBuildTriggerRequest() ) @@ -15115,6 +15221,7 @@ def test_run_build_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.run_build_trigger( request, @@ -15126,6 +15233,7 @@ def test_run_build_trigger_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_receive_trigger_webhook_rest_bad_request( @@ -15284,10 +15392,14 @@ def test_receive_trigger_webhook_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudBuildRestInterceptor, "post_receive_trigger_webhook" ) as post, mock.patch.object( + transports.CloudBuildRestInterceptor, + "post_receive_trigger_webhook_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudBuildRestInterceptor, "pre_receive_trigger_webhook" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudbuild.ReceiveTriggerWebhookRequest.pb( cloudbuild.ReceiveTriggerWebhookRequest() ) @@ -15313,6 +15425,10 @@ def test_receive_trigger_webhook_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloudbuild.ReceiveTriggerWebhookResponse() + post_with_metadata.return_value = ( + cloudbuild.ReceiveTriggerWebhookResponse(), + metadata, + ) client.receive_trigger_webhook( request, @@ -15324,6 +15440,7 @@ def test_receive_trigger_webhook_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_worker_pool_rest_bad_request( @@ -15498,10 +15615,13 @@ def test_create_worker_pool_rest_interceptors(null_interceptor): ), mock.patch.object( transports.CloudBuildRestInterceptor, "post_create_worker_pool" ) as post, mock.patch.object( + transports.CloudBuildRestInterceptor, "post_create_worker_pool_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudBuildRestInterceptor, "pre_create_worker_pool" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudbuild.CreateWorkerPoolRequest.pb( cloudbuild.CreateWorkerPoolRequest() ) @@ -15525,6 +15645,7 @@ def test_create_worker_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_worker_pool( request, @@ -15536,6 +15657,7 @@ def test_create_worker_pool_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_worker_pool_rest_bad_request(request_type=cloudbuild.GetWorkerPoolRequest): @@ -15626,10 +15748,13 @@ def test_get_worker_pool_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudBuildRestInterceptor, "post_get_worker_pool" ) as post, mock.patch.object( + transports.CloudBuildRestInterceptor, "post_get_worker_pool_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudBuildRestInterceptor, "pre_get_worker_pool" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudbuild.GetWorkerPoolRequest.pb( cloudbuild.GetWorkerPoolRequest() ) @@ -15653,6 +15778,7 @@ def test_get_worker_pool_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloudbuild.WorkerPool() + post_with_metadata.return_value = cloudbuild.WorkerPool(), metadata client.get_worker_pool( request, @@ -15664,6 +15790,7 @@ def test_get_worker_pool_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_worker_pool_rest_bad_request( @@ -15744,10 +15871,13 @@ def test_delete_worker_pool_rest_interceptors(null_interceptor): ), mock.patch.object( transports.CloudBuildRestInterceptor, "post_delete_worker_pool" ) as post, mock.patch.object( + transports.CloudBuildRestInterceptor, "post_delete_worker_pool_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudBuildRestInterceptor, "pre_delete_worker_pool" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudbuild.DeleteWorkerPoolRequest.pb( cloudbuild.DeleteWorkerPoolRequest() ) @@ -15771,6 +15901,7 @@ def test_delete_worker_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_worker_pool( request, @@ -15782,6 +15913,7 @@ def test_delete_worker_pool_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_worker_pool_rest_bad_request( @@ -15964,10 +16096,13 @@ def test_update_worker_pool_rest_interceptors(null_interceptor): ), mock.patch.object( transports.CloudBuildRestInterceptor, "post_update_worker_pool" ) as post, mock.patch.object( + transports.CloudBuildRestInterceptor, "post_update_worker_pool_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudBuildRestInterceptor, "pre_update_worker_pool" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudbuild.UpdateWorkerPoolRequest.pb( cloudbuild.UpdateWorkerPoolRequest() ) @@ -15991,6 +16126,7 @@ def test_update_worker_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_worker_pool( request, @@ -16002,6 +16138,7 @@ def test_update_worker_pool_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_worker_pools_rest_bad_request( @@ -16086,10 +16223,13 @@ def test_list_worker_pools_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudBuildRestInterceptor, "post_list_worker_pools" ) as post, mock.patch.object( + transports.CloudBuildRestInterceptor, "post_list_worker_pools_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudBuildRestInterceptor, "pre_list_worker_pools" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudbuild.ListWorkerPoolsRequest.pb( cloudbuild.ListWorkerPoolsRequest() ) @@ -16115,6 +16255,7 @@ def test_list_worker_pools_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloudbuild.ListWorkerPoolsResponse() + post_with_metadata.return_value = cloudbuild.ListWorkerPoolsResponse(), metadata client.list_worker_pools( request, @@ -16126,6 +16267,7 @@ def test_list_worker_pools_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-build/tests/unit/gapic/cloudbuild_v2/test_repository_manager.py b/packages/google-cloud-build/tests/unit/gapic/cloudbuild_v2/test_repository_manager.py index fb4f00e50466..f2f0807497c8 100644 --- a/packages/google-cloud-build/tests/unit/gapic/cloudbuild_v2/test_repository_manager.py +++ b/packages/google-cloud-build/tests/unit/gapic/cloudbuild_v2/test_repository_manager.py @@ -77,6 +77,13 @@ ) from google.cloud.devtools.cloudbuild_v2.types import cloudbuild, repositories +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 @@ -344,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 = RepositoryManagerClient(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 = RepositoryManagerClient(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", [ @@ -10312,10 +10362,14 @@ def test_create_connection_rest_interceptors(null_interceptor): ), mock.patch.object( transports.RepositoryManagerRestInterceptor, "post_create_connection" ) as post, mock.patch.object( + transports.RepositoryManagerRestInterceptor, + "post_create_connection_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RepositoryManagerRestInterceptor, "pre_create_connection" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = repositories.CreateConnectionRequest.pb( repositories.CreateConnectionRequest() ) @@ -10339,6 +10393,7 @@ def test_create_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_connection( request, @@ -10350,6 +10405,7 @@ def test_create_connection_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_connection_rest_bad_request( @@ -10440,10 +10496,13 @@ def test_get_connection_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RepositoryManagerRestInterceptor, "post_get_connection" ) as post, mock.patch.object( + transports.RepositoryManagerRestInterceptor, "post_get_connection_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RepositoryManagerRestInterceptor, "pre_get_connection" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = repositories.GetConnectionRequest.pb( repositories.GetConnectionRequest() ) @@ -10467,6 +10526,7 @@ def test_get_connection_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = repositories.Connection() + post_with_metadata.return_value = repositories.Connection(), metadata client.get_connection( request, @@ -10478,6 +10538,7 @@ def test_get_connection_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_connections_rest_bad_request( @@ -10562,10 +10623,14 @@ def test_list_connections_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RepositoryManagerRestInterceptor, "post_list_connections" ) as post, mock.patch.object( + transports.RepositoryManagerRestInterceptor, + "post_list_connections_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RepositoryManagerRestInterceptor, "pre_list_connections" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = repositories.ListConnectionsRequest.pb( repositories.ListConnectionsRequest() ) @@ -10591,6 +10656,10 @@ def test_list_connections_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = repositories.ListConnectionsResponse() + post_with_metadata.return_value = ( + repositories.ListConnectionsResponse(), + metadata, + ) client.list_connections( request, @@ -10602,6 +10671,7 @@ def test_list_connections_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_connection_rest_bad_request( @@ -10813,10 +10883,14 @@ def test_update_connection_rest_interceptors(null_interceptor): ), mock.patch.object( transports.RepositoryManagerRestInterceptor, "post_update_connection" ) as post, mock.patch.object( + transports.RepositoryManagerRestInterceptor, + "post_update_connection_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RepositoryManagerRestInterceptor, "pre_update_connection" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = repositories.UpdateConnectionRequest.pb( repositories.UpdateConnectionRequest() ) @@ -10840,6 +10914,7 @@ def test_update_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.update_connection( request, @@ -10851,6 +10926,7 @@ def test_update_connection_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_connection_rest_bad_request( @@ -10931,10 +11007,14 @@ def test_delete_connection_rest_interceptors(null_interceptor): ), mock.patch.object( transports.RepositoryManagerRestInterceptor, "post_delete_connection" ) as post, mock.patch.object( + transports.RepositoryManagerRestInterceptor, + "post_delete_connection_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RepositoryManagerRestInterceptor, "pre_delete_connection" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = repositories.DeleteConnectionRequest.pb( repositories.DeleteConnectionRequest() ) @@ -10958,6 +11038,7 @@ def test_delete_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_connection( request, @@ -10969,6 +11050,7 @@ def test_delete_connection_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_repository_rest_bad_request( @@ -11125,10 +11207,14 @@ def test_create_repository_rest_interceptors(null_interceptor): ), mock.patch.object( transports.RepositoryManagerRestInterceptor, "post_create_repository" ) as post, mock.patch.object( + transports.RepositoryManagerRestInterceptor, + "post_create_repository_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RepositoryManagerRestInterceptor, "pre_create_repository" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = repositories.CreateRepositoryRequest.pb( repositories.CreateRepositoryRequest() ) @@ -11152,6 +11238,7 @@ def test_create_repository_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_repository( request, @@ -11163,6 +11250,7 @@ def test_create_repository_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_batch_create_repositories_rest_bad_request( @@ -11243,10 +11331,14 @@ def test_batch_create_repositories_rest_interceptors(null_interceptor): ), mock.patch.object( transports.RepositoryManagerRestInterceptor, "post_batch_create_repositories" ) as post, mock.patch.object( + transports.RepositoryManagerRestInterceptor, + "post_batch_create_repositories_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RepositoryManagerRestInterceptor, "pre_batch_create_repositories" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = repositories.BatchCreateRepositoriesRequest.pb( repositories.BatchCreateRepositoriesRequest() ) @@ -11270,6 +11362,7 @@ def test_batch_create_repositories_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.batch_create_repositories( request, @@ -11281,6 +11374,7 @@ def test_batch_create_repositories_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_repository_rest_bad_request( @@ -11375,10 +11469,13 @@ def test_get_repository_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RepositoryManagerRestInterceptor, "post_get_repository" ) as post, mock.patch.object( + transports.RepositoryManagerRestInterceptor, "post_get_repository_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RepositoryManagerRestInterceptor, "pre_get_repository" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = repositories.GetRepositoryRequest.pb( repositories.GetRepositoryRequest() ) @@ -11402,6 +11499,7 @@ def test_get_repository_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = repositories.Repository() + post_with_metadata.return_value = repositories.Repository(), metadata client.get_repository( request, @@ -11413,6 +11511,7 @@ def test_get_repository_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_repositories_rest_bad_request( @@ -11497,10 +11596,14 @@ def test_list_repositories_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RepositoryManagerRestInterceptor, "post_list_repositories" ) as post, mock.patch.object( + transports.RepositoryManagerRestInterceptor, + "post_list_repositories_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RepositoryManagerRestInterceptor, "pre_list_repositories" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = repositories.ListRepositoriesRequest.pb( repositories.ListRepositoriesRequest() ) @@ -11526,6 +11629,10 @@ def test_list_repositories_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = repositories.ListRepositoriesResponse() + post_with_metadata.return_value = ( + repositories.ListRepositoriesResponse(), + metadata, + ) client.list_repositories( request, @@ -11537,6 +11644,7 @@ def test_list_repositories_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_repository_rest_bad_request( @@ -11621,10 +11729,14 @@ def test_delete_repository_rest_interceptors(null_interceptor): ), mock.patch.object( transports.RepositoryManagerRestInterceptor, "post_delete_repository" ) as post, mock.patch.object( + transports.RepositoryManagerRestInterceptor, + "post_delete_repository_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RepositoryManagerRestInterceptor, "pre_delete_repository" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = repositories.DeleteRepositoryRequest.pb( repositories.DeleteRepositoryRequest() ) @@ -11648,6 +11760,7 @@ def test_delete_repository_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_repository( request, @@ -11659,6 +11772,7 @@ def test_delete_repository_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_fetch_read_write_token_rest_bad_request( @@ -11747,10 +11861,14 @@ def test_fetch_read_write_token_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RepositoryManagerRestInterceptor, "post_fetch_read_write_token" ) as post, mock.patch.object( + transports.RepositoryManagerRestInterceptor, + "post_fetch_read_write_token_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RepositoryManagerRestInterceptor, "pre_fetch_read_write_token" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = repositories.FetchReadWriteTokenRequest.pb( repositories.FetchReadWriteTokenRequest() ) @@ -11776,6 +11894,10 @@ def test_fetch_read_write_token_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = repositories.FetchReadWriteTokenResponse() + post_with_metadata.return_value = ( + repositories.FetchReadWriteTokenResponse(), + metadata, + ) client.fetch_read_write_token( request, @@ -11787,6 +11909,7 @@ def test_fetch_read_write_token_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_fetch_read_token_rest_bad_request( @@ -11875,10 +11998,14 @@ def test_fetch_read_token_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RepositoryManagerRestInterceptor, "post_fetch_read_token" ) as post, mock.patch.object( + transports.RepositoryManagerRestInterceptor, + "post_fetch_read_token_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RepositoryManagerRestInterceptor, "pre_fetch_read_token" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = repositories.FetchReadTokenRequest.pb( repositories.FetchReadTokenRequest() ) @@ -11904,6 +12031,10 @@ def test_fetch_read_token_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = repositories.FetchReadTokenResponse() + post_with_metadata.return_value = ( + repositories.FetchReadTokenResponse(), + metadata, + ) client.fetch_read_token( request, @@ -11915,6 +12046,7 @@ def test_fetch_read_token_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_fetch_linkable_repositories_rest_bad_request( @@ -12003,10 +12135,14 @@ def test_fetch_linkable_repositories_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RepositoryManagerRestInterceptor, "post_fetch_linkable_repositories" ) as post, mock.patch.object( + transports.RepositoryManagerRestInterceptor, + "post_fetch_linkable_repositories_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RepositoryManagerRestInterceptor, "pre_fetch_linkable_repositories" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = repositories.FetchLinkableRepositoriesRequest.pb( repositories.FetchLinkableRepositoriesRequest() ) @@ -12032,6 +12168,10 @@ def test_fetch_linkable_repositories_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = repositories.FetchLinkableRepositoriesResponse() + post_with_metadata.return_value = ( + repositories.FetchLinkableRepositoriesResponse(), + metadata, + ) client.fetch_linkable_repositories( request, @@ -12043,6 +12183,7 @@ def test_fetch_linkable_repositories_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_fetch_git_refs_rest_bad_request(request_type=repositories.FetchGitRefsRequest): @@ -12129,10 +12270,13 @@ def test_fetch_git_refs_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RepositoryManagerRestInterceptor, "post_fetch_git_refs" ) as post, mock.patch.object( + transports.RepositoryManagerRestInterceptor, "post_fetch_git_refs_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RepositoryManagerRestInterceptor, "pre_fetch_git_refs" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = repositories.FetchGitRefsRequest.pb( repositories.FetchGitRefsRequest() ) @@ -12158,6 +12302,7 @@ def test_fetch_git_refs_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = repositories.FetchGitRefsResponse() + post_with_metadata.return_value = repositories.FetchGitRefsResponse(), metadata client.fetch_git_refs( request, @@ -12169,6 +12314,7 @@ def test_fetch_git_refs_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( diff --git a/packages/google-cloud-certificate-manager/google/cloud/certificate_manager/gapic_version.py b/packages/google-cloud-certificate-manager/google/cloud/certificate_manager/gapic_version.py index 1c08bcbd1569..558c8aab67c5 100644 --- a/packages/google-cloud-certificate-manager/google/cloud/certificate_manager/gapic_version.py +++ b/packages/google-cloud-certificate-manager/google/cloud/certificate_manager/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-certificate-manager/google/cloud/certificate_manager_v1/gapic_version.py b/packages/google-cloud-certificate-manager/google/cloud/certificate_manager_v1/gapic_version.py index 1c08bcbd1569..558c8aab67c5 100644 --- a/packages/google-cloud-certificate-manager/google/cloud/certificate_manager_v1/gapic_version.py +++ b/packages/google-cloud-certificate-manager/google/cloud/certificate_manager_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-certificate-manager/google/cloud/certificate_manager_v1/services/certificate_manager/client.py b/packages/google-cloud-certificate-manager/google/cloud/certificate_manager_v1/services/certificate_manager/client.py index e894cc32e8f3..61581a9ddcaf 100644 --- a/packages/google-cloud-certificate-manager/google/cloud/certificate_manager_v1/services/certificate_manager/client.py +++ b/packages/google-cloud-certificate-manager/google/cloud/certificate_manager_v1/services/certificate_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 @@ -663,6 +665,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. @@ -4666,16 +4695,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, @@ -4721,16 +4754,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, @@ -4887,16 +4924,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, @@ -4942,16 +4983,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-certificate-manager/google/cloud/certificate_manager_v1/services/certificate_manager/transports/rest.py b/packages/google-cloud-certificate-manager/google/cloud/certificate_manager_v1/services/certificate_manager/transports/rest.py index dd7ddc945d4c..87b4dcc376ea 100644 --- a/packages/google-cloud-certificate-manager/google/cloud/certificate_manager_v1/services/certificate_manager/transports/rest.py +++ b/packages/google-cloud-certificate-manager/google/cloud/certificate_manager_v1/services/certificate_manager/transports/rest.py @@ -334,12 +334,35 @@ def post_create_certificate( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_certificate - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_certificate_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateManager server but before - it is returned to user code. + it is returned to user code. This `post_create_certificate` interceptor runs + before the `post_create_certificate_with_metadata` interceptor. """ return response + def post_create_certificate_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_certificate + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateManager server but before it is returned to user code. + + We recommend only using this `post_create_certificate_with_metadata` + interceptor in new development instead of the `post_create_certificate` interceptor. + When both interceptors are used, this `post_create_certificate_with_metadata` interceptor runs after the + `post_create_certificate` interceptor. The (possibly modified) response returned by + `post_create_certificate` will be passed to + `post_create_certificate_with_metadata`. + """ + return response, metadata + def pre_create_certificate_issuance_config( self, request: gcc_certificate_issuance_config.CreateCertificateIssuanceConfigRequest, @@ -360,12 +383,35 @@ def post_create_certificate_issuance_config( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_certificate_issuance_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_certificate_issuance_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateManager server but before - it is returned to user code. + it is returned to user code. This `post_create_certificate_issuance_config` interceptor runs + before the `post_create_certificate_issuance_config_with_metadata` interceptor. """ return response + def post_create_certificate_issuance_config_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_certificate_issuance_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateManager server but before it is returned to user code. + + We recommend only using this `post_create_certificate_issuance_config_with_metadata` + interceptor in new development instead of the `post_create_certificate_issuance_config` interceptor. + When both interceptors are used, this `post_create_certificate_issuance_config_with_metadata` interceptor runs after the + `post_create_certificate_issuance_config` interceptor. The (possibly modified) response returned by + `post_create_certificate_issuance_config` will be passed to + `post_create_certificate_issuance_config_with_metadata`. + """ + return response, metadata + def pre_create_certificate_map( self, request: certificate_manager.CreateCertificateMapRequest, @@ -386,12 +432,35 @@ def post_create_certificate_map( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_certificate_map - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_certificate_map_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateManager server but before - it is returned to user code. + it is returned to user code. This `post_create_certificate_map` interceptor runs + before the `post_create_certificate_map_with_metadata` interceptor. """ return response + def post_create_certificate_map_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_certificate_map + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateManager server but before it is returned to user code. + + We recommend only using this `post_create_certificate_map_with_metadata` + interceptor in new development instead of the `post_create_certificate_map` interceptor. + When both interceptors are used, this `post_create_certificate_map_with_metadata` interceptor runs after the + `post_create_certificate_map` interceptor. The (possibly modified) response returned by + `post_create_certificate_map` will be passed to + `post_create_certificate_map_with_metadata`. + """ + return response, metadata + def pre_create_certificate_map_entry( self, request: certificate_manager.CreateCertificateMapEntryRequest, @@ -412,12 +481,35 @@ def post_create_certificate_map_entry( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_certificate_map_entry - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_certificate_map_entry_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateManager server but before - it is returned to user code. + it is returned to user code. This `post_create_certificate_map_entry` interceptor runs + before the `post_create_certificate_map_entry_with_metadata` interceptor. """ return response + def post_create_certificate_map_entry_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_certificate_map_entry + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateManager server but before it is returned to user code. + + We recommend only using this `post_create_certificate_map_entry_with_metadata` + interceptor in new development instead of the `post_create_certificate_map_entry` interceptor. + When both interceptors are used, this `post_create_certificate_map_entry_with_metadata` interceptor runs after the + `post_create_certificate_map_entry` interceptor. The (possibly modified) response returned by + `post_create_certificate_map_entry` will be passed to + `post_create_certificate_map_entry_with_metadata`. + """ + return response, metadata + def pre_create_dns_authorization( self, request: certificate_manager.CreateDnsAuthorizationRequest, @@ -438,12 +530,35 @@ def post_create_dns_authorization( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_dns_authorization - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_dns_authorization_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateManager server but before - it is returned to user code. + it is returned to user code. This `post_create_dns_authorization` interceptor runs + before the `post_create_dns_authorization_with_metadata` interceptor. """ return response + def post_create_dns_authorization_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_dns_authorization + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateManager server but before it is returned to user code. + + We recommend only using this `post_create_dns_authorization_with_metadata` + interceptor in new development instead of the `post_create_dns_authorization` interceptor. + When both interceptors are used, this `post_create_dns_authorization_with_metadata` interceptor runs after the + `post_create_dns_authorization` interceptor. The (possibly modified) response returned by + `post_create_dns_authorization` will be passed to + `post_create_dns_authorization_with_metadata`. + """ + return response, metadata + def pre_create_trust_config( self, request: gcc_trust_config.CreateTrustConfigRequest, @@ -464,12 +579,35 @@ def post_create_trust_config( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_trust_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_trust_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateManager server but before - it is returned to user code. + it is returned to user code. This `post_create_trust_config` interceptor runs + before the `post_create_trust_config_with_metadata` interceptor. """ return response + def post_create_trust_config_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_trust_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateManager server but before it is returned to user code. + + We recommend only using this `post_create_trust_config_with_metadata` + interceptor in new development instead of the `post_create_trust_config` interceptor. + When both interceptors are used, this `post_create_trust_config_with_metadata` interceptor runs after the + `post_create_trust_config` interceptor. The (possibly modified) response returned by + `post_create_trust_config` will be passed to + `post_create_trust_config_with_metadata`. + """ + return response, metadata + def pre_delete_certificate( self, request: certificate_manager.DeleteCertificateRequest, @@ -490,12 +628,35 @@ def post_delete_certificate( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_certificate - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_certificate_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateManager server but before - it is returned to user code. + it is returned to user code. This `post_delete_certificate` interceptor runs + before the `post_delete_certificate_with_metadata` interceptor. """ return response + def post_delete_certificate_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_certificate + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateManager server but before it is returned to user code. + + We recommend only using this `post_delete_certificate_with_metadata` + interceptor in new development instead of the `post_delete_certificate` interceptor. + When both interceptors are used, this `post_delete_certificate_with_metadata` interceptor runs after the + `post_delete_certificate` interceptor. The (possibly modified) response returned by + `post_delete_certificate` will be passed to + `post_delete_certificate_with_metadata`. + """ + return response, metadata + def pre_delete_certificate_issuance_config( self, request: certificate_issuance_config.DeleteCertificateIssuanceConfigRequest, @@ -516,12 +677,35 @@ def post_delete_certificate_issuance_config( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_certificate_issuance_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_certificate_issuance_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateManager server but before - it is returned to user code. + it is returned to user code. This `post_delete_certificate_issuance_config` interceptor runs + before the `post_delete_certificate_issuance_config_with_metadata` interceptor. """ return response + def post_delete_certificate_issuance_config_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_certificate_issuance_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateManager server but before it is returned to user code. + + We recommend only using this `post_delete_certificate_issuance_config_with_metadata` + interceptor in new development instead of the `post_delete_certificate_issuance_config` interceptor. + When both interceptors are used, this `post_delete_certificate_issuance_config_with_metadata` interceptor runs after the + `post_delete_certificate_issuance_config` interceptor. The (possibly modified) response returned by + `post_delete_certificate_issuance_config` will be passed to + `post_delete_certificate_issuance_config_with_metadata`. + """ + return response, metadata + def pre_delete_certificate_map( self, request: certificate_manager.DeleteCertificateMapRequest, @@ -542,12 +726,35 @@ def post_delete_certificate_map( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_certificate_map - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_certificate_map_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateManager server but before - it is returned to user code. + it is returned to user code. This `post_delete_certificate_map` interceptor runs + before the `post_delete_certificate_map_with_metadata` interceptor. """ return response + def post_delete_certificate_map_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_certificate_map + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateManager server but before it is returned to user code. + + We recommend only using this `post_delete_certificate_map_with_metadata` + interceptor in new development instead of the `post_delete_certificate_map` interceptor. + When both interceptors are used, this `post_delete_certificate_map_with_metadata` interceptor runs after the + `post_delete_certificate_map` interceptor. The (possibly modified) response returned by + `post_delete_certificate_map` will be passed to + `post_delete_certificate_map_with_metadata`. + """ + return response, metadata + def pre_delete_certificate_map_entry( self, request: certificate_manager.DeleteCertificateMapEntryRequest, @@ -568,12 +775,35 @@ def post_delete_certificate_map_entry( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_certificate_map_entry - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_certificate_map_entry_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateManager server but before - it is returned to user code. + it is returned to user code. This `post_delete_certificate_map_entry` interceptor runs + before the `post_delete_certificate_map_entry_with_metadata` interceptor. """ return response + def post_delete_certificate_map_entry_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_certificate_map_entry + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateManager server but before it is returned to user code. + + We recommend only using this `post_delete_certificate_map_entry_with_metadata` + interceptor in new development instead of the `post_delete_certificate_map_entry` interceptor. + When both interceptors are used, this `post_delete_certificate_map_entry_with_metadata` interceptor runs after the + `post_delete_certificate_map_entry` interceptor. The (possibly modified) response returned by + `post_delete_certificate_map_entry` will be passed to + `post_delete_certificate_map_entry_with_metadata`. + """ + return response, metadata + def pre_delete_dns_authorization( self, request: certificate_manager.DeleteDnsAuthorizationRequest, @@ -594,12 +824,35 @@ def post_delete_dns_authorization( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_dns_authorization - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_dns_authorization_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateManager server but before - it is returned to user code. + it is returned to user code. This `post_delete_dns_authorization` interceptor runs + before the `post_delete_dns_authorization_with_metadata` interceptor. """ return response + def post_delete_dns_authorization_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_dns_authorization + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateManager server but before it is returned to user code. + + We recommend only using this `post_delete_dns_authorization_with_metadata` + interceptor in new development instead of the `post_delete_dns_authorization` interceptor. + When both interceptors are used, this `post_delete_dns_authorization_with_metadata` interceptor runs after the + `post_delete_dns_authorization` interceptor. The (possibly modified) response returned by + `post_delete_dns_authorization` will be passed to + `post_delete_dns_authorization_with_metadata`. + """ + return response, metadata + def pre_delete_trust_config( self, request: trust_config.DeleteTrustConfigRequest, @@ -619,12 +872,35 @@ def post_delete_trust_config( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_trust_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_trust_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateManager server but before - it is returned to user code. + it is returned to user code. This `post_delete_trust_config` interceptor runs + before the `post_delete_trust_config_with_metadata` interceptor. """ return response + def post_delete_trust_config_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_trust_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateManager server but before it is returned to user code. + + We recommend only using this `post_delete_trust_config_with_metadata` + interceptor in new development instead of the `post_delete_trust_config` interceptor. + When both interceptors are used, this `post_delete_trust_config_with_metadata` interceptor runs after the + `post_delete_trust_config` interceptor. The (possibly modified) response returned by + `post_delete_trust_config` will be passed to + `post_delete_trust_config_with_metadata`. + """ + return response, metadata + def pre_get_certificate( self, request: certificate_manager.GetCertificateRequest, @@ -645,12 +921,37 @@ def post_get_certificate( ) -> certificate_manager.Certificate: """Post-rpc interceptor for get_certificate - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_certificate_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateManager server but before - it is returned to user code. + it is returned to user code. This `post_get_certificate` interceptor runs + before the `post_get_certificate_with_metadata` interceptor. """ return response + def post_get_certificate_with_metadata( + self, + response: certificate_manager.Certificate, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + certificate_manager.Certificate, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_certificate + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateManager server but before it is returned to user code. + + We recommend only using this `post_get_certificate_with_metadata` + interceptor in new development instead of the `post_get_certificate` interceptor. + When both interceptors are used, this `post_get_certificate_with_metadata` interceptor runs after the + `post_get_certificate` interceptor. The (possibly modified) response returned by + `post_get_certificate` will be passed to + `post_get_certificate_with_metadata`. + """ + return response, metadata + def pre_get_certificate_issuance_config( self, request: certificate_issuance_config.GetCertificateIssuanceConfigRequest, @@ -671,12 +972,38 @@ def post_get_certificate_issuance_config( ) -> certificate_issuance_config.CertificateIssuanceConfig: """Post-rpc interceptor for get_certificate_issuance_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_certificate_issuance_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateManager server but before - it is returned to user code. + it is returned to user code. This `post_get_certificate_issuance_config` interceptor runs + before the `post_get_certificate_issuance_config_with_metadata` interceptor. """ return response + def post_get_certificate_issuance_config_with_metadata( + self, + response: certificate_issuance_config.CertificateIssuanceConfig, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + certificate_issuance_config.CertificateIssuanceConfig, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for get_certificate_issuance_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateManager server but before it is returned to user code. + + We recommend only using this `post_get_certificate_issuance_config_with_metadata` + interceptor in new development instead of the `post_get_certificate_issuance_config` interceptor. + When both interceptors are used, this `post_get_certificate_issuance_config_with_metadata` interceptor runs after the + `post_get_certificate_issuance_config` interceptor. The (possibly modified) response returned by + `post_get_certificate_issuance_config` will be passed to + `post_get_certificate_issuance_config_with_metadata`. + """ + return response, metadata + def pre_get_certificate_map( self, request: certificate_manager.GetCertificateMapRequest, @@ -697,12 +1024,37 @@ def post_get_certificate_map( ) -> certificate_manager.CertificateMap: """Post-rpc interceptor for get_certificate_map - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_certificate_map_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateManager server but before - it is returned to user code. + it is returned to user code. This `post_get_certificate_map` interceptor runs + before the `post_get_certificate_map_with_metadata` interceptor. """ return response + def post_get_certificate_map_with_metadata( + self, + response: certificate_manager.CertificateMap, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + certificate_manager.CertificateMap, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_certificate_map + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateManager server but before it is returned to user code. + + We recommend only using this `post_get_certificate_map_with_metadata` + interceptor in new development instead of the `post_get_certificate_map` interceptor. + When both interceptors are used, this `post_get_certificate_map_with_metadata` interceptor runs after the + `post_get_certificate_map` interceptor. The (possibly modified) response returned by + `post_get_certificate_map` will be passed to + `post_get_certificate_map_with_metadata`. + """ + return response, metadata + def pre_get_certificate_map_entry( self, request: certificate_manager.GetCertificateMapEntryRequest, @@ -723,12 +1075,37 @@ def post_get_certificate_map_entry( ) -> certificate_manager.CertificateMapEntry: """Post-rpc interceptor for get_certificate_map_entry - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_certificate_map_entry_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateManager server but before - it is returned to user code. + it is returned to user code. This `post_get_certificate_map_entry` interceptor runs + before the `post_get_certificate_map_entry_with_metadata` interceptor. """ return response + def post_get_certificate_map_entry_with_metadata( + self, + response: certificate_manager.CertificateMapEntry, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + certificate_manager.CertificateMapEntry, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_certificate_map_entry + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateManager server but before it is returned to user code. + + We recommend only using this `post_get_certificate_map_entry_with_metadata` + interceptor in new development instead of the `post_get_certificate_map_entry` interceptor. + When both interceptors are used, this `post_get_certificate_map_entry_with_metadata` interceptor runs after the + `post_get_certificate_map_entry` interceptor. The (possibly modified) response returned by + `post_get_certificate_map_entry` will be passed to + `post_get_certificate_map_entry_with_metadata`. + """ + return response, metadata + def pre_get_dns_authorization( self, request: certificate_manager.GetDnsAuthorizationRequest, @@ -749,12 +1126,37 @@ def post_get_dns_authorization( ) -> certificate_manager.DnsAuthorization: """Post-rpc interceptor for get_dns_authorization - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_dns_authorization_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateManager server but before - it is returned to user code. + it is returned to user code. This `post_get_dns_authorization` interceptor runs + before the `post_get_dns_authorization_with_metadata` interceptor. """ return response + def post_get_dns_authorization_with_metadata( + self, + response: certificate_manager.DnsAuthorization, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + certificate_manager.DnsAuthorization, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_dns_authorization + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateManager server but before it is returned to user code. + + We recommend only using this `post_get_dns_authorization_with_metadata` + interceptor in new development instead of the `post_get_dns_authorization` interceptor. + When both interceptors are used, this `post_get_dns_authorization_with_metadata` interceptor runs after the + `post_get_dns_authorization` interceptor. The (possibly modified) response returned by + `post_get_dns_authorization` will be passed to + `post_get_dns_authorization_with_metadata`. + """ + return response, metadata + def pre_get_trust_config( self, request: trust_config.GetTrustConfigRequest, @@ -774,12 +1176,35 @@ def post_get_trust_config( ) -> trust_config.TrustConfig: """Post-rpc interceptor for get_trust_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_trust_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateManager server but before - it is returned to user code. + it is returned to user code. This `post_get_trust_config` interceptor runs + before the `post_get_trust_config_with_metadata` interceptor. """ return response + def post_get_trust_config_with_metadata( + self, + response: trust_config.TrustConfig, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[trust_config.TrustConfig, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_trust_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateManager server but before it is returned to user code. + + We recommend only using this `post_get_trust_config_with_metadata` + interceptor in new development instead of the `post_get_trust_config` interceptor. + When both interceptors are used, this `post_get_trust_config_with_metadata` interceptor runs after the + `post_get_trust_config` interceptor. The (possibly modified) response returned by + `post_get_trust_config` will be passed to + `post_get_trust_config_with_metadata`. + """ + return response, metadata + def pre_list_certificate_issuance_configs( self, request: certificate_issuance_config.ListCertificateIssuanceConfigsRequest, @@ -801,12 +1226,38 @@ def post_list_certificate_issuance_configs( ) -> certificate_issuance_config.ListCertificateIssuanceConfigsResponse: """Post-rpc interceptor for list_certificate_issuance_configs - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_certificate_issuance_configs_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateManager server but before - it is returned to user code. + it is returned to user code. This `post_list_certificate_issuance_configs` interceptor runs + before the `post_list_certificate_issuance_configs_with_metadata` interceptor. """ return response + def post_list_certificate_issuance_configs_with_metadata( + self, + response: certificate_issuance_config.ListCertificateIssuanceConfigsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + certificate_issuance_config.ListCertificateIssuanceConfigsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_certificate_issuance_configs + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateManager server but before it is returned to user code. + + We recommend only using this `post_list_certificate_issuance_configs_with_metadata` + interceptor in new development instead of the `post_list_certificate_issuance_configs` interceptor. + When both interceptors are used, this `post_list_certificate_issuance_configs_with_metadata` interceptor runs after the + `post_list_certificate_issuance_configs` interceptor. The (possibly modified) response returned by + `post_list_certificate_issuance_configs` will be passed to + `post_list_certificate_issuance_configs_with_metadata`. + """ + return response, metadata + def pre_list_certificate_map_entries( self, request: certificate_manager.ListCertificateMapEntriesRequest, @@ -827,12 +1278,38 @@ def post_list_certificate_map_entries( ) -> certificate_manager.ListCertificateMapEntriesResponse: """Post-rpc interceptor for list_certificate_map_entries - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_certificate_map_entries_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateManager server but before - it is returned to user code. + it is returned to user code. This `post_list_certificate_map_entries` interceptor runs + before the `post_list_certificate_map_entries_with_metadata` interceptor. """ return response + def post_list_certificate_map_entries_with_metadata( + self, + response: certificate_manager.ListCertificateMapEntriesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + certificate_manager.ListCertificateMapEntriesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_certificate_map_entries + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateManager server but before it is returned to user code. + + We recommend only using this `post_list_certificate_map_entries_with_metadata` + interceptor in new development instead of the `post_list_certificate_map_entries` interceptor. + When both interceptors are used, this `post_list_certificate_map_entries_with_metadata` interceptor runs after the + `post_list_certificate_map_entries` interceptor. The (possibly modified) response returned by + `post_list_certificate_map_entries` will be passed to + `post_list_certificate_map_entries_with_metadata`. + """ + return response, metadata + def pre_list_certificate_maps( self, request: certificate_manager.ListCertificateMapsRequest, @@ -853,12 +1330,38 @@ def post_list_certificate_maps( ) -> certificate_manager.ListCertificateMapsResponse: """Post-rpc interceptor for list_certificate_maps - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_certificate_maps_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateManager server but before - it is returned to user code. + it is returned to user code. This `post_list_certificate_maps` interceptor runs + before the `post_list_certificate_maps_with_metadata` interceptor. """ return response + def post_list_certificate_maps_with_metadata( + self, + response: certificate_manager.ListCertificateMapsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + certificate_manager.ListCertificateMapsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_certificate_maps + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateManager server but before it is returned to user code. + + We recommend only using this `post_list_certificate_maps_with_metadata` + interceptor in new development instead of the `post_list_certificate_maps` interceptor. + When both interceptors are used, this `post_list_certificate_maps_with_metadata` interceptor runs after the + `post_list_certificate_maps` interceptor. The (possibly modified) response returned by + `post_list_certificate_maps` will be passed to + `post_list_certificate_maps_with_metadata`. + """ + return response, metadata + def pre_list_certificates( self, request: certificate_manager.ListCertificatesRequest, @@ -879,12 +1382,38 @@ def post_list_certificates( ) -> certificate_manager.ListCertificatesResponse: """Post-rpc interceptor for list_certificates - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_certificates_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateManager server but before - it is returned to user code. + it is returned to user code. This `post_list_certificates` interceptor runs + before the `post_list_certificates_with_metadata` interceptor. """ return response + def post_list_certificates_with_metadata( + self, + response: certificate_manager.ListCertificatesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + certificate_manager.ListCertificatesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_certificates + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateManager server but before it is returned to user code. + + We recommend only using this `post_list_certificates_with_metadata` + interceptor in new development instead of the `post_list_certificates` interceptor. + When both interceptors are used, this `post_list_certificates_with_metadata` interceptor runs after the + `post_list_certificates` interceptor. The (possibly modified) response returned by + `post_list_certificates` will be passed to + `post_list_certificates_with_metadata`. + """ + return response, metadata + def pre_list_dns_authorizations( self, request: certificate_manager.ListDnsAuthorizationsRequest, @@ -905,12 +1434,38 @@ def post_list_dns_authorizations( ) -> certificate_manager.ListDnsAuthorizationsResponse: """Post-rpc interceptor for list_dns_authorizations - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_dns_authorizations_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateManager server but before - it is returned to user code. + it is returned to user code. This `post_list_dns_authorizations` interceptor runs + before the `post_list_dns_authorizations_with_metadata` interceptor. """ return response + def post_list_dns_authorizations_with_metadata( + self, + response: certificate_manager.ListDnsAuthorizationsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + certificate_manager.ListDnsAuthorizationsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_dns_authorizations + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateManager server but before it is returned to user code. + + We recommend only using this `post_list_dns_authorizations_with_metadata` + interceptor in new development instead of the `post_list_dns_authorizations` interceptor. + When both interceptors are used, this `post_list_dns_authorizations_with_metadata` interceptor runs after the + `post_list_dns_authorizations` interceptor. The (possibly modified) response returned by + `post_list_dns_authorizations` will be passed to + `post_list_dns_authorizations_with_metadata`. + """ + return response, metadata + def pre_list_trust_configs( self, request: trust_config.ListTrustConfigsRequest, @@ -930,12 +1485,37 @@ def post_list_trust_configs( ) -> trust_config.ListTrustConfigsResponse: """Post-rpc interceptor for list_trust_configs - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_trust_configs_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateManager server but before - it is returned to user code. + it is returned to user code. This `post_list_trust_configs` interceptor runs + before the `post_list_trust_configs_with_metadata` interceptor. """ return response + def post_list_trust_configs_with_metadata( + self, + response: trust_config.ListTrustConfigsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + trust_config.ListTrustConfigsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_trust_configs + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateManager server but before it is returned to user code. + + We recommend only using this `post_list_trust_configs_with_metadata` + interceptor in new development instead of the `post_list_trust_configs` interceptor. + When both interceptors are used, this `post_list_trust_configs_with_metadata` interceptor runs after the + `post_list_trust_configs` interceptor. The (possibly modified) response returned by + `post_list_trust_configs` will be passed to + `post_list_trust_configs_with_metadata`. + """ + return response, metadata + def pre_update_certificate( self, request: certificate_manager.UpdateCertificateRequest, @@ -956,12 +1536,35 @@ def post_update_certificate( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_certificate - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_certificate_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateManager server but before - it is returned to user code. + it is returned to user code. This `post_update_certificate` interceptor runs + before the `post_update_certificate_with_metadata` interceptor. """ return response + def post_update_certificate_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_certificate + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateManager server but before it is returned to user code. + + We recommend only using this `post_update_certificate_with_metadata` + interceptor in new development instead of the `post_update_certificate` interceptor. + When both interceptors are used, this `post_update_certificate_with_metadata` interceptor runs after the + `post_update_certificate` interceptor. The (possibly modified) response returned by + `post_update_certificate` will be passed to + `post_update_certificate_with_metadata`. + """ + return response, metadata + def pre_update_certificate_map( self, request: certificate_manager.UpdateCertificateMapRequest, @@ -982,12 +1585,35 @@ def post_update_certificate_map( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_certificate_map - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_certificate_map_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateManager server but before - it is returned to user code. + it is returned to user code. This `post_update_certificate_map` interceptor runs + before the `post_update_certificate_map_with_metadata` interceptor. """ return response + def post_update_certificate_map_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_certificate_map + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateManager server but before it is returned to user code. + + We recommend only using this `post_update_certificate_map_with_metadata` + interceptor in new development instead of the `post_update_certificate_map` interceptor. + When both interceptors are used, this `post_update_certificate_map_with_metadata` interceptor runs after the + `post_update_certificate_map` interceptor. The (possibly modified) response returned by + `post_update_certificate_map` will be passed to + `post_update_certificate_map_with_metadata`. + """ + return response, metadata + def pre_update_certificate_map_entry( self, request: certificate_manager.UpdateCertificateMapEntryRequest, @@ -1008,12 +1634,35 @@ def post_update_certificate_map_entry( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_certificate_map_entry - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_certificate_map_entry_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateManager server but before - it is returned to user code. + it is returned to user code. This `post_update_certificate_map_entry` interceptor runs + before the `post_update_certificate_map_entry_with_metadata` interceptor. """ return response + def post_update_certificate_map_entry_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_certificate_map_entry + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateManager server but before it is returned to user code. + + We recommend only using this `post_update_certificate_map_entry_with_metadata` + interceptor in new development instead of the `post_update_certificate_map_entry` interceptor. + When both interceptors are used, this `post_update_certificate_map_entry_with_metadata` interceptor runs after the + `post_update_certificate_map_entry` interceptor. The (possibly modified) response returned by + `post_update_certificate_map_entry` will be passed to + `post_update_certificate_map_entry_with_metadata`. + """ + return response, metadata + def pre_update_dns_authorization( self, request: certificate_manager.UpdateDnsAuthorizationRequest, @@ -1034,12 +1683,35 @@ def post_update_dns_authorization( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_dns_authorization - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_dns_authorization_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateManager server but before - it is returned to user code. + it is returned to user code. This `post_update_dns_authorization` interceptor runs + before the `post_update_dns_authorization_with_metadata` interceptor. """ return response + def post_update_dns_authorization_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_dns_authorization + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateManager server but before it is returned to user code. + + We recommend only using this `post_update_dns_authorization_with_metadata` + interceptor in new development instead of the `post_update_dns_authorization` interceptor. + When both interceptors are used, this `post_update_dns_authorization_with_metadata` interceptor runs after the + `post_update_dns_authorization` interceptor. The (possibly modified) response returned by + `post_update_dns_authorization` will be passed to + `post_update_dns_authorization_with_metadata`. + """ + return response, metadata + def pre_update_trust_config( self, request: gcc_trust_config.UpdateTrustConfigRequest, @@ -1060,12 +1732,35 @@ def post_update_trust_config( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_trust_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_trust_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CertificateManager server but before - it is returned to user code. + it is returned to user code. This `post_update_trust_config` interceptor runs + before the `post_update_trust_config_with_metadata` interceptor. """ return response + def post_update_trust_config_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_trust_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CertificateManager server but before it is returned to user code. + + We recommend only using this `post_update_trust_config_with_metadata` + interceptor in new development instead of the `post_update_trust_config` interceptor. + When both interceptors are used, this `post_update_trust_config_with_metadata` interceptor runs after the + `post_update_trust_config` interceptor. The (possibly modified) response returned by + `post_update_trust_config` will be passed to + `post_update_trust_config_with_metadata`. + """ + return response, metadata + def pre_get_location( self, request: locations_pb2.GetLocationRequest, @@ -1507,6 +2202,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_certificate(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_certificate_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1664,6 +2363,13 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_certificate_issuance_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_create_certificate_issuance_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1816,6 +2522,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_certificate_map(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_certificate_map_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1967,6 +2677,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_certificate_map_entry(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_certificate_map_entry_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2119,6 +2833,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_dns_authorization(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_dns_authorization_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2269,6 +2987,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_trust_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_trust_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2413,6 +3135,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_certificate(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_certificate_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2564,6 +3290,13 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_certificate_issuance_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_delete_certificate_issuance_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2710,6 +3443,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_certificate_map(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_certificate_map_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2855,6 +3592,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_certificate_map_entry(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_certificate_map_entry_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3001,6 +3742,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_dns_authorization(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_dns_authorization_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3145,6 +3890,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_trust_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_trust_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3286,6 +4035,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_certificate(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_certificate_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3432,6 +4185,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_certificate_issuance_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_get_certificate_issuance_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3581,6 +4341,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_certificate_map(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_certificate_map_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3728,6 +4492,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_certificate_map_entry(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_certificate_map_entry_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3878,6 +4646,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_dns_authorization(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_dns_authorization_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4023,6 +4795,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_trust_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_trust_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4176,6 +4952,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_certificate_issuance_configs(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_list_certificate_issuance_configs_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4322,6 +5105,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_certificate_map_entries(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_certificate_map_entries_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4471,6 +5258,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_certificate_maps(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_certificate_maps_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4618,6 +5409,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_certificates(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_certificates_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4765,6 +5560,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_dns_authorizations(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_dns_authorizations_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4912,6 +5711,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_trust_configs(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_trust_configs_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5064,6 +5867,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_certificate(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_certificate_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5216,6 +6023,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_certificate_map(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_certificate_map_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5367,6 +6178,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_certificate_map_entry(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_certificate_map_entry_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5519,6 +6334,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_dns_authorization(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_dns_authorization_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5669,6 +6488,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_trust_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_trust_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-certificate-manager/samples/generated_samples/snippet_metadata_google.cloud.certificatemanager.v1.json b/packages/google-cloud-certificate-manager/samples/generated_samples/snippet_metadata_google.cloud.certificatemanager.v1.json index 2b92fd19d3ea..294c1f4aa1e6 100644 --- a/packages/google-cloud-certificate-manager/samples/generated_samples/snippet_metadata_google.cloud.certificatemanager.v1.json +++ b/packages/google-cloud-certificate-manager/samples/generated_samples/snippet_metadata_google.cloud.certificatemanager.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-certificate-manager", - "version": "1.9.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-certificate-manager/tests/unit/gapic/certificate_manager_v1/test_certificate_manager.py b/packages/google-cloud-certificate-manager/tests/unit/gapic/certificate_manager_v1/test_certificate_manager.py index 15cfd1ac8f70..a2c229b0619c 100644 --- a/packages/google-cloud-certificate-manager/tests/unit/gapic/certificate_manager_v1/test_certificate_manager.py +++ b/packages/google-cloud-certificate-manager/tests/unit/gapic/certificate_manager_v1/test_certificate_manager.py @@ -81,6 +81,13 @@ from google.cloud.certificate_manager_v1.types import certificate_manager from google.cloud.certificate_manager_v1.types import trust_config +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 @@ -352,6 +359,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 = CertificateManagerClient(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 = CertificateManagerClient(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", [ @@ -20478,10 +20528,14 @@ def test_list_certificates_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CertificateManagerRestInterceptor, "post_list_certificates" ) as post, mock.patch.object( + transports.CertificateManagerRestInterceptor, + "post_list_certificates_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateManagerRestInterceptor, "pre_list_certificates" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = certificate_manager.ListCertificatesRequest.pb( certificate_manager.ListCertificatesRequest() ) @@ -20507,6 +20561,10 @@ def test_list_certificates_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = certificate_manager.ListCertificatesResponse() + post_with_metadata.return_value = ( + certificate_manager.ListCertificatesResponse(), + metadata, + ) client.list_certificates( request, @@ -20518,6 +20576,7 @@ def test_list_certificates_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_certificate_rest_bad_request( @@ -20610,10 +20669,14 @@ def test_get_certificate_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CertificateManagerRestInterceptor, "post_get_certificate" ) as post, mock.patch.object( + transports.CertificateManagerRestInterceptor, + "post_get_certificate_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateManagerRestInterceptor, "pre_get_certificate" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = certificate_manager.GetCertificateRequest.pb( certificate_manager.GetCertificateRequest() ) @@ -20639,6 +20702,7 @@ def test_get_certificate_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = certificate_manager.Certificate() + post_with_metadata.return_value = certificate_manager.Certificate(), metadata client.get_certificate( request, @@ -20650,6 +20714,7 @@ def test_get_certificate_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_certificate_rest_bad_request( @@ -20830,10 +20895,14 @@ def test_create_certificate_rest_interceptors(null_interceptor): ), mock.patch.object( transports.CertificateManagerRestInterceptor, "post_create_certificate" ) as post, mock.patch.object( + transports.CertificateManagerRestInterceptor, + "post_create_certificate_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateManagerRestInterceptor, "pre_create_certificate" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = certificate_manager.CreateCertificateRequest.pb( certificate_manager.CreateCertificateRequest() ) @@ -20857,6 +20926,7 @@ def test_create_certificate_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_certificate( request, @@ -20868,6 +20938,7 @@ def test_create_certificate_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_certificate_rest_bad_request( @@ -21056,10 +21127,14 @@ def test_update_certificate_rest_interceptors(null_interceptor): ), mock.patch.object( transports.CertificateManagerRestInterceptor, "post_update_certificate" ) as post, mock.patch.object( + transports.CertificateManagerRestInterceptor, + "post_update_certificate_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateManagerRestInterceptor, "pre_update_certificate" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = certificate_manager.UpdateCertificateRequest.pb( certificate_manager.UpdateCertificateRequest() ) @@ -21083,6 +21158,7 @@ def test_update_certificate_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_certificate( request, @@ -21094,6 +21170,7 @@ def test_update_certificate_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_certificate_rest_bad_request( @@ -21174,10 +21251,14 @@ def test_delete_certificate_rest_interceptors(null_interceptor): ), mock.patch.object( transports.CertificateManagerRestInterceptor, "post_delete_certificate" ) as post, mock.patch.object( + transports.CertificateManagerRestInterceptor, + "post_delete_certificate_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateManagerRestInterceptor, "pre_delete_certificate" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = certificate_manager.DeleteCertificateRequest.pb( certificate_manager.DeleteCertificateRequest() ) @@ -21201,6 +21282,7 @@ def test_delete_certificate_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_certificate( request, @@ -21212,6 +21294,7 @@ def test_delete_certificate_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_certificate_maps_rest_bad_request( @@ -21298,10 +21381,14 @@ def test_list_certificate_maps_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CertificateManagerRestInterceptor, "post_list_certificate_maps" ) as post, mock.patch.object( + transports.CertificateManagerRestInterceptor, + "post_list_certificate_maps_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateManagerRestInterceptor, "pre_list_certificate_maps" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = certificate_manager.ListCertificateMapsRequest.pb( certificate_manager.ListCertificateMapsRequest() ) @@ -21327,6 +21414,10 @@ def test_list_certificate_maps_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = certificate_manager.ListCertificateMapsResponse() + post_with_metadata.return_value = ( + certificate_manager.ListCertificateMapsResponse(), + metadata, + ) client.list_certificate_maps( request, @@ -21338,6 +21429,7 @@ def test_list_certificate_maps_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_certificate_map_rest_bad_request( @@ -21428,10 +21520,14 @@ def test_get_certificate_map_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CertificateManagerRestInterceptor, "post_get_certificate_map" ) as post, mock.patch.object( + transports.CertificateManagerRestInterceptor, + "post_get_certificate_map_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateManagerRestInterceptor, "pre_get_certificate_map" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = certificate_manager.GetCertificateMapRequest.pb( certificate_manager.GetCertificateMapRequest() ) @@ -21457,6 +21553,7 @@ def test_get_certificate_map_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = certificate_manager.CertificateMap() + post_with_metadata.return_value = certificate_manager.CertificateMap(), metadata client.get_certificate_map( request, @@ -21468,6 +21565,7 @@ def test_get_certificate_map_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_certificate_map_rest_bad_request( @@ -21631,10 +21729,14 @@ def test_create_certificate_map_rest_interceptors(null_interceptor): ), mock.patch.object( transports.CertificateManagerRestInterceptor, "post_create_certificate_map" ) as post, mock.patch.object( + transports.CertificateManagerRestInterceptor, + "post_create_certificate_map_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateManagerRestInterceptor, "pre_create_certificate_map" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = certificate_manager.CreateCertificateMapRequest.pb( certificate_manager.CreateCertificateMapRequest() ) @@ -21658,6 +21760,7 @@ def test_create_certificate_map_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_certificate_map( request, @@ -21669,6 +21772,7 @@ def test_create_certificate_map_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_certificate_map_rest_bad_request( @@ -21840,10 +21944,14 @@ def test_update_certificate_map_rest_interceptors(null_interceptor): ), mock.patch.object( transports.CertificateManagerRestInterceptor, "post_update_certificate_map" ) as post, mock.patch.object( + transports.CertificateManagerRestInterceptor, + "post_update_certificate_map_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateManagerRestInterceptor, "pre_update_certificate_map" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = certificate_manager.UpdateCertificateMapRequest.pb( certificate_manager.UpdateCertificateMapRequest() ) @@ -21867,6 +21975,7 @@ def test_update_certificate_map_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_certificate_map( request, @@ -21878,6 +21987,7 @@ def test_update_certificate_map_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_certificate_map_rest_bad_request( @@ -21962,10 +22072,14 @@ def test_delete_certificate_map_rest_interceptors(null_interceptor): ), mock.patch.object( transports.CertificateManagerRestInterceptor, "post_delete_certificate_map" ) as post, mock.patch.object( + transports.CertificateManagerRestInterceptor, + "post_delete_certificate_map_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateManagerRestInterceptor, "pre_delete_certificate_map" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = certificate_manager.DeleteCertificateMapRequest.pb( certificate_manager.DeleteCertificateMapRequest() ) @@ -21989,6 +22103,7 @@ def test_delete_certificate_map_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_certificate_map( request, @@ -22000,6 +22115,7 @@ def test_delete_certificate_map_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_certificate_map_entries_rest_bad_request( @@ -22093,10 +22209,14 @@ def test_list_certificate_map_entries_rest_interceptors(null_interceptor): transports.CertificateManagerRestInterceptor, "post_list_certificate_map_entries", ) as post, mock.patch.object( + transports.CertificateManagerRestInterceptor, + "post_list_certificate_map_entries_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateManagerRestInterceptor, "pre_list_certificate_map_entries" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = certificate_manager.ListCertificateMapEntriesRequest.pb( certificate_manager.ListCertificateMapEntriesRequest() ) @@ -22122,6 +22242,10 @@ def test_list_certificate_map_entries_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = certificate_manager.ListCertificateMapEntriesResponse() + post_with_metadata.return_value = ( + certificate_manager.ListCertificateMapEntriesResponse(), + metadata, + ) client.list_certificate_map_entries( request, @@ -22133,6 +22257,7 @@ def test_list_certificate_map_entries_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_certificate_map_entry_rest_bad_request( @@ -22228,10 +22353,14 @@ def test_get_certificate_map_entry_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CertificateManagerRestInterceptor, "post_get_certificate_map_entry" ) as post, mock.patch.object( + transports.CertificateManagerRestInterceptor, + "post_get_certificate_map_entry_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateManagerRestInterceptor, "pre_get_certificate_map_entry" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = certificate_manager.GetCertificateMapEntryRequest.pb( certificate_manager.GetCertificateMapEntryRequest() ) @@ -22257,6 +22386,10 @@ def test_get_certificate_map_entry_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = certificate_manager.CertificateMapEntry() + post_with_metadata.return_value = ( + certificate_manager.CertificateMapEntry(), + metadata, + ) client.get_certificate_map_entry( request, @@ -22268,6 +22401,7 @@ def test_get_certificate_map_entry_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_certificate_map_entry_rest_bad_request( @@ -22435,10 +22569,14 @@ def test_create_certificate_map_entry_rest_interceptors(null_interceptor): transports.CertificateManagerRestInterceptor, "post_create_certificate_map_entry", ) as post, mock.patch.object( + transports.CertificateManagerRestInterceptor, + "post_create_certificate_map_entry_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateManagerRestInterceptor, "pre_create_certificate_map_entry" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = certificate_manager.CreateCertificateMapEntryRequest.pb( certificate_manager.CreateCertificateMapEntryRequest() ) @@ -22462,6 +22600,7 @@ def test_create_certificate_map_entry_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_certificate_map_entry( request, @@ -22473,6 +22612,7 @@ def test_create_certificate_map_entry_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_certificate_map_entry_rest_bad_request( @@ -22644,10 +22784,14 @@ def test_update_certificate_map_entry_rest_interceptors(null_interceptor): transports.CertificateManagerRestInterceptor, "post_update_certificate_map_entry", ) as post, mock.patch.object( + transports.CertificateManagerRestInterceptor, + "post_update_certificate_map_entry_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateManagerRestInterceptor, "pre_update_certificate_map_entry" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = certificate_manager.UpdateCertificateMapEntryRequest.pb( certificate_manager.UpdateCertificateMapEntryRequest() ) @@ -22671,6 +22815,7 @@ def test_update_certificate_map_entry_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_certificate_map_entry( request, @@ -22682,6 +22827,7 @@ def test_update_certificate_map_entry_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_certificate_map_entry_rest_bad_request( @@ -22767,10 +22913,14 @@ def test_delete_certificate_map_entry_rest_interceptors(null_interceptor): transports.CertificateManagerRestInterceptor, "post_delete_certificate_map_entry", ) as post, mock.patch.object( + transports.CertificateManagerRestInterceptor, + "post_delete_certificate_map_entry_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateManagerRestInterceptor, "pre_delete_certificate_map_entry" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = certificate_manager.DeleteCertificateMapEntryRequest.pb( certificate_manager.DeleteCertificateMapEntryRequest() ) @@ -22794,6 +22944,7 @@ def test_delete_certificate_map_entry_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_certificate_map_entry( request, @@ -22805,6 +22956,7 @@ def test_delete_certificate_map_entry_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_dns_authorizations_rest_bad_request( @@ -22893,10 +23045,14 @@ def test_list_dns_authorizations_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CertificateManagerRestInterceptor, "post_list_dns_authorizations" ) as post, mock.patch.object( + transports.CertificateManagerRestInterceptor, + "post_list_dns_authorizations_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateManagerRestInterceptor, "pre_list_dns_authorizations" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = certificate_manager.ListDnsAuthorizationsRequest.pb( certificate_manager.ListDnsAuthorizationsRequest() ) @@ -22922,6 +23078,10 @@ def test_list_dns_authorizations_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = certificate_manager.ListDnsAuthorizationsResponse() + post_with_metadata.return_value = ( + certificate_manager.ListDnsAuthorizationsResponse(), + metadata, + ) client.list_dns_authorizations( request, @@ -22933,6 +23093,7 @@ def test_list_dns_authorizations_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_dns_authorization_rest_bad_request( @@ -23027,10 +23188,14 @@ def test_get_dns_authorization_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CertificateManagerRestInterceptor, "post_get_dns_authorization" ) as post, mock.patch.object( + transports.CertificateManagerRestInterceptor, + "post_get_dns_authorization_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateManagerRestInterceptor, "pre_get_dns_authorization" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = certificate_manager.GetDnsAuthorizationRequest.pb( certificate_manager.GetDnsAuthorizationRequest() ) @@ -23056,6 +23221,10 @@ def test_get_dns_authorization_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = certificate_manager.DnsAuthorization() + post_with_metadata.return_value = ( + certificate_manager.DnsAuthorization(), + metadata, + ) client.get_dns_authorization( request, @@ -23067,6 +23236,7 @@ def test_get_dns_authorization_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_dns_authorization_rest_bad_request( @@ -23230,10 +23400,14 @@ def test_create_dns_authorization_rest_interceptors(null_interceptor): ), mock.patch.object( transports.CertificateManagerRestInterceptor, "post_create_dns_authorization" ) as post, mock.patch.object( + transports.CertificateManagerRestInterceptor, + "post_create_dns_authorization_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateManagerRestInterceptor, "pre_create_dns_authorization" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = certificate_manager.CreateDnsAuthorizationRequest.pb( certificate_manager.CreateDnsAuthorizationRequest() ) @@ -23257,6 +23431,7 @@ def test_create_dns_authorization_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_dns_authorization( request, @@ -23268,6 +23443,7 @@ def test_create_dns_authorization_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_dns_authorization_rest_bad_request( @@ -23439,10 +23615,14 @@ def test_update_dns_authorization_rest_interceptors(null_interceptor): ), mock.patch.object( transports.CertificateManagerRestInterceptor, "post_update_dns_authorization" ) as post, mock.patch.object( + transports.CertificateManagerRestInterceptor, + "post_update_dns_authorization_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateManagerRestInterceptor, "pre_update_dns_authorization" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = certificate_manager.UpdateDnsAuthorizationRequest.pb( certificate_manager.UpdateDnsAuthorizationRequest() ) @@ -23466,6 +23646,7 @@ def test_update_dns_authorization_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_dns_authorization( request, @@ -23477,6 +23658,7 @@ def test_update_dns_authorization_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_dns_authorization_rest_bad_request( @@ -23561,10 +23743,14 @@ def test_delete_dns_authorization_rest_interceptors(null_interceptor): ), mock.patch.object( transports.CertificateManagerRestInterceptor, "post_delete_dns_authorization" ) as post, mock.patch.object( + transports.CertificateManagerRestInterceptor, + "post_delete_dns_authorization_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateManagerRestInterceptor, "pre_delete_dns_authorization" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = certificate_manager.DeleteDnsAuthorizationRequest.pb( certificate_manager.DeleteDnsAuthorizationRequest() ) @@ -23588,6 +23774,7 @@ def test_delete_dns_authorization_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_dns_authorization( request, @@ -23599,6 +23786,7 @@ def test_delete_dns_authorization_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_certificate_issuance_configs_rest_bad_request( @@ -23692,11 +23880,15 @@ def test_list_certificate_issuance_configs_rest_interceptors(null_interceptor): transports.CertificateManagerRestInterceptor, "post_list_certificate_issuance_configs", ) as post, mock.patch.object( + transports.CertificateManagerRestInterceptor, + "post_list_certificate_issuance_configs_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateManagerRestInterceptor, "pre_list_certificate_issuance_configs", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = ( certificate_issuance_config.ListCertificateIssuanceConfigsRequest.pb( certificate_issuance_config.ListCertificateIssuanceConfigsRequest() @@ -23728,6 +23920,10 @@ def test_list_certificate_issuance_configs_rest_interceptors(null_interceptor): post.return_value = ( certificate_issuance_config.ListCertificateIssuanceConfigsResponse() ) + post_with_metadata.return_value = ( + certificate_issuance_config.ListCertificateIssuanceConfigsResponse(), + metadata, + ) client.list_certificate_issuance_configs( request, @@ -23739,6 +23935,7 @@ def test_list_certificate_issuance_configs_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_certificate_issuance_config_rest_bad_request( @@ -23839,11 +24036,15 @@ def test_get_certificate_issuance_config_rest_interceptors(null_interceptor): transports.CertificateManagerRestInterceptor, "post_get_certificate_issuance_config", ) as post, mock.patch.object( + transports.CertificateManagerRestInterceptor, + "post_get_certificate_issuance_config_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateManagerRestInterceptor, "pre_get_certificate_issuance_config", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = certificate_issuance_config.GetCertificateIssuanceConfigRequest.pb( certificate_issuance_config.GetCertificateIssuanceConfigRequest() ) @@ -23869,6 +24070,10 @@ def test_get_certificate_issuance_config_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = certificate_issuance_config.CertificateIssuanceConfig() + post_with_metadata.return_value = ( + certificate_issuance_config.CertificateIssuanceConfig(), + metadata, + ) client.get_certificate_issuance_config( request, @@ -23880,6 +24085,7 @@ def test_get_certificate_issuance_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_certificate_issuance_config_rest_bad_request( @@ -24047,11 +24253,15 @@ def test_create_certificate_issuance_config_rest_interceptors(null_interceptor): transports.CertificateManagerRestInterceptor, "post_create_certificate_issuance_config", ) as post, mock.patch.object( + transports.CertificateManagerRestInterceptor, + "post_create_certificate_issuance_config_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateManagerRestInterceptor, "pre_create_certificate_issuance_config", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = ( gcc_certificate_issuance_config.CreateCertificateIssuanceConfigRequest.pb( gcc_certificate_issuance_config.CreateCertificateIssuanceConfigRequest() @@ -24079,6 +24289,7 @@ def test_create_certificate_issuance_config_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_certificate_issuance_config( request, @@ -24090,6 +24301,7 @@ def test_create_certificate_issuance_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_certificate_issuance_config_rest_bad_request( @@ -24175,11 +24387,15 @@ def test_delete_certificate_issuance_config_rest_interceptors(null_interceptor): transports.CertificateManagerRestInterceptor, "post_delete_certificate_issuance_config", ) as post, mock.patch.object( + transports.CertificateManagerRestInterceptor, + "post_delete_certificate_issuance_config_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateManagerRestInterceptor, "pre_delete_certificate_issuance_config", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = ( certificate_issuance_config.DeleteCertificateIssuanceConfigRequest.pb( certificate_issuance_config.DeleteCertificateIssuanceConfigRequest() @@ -24205,6 +24421,7 @@ def test_delete_certificate_issuance_config_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_certificate_issuance_config( request, @@ -24216,6 +24433,7 @@ def test_delete_certificate_issuance_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_trust_configs_rest_bad_request( @@ -24302,10 +24520,14 @@ def test_list_trust_configs_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CertificateManagerRestInterceptor, "post_list_trust_configs" ) as post, mock.patch.object( + transports.CertificateManagerRestInterceptor, + "post_list_trust_configs_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateManagerRestInterceptor, "pre_list_trust_configs" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = trust_config.ListTrustConfigsRequest.pb( trust_config.ListTrustConfigsRequest() ) @@ -24331,6 +24553,10 @@ def test_list_trust_configs_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = trust_config.ListTrustConfigsResponse() + post_with_metadata.return_value = ( + trust_config.ListTrustConfigsResponse(), + metadata, + ) client.list_trust_configs( request, @@ -24342,6 +24568,7 @@ def test_list_trust_configs_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_trust_config_rest_bad_request( @@ -24430,10 +24657,14 @@ def test_get_trust_config_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CertificateManagerRestInterceptor, "post_get_trust_config" ) as post, mock.patch.object( + transports.CertificateManagerRestInterceptor, + "post_get_trust_config_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateManagerRestInterceptor, "pre_get_trust_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = trust_config.GetTrustConfigRequest.pb( trust_config.GetTrustConfigRequest() ) @@ -24457,6 +24688,7 @@ def test_get_trust_config_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = trust_config.TrustConfig() + post_with_metadata.return_value = trust_config.TrustConfig(), metadata client.get_trust_config( request, @@ -24468,6 +24700,7 @@ def test_get_trust_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_trust_config_rest_bad_request( @@ -24629,10 +24862,14 @@ def test_create_trust_config_rest_interceptors(null_interceptor): ), mock.patch.object( transports.CertificateManagerRestInterceptor, "post_create_trust_config" ) as post, mock.patch.object( + transports.CertificateManagerRestInterceptor, + "post_create_trust_config_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateManagerRestInterceptor, "pre_create_trust_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = gcc_trust_config.CreateTrustConfigRequest.pb( gcc_trust_config.CreateTrustConfigRequest() ) @@ -24656,6 +24893,7 @@ def test_create_trust_config_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_trust_config( request, @@ -24667,6 +24905,7 @@ def test_create_trust_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_trust_config_rest_bad_request( @@ -24836,10 +25075,14 @@ def test_update_trust_config_rest_interceptors(null_interceptor): ), mock.patch.object( transports.CertificateManagerRestInterceptor, "post_update_trust_config" ) as post, mock.patch.object( + transports.CertificateManagerRestInterceptor, + "post_update_trust_config_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateManagerRestInterceptor, "pre_update_trust_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = gcc_trust_config.UpdateTrustConfigRequest.pb( gcc_trust_config.UpdateTrustConfigRequest() ) @@ -24863,6 +25106,7 @@ def test_update_trust_config_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_trust_config( request, @@ -24874,6 +25118,7 @@ def test_update_trust_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_trust_config_rest_bad_request( @@ -24954,10 +25199,14 @@ def test_delete_trust_config_rest_interceptors(null_interceptor): ), mock.patch.object( transports.CertificateManagerRestInterceptor, "post_delete_trust_config" ) as post, mock.patch.object( + transports.CertificateManagerRestInterceptor, + "post_delete_trust_config_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CertificateManagerRestInterceptor, "pre_delete_trust_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = trust_config.DeleteTrustConfigRequest.pb( trust_config.DeleteTrustConfigRequest() ) @@ -24981,6 +25230,7 @@ def test_delete_trust_config_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_trust_config( request, @@ -24992,6 +25242,7 @@ def test_delete_trust_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-channel/google/cloud/channel/gapic_version.py b/packages/google-cloud-channel/google/cloud/channel/gapic_version.py index 785067d93b3c..558c8aab67c5 100644 --- a/packages/google-cloud-channel/google/cloud/channel/gapic_version.py +++ b/packages/google-cloud-channel/google/cloud/channel/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.21.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-channel/google/cloud/channel_v1/gapic_version.py b/packages/google-cloud-channel/google/cloud/channel_v1/gapic_version.py index 785067d93b3c..558c8aab67c5 100644 --- a/packages/google-cloud-channel/google/cloud/channel_v1/gapic_version.py +++ b/packages/google-cloud-channel/google/cloud/channel_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.21.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-channel/google/cloud/channel_v1/services/cloud_channel_reports_service/client.py b/packages/google-cloud-channel/google/cloud/channel_v1/services/cloud_channel_reports_service/client.py index b55c36bc45a8..a98ed7ad601f 100644 --- a/packages/google-cloud-channel/google/cloud/channel_v1/services/cloud_channel_reports_service/client.py +++ b/packages/google-cloud-channel/google/cloud/channel_v1/services/cloud_channel_reports_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 @@ -511,6 +513,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. @@ -1173,16 +1202,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, @@ -1228,16 +1261,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-channel/google/cloud/channel_v1/services/cloud_channel_service/client.py b/packages/google-cloud-channel/google/cloud/channel_v1/services/cloud_channel_service/client.py index 730a4113e20d..7870f33f4f0a 100644 --- a/packages/google-cloud-channel/google/cloud/channel_v1/services/cloud_channel_service/client.py +++ b/packages/google-cloud-channel/google/cloud/channel_v1/services/cloud_channel_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 @@ -692,6 +694,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. @@ -6984,16 +7013,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, @@ -7039,16 +7072,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-channel/samples/generated_samples/snippet_metadata_google.cloud.channel.v1.json b/packages/google-cloud-channel/samples/generated_samples/snippet_metadata_google.cloud.channel.v1.json index ee5ff40f5ba0..2158f62acc0a 100644 --- a/packages/google-cloud-channel/samples/generated_samples/snippet_metadata_google.cloud.channel.v1.json +++ b/packages/google-cloud-channel/samples/generated_samples/snippet_metadata_google.cloud.channel.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-channel", - "version": "1.21.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-channel/tests/unit/gapic/channel_v1/test_cloud_channel_reports_service.py b/packages/google-cloud-channel/tests/unit/gapic/channel_v1/test_cloud_channel_reports_service.py index e9c6f7cf56a8..b3a5a8719180 100644 --- a/packages/google-cloud-channel/tests/unit/gapic/channel_v1/test_cloud_channel_reports_service.py +++ b/packages/google-cloud-channel/tests/unit/gapic/channel_v1/test_cloud_channel_reports_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.channel_v1.types import operations, reports_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 @@ -347,6 +355,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 = CloudChannelReportsServiceClient(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 = CloudChannelReportsServiceClient(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-channel/tests/unit/gapic/channel_v1/test_cloud_channel_service.py b/packages/google-cloud-channel/tests/unit/gapic/channel_v1/test_cloud_channel_service.py index 765870dc1078..9aebf2206afe 100644 --- a/packages/google-cloud-channel/tests/unit/gapic/channel_v1/test_cloud_channel_service.py +++ b/packages/google-cloud-channel/tests/unit/gapic/channel_v1/test_cloud_channel_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 @@ -83,6 +84,13 @@ 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 @@ -356,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 = CloudChannelServiceClient(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 = CloudChannelServiceClient(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-cloudcontrolspartner/google/cloud/cloudcontrolspartner/gapic_version.py b/packages/google-cloud-cloudcontrolspartner/google/cloud/cloudcontrolspartner/gapic_version.py index 668eac0d72ce..558c8aab67c5 100644 --- a/packages/google-cloud-cloudcontrolspartner/google/cloud/cloudcontrolspartner/gapic_version.py +++ b/packages/google-cloud-cloudcontrolspartner/google/cloud/cloudcontrolspartner/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.2.4" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-cloudcontrolspartner/google/cloud/cloudcontrolspartner_v1/gapic_version.py b/packages/google-cloud-cloudcontrolspartner/google/cloud/cloudcontrolspartner_v1/gapic_version.py index 668eac0d72ce..558c8aab67c5 100644 --- a/packages/google-cloud-cloudcontrolspartner/google/cloud/cloudcontrolspartner_v1/gapic_version.py +++ b/packages/google-cloud-cloudcontrolspartner/google/cloud/cloudcontrolspartner_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.4" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-cloudcontrolspartner/google/cloud/cloudcontrolspartner_v1/services/cloud_controls_partner_core/client.py b/packages/google-cloud-cloudcontrolspartner/google/cloud/cloudcontrolspartner_v1/services/cloud_controls_partner_core/client.py index 7af28d16e14b..f5c85d72c116 100644 --- a/packages/google-cloud-cloudcontrolspartner/google/cloud/cloudcontrolspartner_v1/services/cloud_controls_partner_core/client.py +++ b/packages/google-cloud-cloudcontrolspartner/google/cloud/cloudcontrolspartner_v1/services/cloud_controls_partner_core/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 @@ -615,6 +617,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-cloudcontrolspartner/google/cloud/cloudcontrolspartner_v1/services/cloud_controls_partner_core/transports/rest.py b/packages/google-cloud-cloudcontrolspartner/google/cloud/cloudcontrolspartner_v1/services/cloud_controls_partner_core/transports/rest.py index 699221af62ff..503cbbef0d5b 100644 --- a/packages/google-cloud-cloudcontrolspartner/google/cloud/cloudcontrolspartner_v1/services/cloud_controls_partner_core/transports/rest.py +++ b/packages/google-cloud-cloudcontrolspartner/google/cloud/cloudcontrolspartner_v1/services/cloud_controls_partner_core/transports/rest.py @@ -160,12 +160,35 @@ def pre_get_customer( def post_get_customer(self, response: customers.Customer) -> customers.Customer: """Post-rpc interceptor for get_customer - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_customer_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudControlsPartnerCore server but before - it is returned to user code. + it is returned to user code. This `post_get_customer` interceptor runs + before the `post_get_customer_with_metadata` interceptor. """ return response + def post_get_customer_with_metadata( + self, + response: customers.Customer, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[customers.Customer, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_customer + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudControlsPartnerCore server but before it is returned to user code. + + We recommend only using this `post_get_customer_with_metadata` + interceptor in new development instead of the `post_get_customer` interceptor. + When both interceptors are used, this `post_get_customer_with_metadata` interceptor runs after the + `post_get_customer` interceptor. The (possibly modified) response returned by + `post_get_customer` will be passed to + `post_get_customer_with_metadata`. + """ + return response, metadata + def pre_get_ekm_connections( self, request: ekm_connections.GetEkmConnectionsRequest, @@ -186,12 +209,35 @@ def post_get_ekm_connections( ) -> ekm_connections.EkmConnections: """Post-rpc interceptor for get_ekm_connections - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_ekm_connections_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudControlsPartnerCore server but before - it is returned to user code. + it is returned to user code. This `post_get_ekm_connections` interceptor runs + before the `post_get_ekm_connections_with_metadata` interceptor. """ return response + def post_get_ekm_connections_with_metadata( + self, + response: ekm_connections.EkmConnections, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ekm_connections.EkmConnections, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_ekm_connections + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudControlsPartnerCore server but before it is returned to user code. + + We recommend only using this `post_get_ekm_connections_with_metadata` + interceptor in new development instead of the `post_get_ekm_connections` interceptor. + When both interceptors are used, this `post_get_ekm_connections_with_metadata` interceptor runs after the + `post_get_ekm_connections` interceptor. The (possibly modified) response returned by + `post_get_ekm_connections` will be passed to + `post_get_ekm_connections_with_metadata`. + """ + return response, metadata + def pre_get_partner( self, request: partners.GetPartnerRequest, @@ -207,12 +253,35 @@ def pre_get_partner( def post_get_partner(self, response: partners.Partner) -> partners.Partner: """Post-rpc interceptor for get_partner - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_partner_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudControlsPartnerCore server but before - it is returned to user code. + it is returned to user code. This `post_get_partner` interceptor runs + before the `post_get_partner_with_metadata` interceptor. """ return response + def post_get_partner_with_metadata( + self, + response: partners.Partner, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[partners.Partner, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_partner + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudControlsPartnerCore server but before it is returned to user code. + + We recommend only using this `post_get_partner_with_metadata` + interceptor in new development instead of the `post_get_partner` interceptor. + When both interceptors are used, this `post_get_partner_with_metadata` interceptor runs after the + `post_get_partner` interceptor. The (possibly modified) response returned by + `post_get_partner` will be passed to + `post_get_partner_with_metadata`. + """ + return response, metadata + def pre_get_partner_permissions( self, request: partner_permissions.GetPartnerPermissionsRequest, @@ -233,12 +302,37 @@ def post_get_partner_permissions( ) -> partner_permissions.PartnerPermissions: """Post-rpc interceptor for get_partner_permissions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_partner_permissions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudControlsPartnerCore server but before - it is returned to user code. + it is returned to user code. This `post_get_partner_permissions` interceptor runs + before the `post_get_partner_permissions_with_metadata` interceptor. """ return response + def post_get_partner_permissions_with_metadata( + self, + response: partner_permissions.PartnerPermissions, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + partner_permissions.PartnerPermissions, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_partner_permissions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudControlsPartnerCore server but before it is returned to user code. + + We recommend only using this `post_get_partner_permissions_with_metadata` + interceptor in new development instead of the `post_get_partner_permissions` interceptor. + When both interceptors are used, this `post_get_partner_permissions_with_metadata` interceptor runs after the + `post_get_partner_permissions` interceptor. The (possibly modified) response returned by + `post_get_partner_permissions` will be passed to + `post_get_partner_permissions_with_metadata`. + """ + return response, metadata + def pre_get_workload( self, request: customer_workloads.GetWorkloadRequest, @@ -258,12 +352,35 @@ def post_get_workload( ) -> customer_workloads.Workload: """Post-rpc interceptor for get_workload - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_workload_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudControlsPartnerCore server but before - it is returned to user code. + it is returned to user code. This `post_get_workload` interceptor runs + before the `post_get_workload_with_metadata` interceptor. """ return response + def post_get_workload_with_metadata( + self, + response: customer_workloads.Workload, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[customer_workloads.Workload, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_workload + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudControlsPartnerCore server but before it is returned to user code. + + We recommend only using this `post_get_workload_with_metadata` + interceptor in new development instead of the `post_get_workload` interceptor. + When both interceptors are used, this `post_get_workload_with_metadata` interceptor runs after the + `post_get_workload` interceptor. The (possibly modified) response returned by + `post_get_workload` will be passed to + `post_get_workload_with_metadata`. + """ + return response, metadata + def pre_list_access_approval_requests( self, request: access_approval_requests.ListAccessApprovalRequestsRequest, @@ -284,12 +401,38 @@ def post_list_access_approval_requests( ) -> access_approval_requests.ListAccessApprovalRequestsResponse: """Post-rpc interceptor for list_access_approval_requests - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_access_approval_requests_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudControlsPartnerCore server but before - it is returned to user code. + it is returned to user code. This `post_list_access_approval_requests` interceptor runs + before the `post_list_access_approval_requests_with_metadata` interceptor. """ return response + def post_list_access_approval_requests_with_metadata( + self, + response: access_approval_requests.ListAccessApprovalRequestsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + access_approval_requests.ListAccessApprovalRequestsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_access_approval_requests + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudControlsPartnerCore server but before it is returned to user code. + + We recommend only using this `post_list_access_approval_requests_with_metadata` + interceptor in new development instead of the `post_list_access_approval_requests` interceptor. + When both interceptors are used, this `post_list_access_approval_requests_with_metadata` interceptor runs after the + `post_list_access_approval_requests` interceptor. The (possibly modified) response returned by + `post_list_access_approval_requests` will be passed to + `post_list_access_approval_requests_with_metadata`. + """ + return response, metadata + def pre_list_customers( self, request: customers.ListCustomersRequest, @@ -307,12 +450,37 @@ def post_list_customers( ) -> customers.ListCustomersResponse: """Post-rpc interceptor for list_customers - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_customers_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudControlsPartnerCore server but before - it is returned to user code. + it is returned to user code. This `post_list_customers` interceptor runs + before the `post_list_customers_with_metadata` interceptor. """ return response + def post_list_customers_with_metadata( + self, + response: customers.ListCustomersResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + customers.ListCustomersResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_customers + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudControlsPartnerCore server but before it is returned to user code. + + We recommend only using this `post_list_customers_with_metadata` + interceptor in new development instead of the `post_list_customers` interceptor. + When both interceptors are used, this `post_list_customers_with_metadata` interceptor runs after the + `post_list_customers` interceptor. The (possibly modified) response returned by + `post_list_customers` will be passed to + `post_list_customers_with_metadata`. + """ + return response, metadata + def pre_list_workloads( self, request: customer_workloads.ListWorkloadsRequest, @@ -332,12 +500,38 @@ def post_list_workloads( ) -> customer_workloads.ListWorkloadsResponse: """Post-rpc interceptor for list_workloads - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_workloads_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudControlsPartnerCore server but before - it is returned to user code. + it is returned to user code. This `post_list_workloads` interceptor runs + before the `post_list_workloads_with_metadata` interceptor. """ return response + def post_list_workloads_with_metadata( + self, + response: customer_workloads.ListWorkloadsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + customer_workloads.ListWorkloadsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_workloads + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudControlsPartnerCore server but before it is returned to user code. + + We recommend only using this `post_list_workloads_with_metadata` + interceptor in new development instead of the `post_list_workloads` interceptor. + When both interceptors are used, this `post_list_workloads_with_metadata` interceptor runs after the + `post_list_workloads` interceptor. The (possibly modified) response returned by + `post_list_workloads` will be passed to + `post_list_workloads_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class CloudControlsPartnerCoreRestStub: @@ -545,6 +739,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_customer(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_customer_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -693,6 +891,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_ekm_connections(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_ekm_connections_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -834,6 +1036,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_partner(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_partner_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -980,6 +1186,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_partner_permissions(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_partner_permissions_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1127,6 +1337,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_workload(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_workload_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1278,6 +1492,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_access_approval_requests(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_list_access_approval_requests_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1425,6 +1646,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_customers(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_customers_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1570,6 +1795,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_workloads(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_workloads_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-cloudcontrolspartner/google/cloud/cloudcontrolspartner_v1/services/cloud_controls_partner_monitoring/client.py b/packages/google-cloud-cloudcontrolspartner/google/cloud/cloudcontrolspartner_v1/services/cloud_controls_partner_monitoring/client.py index 9b5941972753..57138d2f8c9f 100644 --- a/packages/google-cloud-cloudcontrolspartner/google/cloud/cloudcontrolspartner_v1/services/cloud_controls_partner_monitoring/client.py +++ b/packages/google-cloud-cloudcontrolspartner/google/cloud/cloudcontrolspartner_v1/services/cloud_controls_partner_monitoring/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 @@ -501,6 +503,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-cloudcontrolspartner/google/cloud/cloudcontrolspartner_v1/services/cloud_controls_partner_monitoring/transports/rest.py b/packages/google-cloud-cloudcontrolspartner/google/cloud/cloudcontrolspartner_v1/services/cloud_controls_partner_monitoring/transports/rest.py index ddf1bb4c5994..9114c7cecafd 100644 --- a/packages/google-cloud-cloudcontrolspartner/google/cloud/cloudcontrolspartner_v1/services/cloud_controls_partner_monitoring/transports/rest.py +++ b/packages/google-cloud-cloudcontrolspartner/google/cloud/cloudcontrolspartner_v1/services/cloud_controls_partner_monitoring/transports/rest.py @@ -107,12 +107,35 @@ def post_get_violation( ) -> violations.Violation: """Post-rpc interceptor for get_violation - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_violation_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudControlsPartnerMonitoring server but before - it is returned to user code. + it is returned to user code. This `post_get_violation` interceptor runs + before the `post_get_violation_with_metadata` interceptor. """ return response + def post_get_violation_with_metadata( + self, + response: violations.Violation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[violations.Violation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_violation + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudControlsPartnerMonitoring server but before it is returned to user code. + + We recommend only using this `post_get_violation_with_metadata` + interceptor in new development instead of the `post_get_violation` interceptor. + When both interceptors are used, this `post_get_violation_with_metadata` interceptor runs after the + `post_get_violation` interceptor. The (possibly modified) response returned by + `post_get_violation` will be passed to + `post_get_violation_with_metadata`. + """ + return response, metadata + def pre_list_violations( self, request: violations.ListViolationsRequest, @@ -132,12 +155,37 @@ def post_list_violations( ) -> violations.ListViolationsResponse: """Post-rpc interceptor for list_violations - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_violations_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudControlsPartnerMonitoring server but before - it is returned to user code. + it is returned to user code. This `post_list_violations` interceptor runs + before the `post_list_violations_with_metadata` interceptor. """ return response + def post_list_violations_with_metadata( + self, + response: violations.ListViolationsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + violations.ListViolationsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_violations + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudControlsPartnerMonitoring server but before it is returned to user code. + + We recommend only using this `post_list_violations_with_metadata` + interceptor in new development instead of the `post_list_violations` interceptor. + When both interceptors are used, this `post_list_violations_with_metadata` interceptor runs after the + `post_list_violations` interceptor. The (possibly modified) response returned by + `post_list_violations` will be passed to + `post_list_violations_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class CloudControlsPartnerMonitoringRestStub: @@ -349,6 +397,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_violation(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_violation_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -493,6 +545,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_violations(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_violations_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-cloudcontrolspartner/google/cloud/cloudcontrolspartner_v1beta/gapic_version.py b/packages/google-cloud-cloudcontrolspartner/google/cloud/cloudcontrolspartner_v1beta/gapic_version.py index 668eac0d72ce..558c8aab67c5 100644 --- a/packages/google-cloud-cloudcontrolspartner/google/cloud/cloudcontrolspartner_v1beta/gapic_version.py +++ b/packages/google-cloud-cloudcontrolspartner/google/cloud/cloudcontrolspartner_v1beta/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.2.4" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-cloudcontrolspartner/google/cloud/cloudcontrolspartner_v1beta/services/cloud_controls_partner_core/client.py b/packages/google-cloud-cloudcontrolspartner/google/cloud/cloudcontrolspartner_v1beta/services/cloud_controls_partner_core/client.py index 2b66ad60872b..7554329c9c4f 100644 --- a/packages/google-cloud-cloudcontrolspartner/google/cloud/cloudcontrolspartner_v1beta/services/cloud_controls_partner_core/client.py +++ b/packages/google-cloud-cloudcontrolspartner/google/cloud/cloudcontrolspartner_v1beta/services/cloud_controls_partner_core/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 @@ -616,6 +618,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-cloudcontrolspartner/google/cloud/cloudcontrolspartner_v1beta/services/cloud_controls_partner_core/transports/rest.py b/packages/google-cloud-cloudcontrolspartner/google/cloud/cloudcontrolspartner_v1beta/services/cloud_controls_partner_core/transports/rest.py index baa5be20272d..ab1b5962bdb7 100644 --- a/packages/google-cloud-cloudcontrolspartner/google/cloud/cloudcontrolspartner_v1beta/services/cloud_controls_partner_core/transports/rest.py +++ b/packages/google-cloud-cloudcontrolspartner/google/cloud/cloudcontrolspartner_v1beta/services/cloud_controls_partner_core/transports/rest.py @@ -183,12 +183,35 @@ def pre_create_customer( def post_create_customer(self, response: customers.Customer) -> customers.Customer: """Post-rpc interceptor for create_customer - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_customer_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudControlsPartnerCore server but before - it is returned to user code. + it is returned to user code. This `post_create_customer` interceptor runs + before the `post_create_customer_with_metadata` interceptor. """ return response + def post_create_customer_with_metadata( + self, + response: customers.Customer, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[customers.Customer, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_customer + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudControlsPartnerCore server but before it is returned to user code. + + We recommend only using this `post_create_customer_with_metadata` + interceptor in new development instead of the `post_create_customer` interceptor. + When both interceptors are used, this `post_create_customer_with_metadata` interceptor runs after the + `post_create_customer` interceptor. The (possibly modified) response returned by + `post_create_customer` will be passed to + `post_create_customer_with_metadata`. + """ + return response, metadata + def pre_delete_customer( self, request: customers.DeleteCustomerRequest, @@ -218,12 +241,35 @@ def pre_get_customer( def post_get_customer(self, response: customers.Customer) -> customers.Customer: """Post-rpc interceptor for get_customer - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_customer_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudControlsPartnerCore server but before - it is returned to user code. + it is returned to user code. This `post_get_customer` interceptor runs + before the `post_get_customer_with_metadata` interceptor. """ return response + def post_get_customer_with_metadata( + self, + response: customers.Customer, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[customers.Customer, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_customer + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudControlsPartnerCore server but before it is returned to user code. + + We recommend only using this `post_get_customer_with_metadata` + interceptor in new development instead of the `post_get_customer` interceptor. + When both interceptors are used, this `post_get_customer_with_metadata` interceptor runs after the + `post_get_customer` interceptor. The (possibly modified) response returned by + `post_get_customer` will be passed to + `post_get_customer_with_metadata`. + """ + return response, metadata + def pre_get_ekm_connections( self, request: ekm_connections.GetEkmConnectionsRequest, @@ -244,12 +290,35 @@ def post_get_ekm_connections( ) -> ekm_connections.EkmConnections: """Post-rpc interceptor for get_ekm_connections - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_ekm_connections_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudControlsPartnerCore server but before - it is returned to user code. + it is returned to user code. This `post_get_ekm_connections` interceptor runs + before the `post_get_ekm_connections_with_metadata` interceptor. """ return response + def post_get_ekm_connections_with_metadata( + self, + response: ekm_connections.EkmConnections, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ekm_connections.EkmConnections, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_ekm_connections + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudControlsPartnerCore server but before it is returned to user code. + + We recommend only using this `post_get_ekm_connections_with_metadata` + interceptor in new development instead of the `post_get_ekm_connections` interceptor. + When both interceptors are used, this `post_get_ekm_connections_with_metadata` interceptor runs after the + `post_get_ekm_connections` interceptor. The (possibly modified) response returned by + `post_get_ekm_connections` will be passed to + `post_get_ekm_connections_with_metadata`. + """ + return response, metadata + def pre_get_partner( self, request: partners.GetPartnerRequest, @@ -265,12 +334,35 @@ def pre_get_partner( def post_get_partner(self, response: partners.Partner) -> partners.Partner: """Post-rpc interceptor for get_partner - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_partner_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudControlsPartnerCore server but before - it is returned to user code. + it is returned to user code. This `post_get_partner` interceptor runs + before the `post_get_partner_with_metadata` interceptor. """ return response + def post_get_partner_with_metadata( + self, + response: partners.Partner, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[partners.Partner, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_partner + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudControlsPartnerCore server but before it is returned to user code. + + We recommend only using this `post_get_partner_with_metadata` + interceptor in new development instead of the `post_get_partner` interceptor. + When both interceptors are used, this `post_get_partner_with_metadata` interceptor runs after the + `post_get_partner` interceptor. The (possibly modified) response returned by + `post_get_partner` will be passed to + `post_get_partner_with_metadata`. + """ + return response, metadata + def pre_get_partner_permissions( self, request: partner_permissions.GetPartnerPermissionsRequest, @@ -291,12 +383,37 @@ def post_get_partner_permissions( ) -> partner_permissions.PartnerPermissions: """Post-rpc interceptor for get_partner_permissions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_partner_permissions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudControlsPartnerCore server but before - it is returned to user code. + it is returned to user code. This `post_get_partner_permissions` interceptor runs + before the `post_get_partner_permissions_with_metadata` interceptor. """ return response + def post_get_partner_permissions_with_metadata( + self, + response: partner_permissions.PartnerPermissions, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + partner_permissions.PartnerPermissions, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_partner_permissions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudControlsPartnerCore server but before it is returned to user code. + + We recommend only using this `post_get_partner_permissions_with_metadata` + interceptor in new development instead of the `post_get_partner_permissions` interceptor. + When both interceptors are used, this `post_get_partner_permissions_with_metadata` interceptor runs after the + `post_get_partner_permissions` interceptor. The (possibly modified) response returned by + `post_get_partner_permissions` will be passed to + `post_get_partner_permissions_with_metadata`. + """ + return response, metadata + def pre_get_workload( self, request: customer_workloads.GetWorkloadRequest, @@ -316,12 +433,35 @@ def post_get_workload( ) -> customer_workloads.Workload: """Post-rpc interceptor for get_workload - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_workload_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudControlsPartnerCore server but before - it is returned to user code. + it is returned to user code. This `post_get_workload` interceptor runs + before the `post_get_workload_with_metadata` interceptor. """ return response + def post_get_workload_with_metadata( + self, + response: customer_workloads.Workload, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[customer_workloads.Workload, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_workload + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudControlsPartnerCore server but before it is returned to user code. + + We recommend only using this `post_get_workload_with_metadata` + interceptor in new development instead of the `post_get_workload` interceptor. + When both interceptors are used, this `post_get_workload_with_metadata` interceptor runs after the + `post_get_workload` interceptor. The (possibly modified) response returned by + `post_get_workload` will be passed to + `post_get_workload_with_metadata`. + """ + return response, metadata + def pre_list_access_approval_requests( self, request: access_approval_requests.ListAccessApprovalRequestsRequest, @@ -342,12 +482,38 @@ def post_list_access_approval_requests( ) -> access_approval_requests.ListAccessApprovalRequestsResponse: """Post-rpc interceptor for list_access_approval_requests - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_access_approval_requests_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudControlsPartnerCore server but before - it is returned to user code. + it is returned to user code. This `post_list_access_approval_requests` interceptor runs + before the `post_list_access_approval_requests_with_metadata` interceptor. """ return response + def post_list_access_approval_requests_with_metadata( + self, + response: access_approval_requests.ListAccessApprovalRequestsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + access_approval_requests.ListAccessApprovalRequestsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_access_approval_requests + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudControlsPartnerCore server but before it is returned to user code. + + We recommend only using this `post_list_access_approval_requests_with_metadata` + interceptor in new development instead of the `post_list_access_approval_requests` interceptor. + When both interceptors are used, this `post_list_access_approval_requests_with_metadata` interceptor runs after the + `post_list_access_approval_requests` interceptor. The (possibly modified) response returned by + `post_list_access_approval_requests` will be passed to + `post_list_access_approval_requests_with_metadata`. + """ + return response, metadata + def pre_list_customers( self, request: customers.ListCustomersRequest, @@ -365,12 +531,37 @@ def post_list_customers( ) -> customers.ListCustomersResponse: """Post-rpc interceptor for list_customers - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_customers_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudControlsPartnerCore server but before - it is returned to user code. + it is returned to user code. This `post_list_customers` interceptor runs + before the `post_list_customers_with_metadata` interceptor. """ return response + def post_list_customers_with_metadata( + self, + response: customers.ListCustomersResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + customers.ListCustomersResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_customers + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudControlsPartnerCore server but before it is returned to user code. + + We recommend only using this `post_list_customers_with_metadata` + interceptor in new development instead of the `post_list_customers` interceptor. + When both interceptors are used, this `post_list_customers_with_metadata` interceptor runs after the + `post_list_customers` interceptor. The (possibly modified) response returned by + `post_list_customers` will be passed to + `post_list_customers_with_metadata`. + """ + return response, metadata + def pre_list_workloads( self, request: customer_workloads.ListWorkloadsRequest, @@ -390,12 +581,38 @@ def post_list_workloads( ) -> customer_workloads.ListWorkloadsResponse: """Post-rpc interceptor for list_workloads - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_workloads_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudControlsPartnerCore server but before - it is returned to user code. + it is returned to user code. This `post_list_workloads` interceptor runs + before the `post_list_workloads_with_metadata` interceptor. """ return response + def post_list_workloads_with_metadata( + self, + response: customer_workloads.ListWorkloadsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + customer_workloads.ListWorkloadsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_workloads + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudControlsPartnerCore server but before it is returned to user code. + + We recommend only using this `post_list_workloads_with_metadata` + interceptor in new development instead of the `post_list_workloads` interceptor. + When both interceptors are used, this `post_list_workloads_with_metadata` interceptor runs after the + `post_list_workloads` interceptor. The (possibly modified) response returned by + `post_list_workloads` will be passed to + `post_list_workloads_with_metadata`. + """ + return response, metadata + def pre_update_customer( self, request: customers.UpdateCustomerRequest, @@ -413,12 +630,35 @@ def pre_update_customer( def post_update_customer(self, response: customers.Customer) -> customers.Customer: """Post-rpc interceptor for update_customer - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_customer_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudControlsPartnerCore server but before - it is returned to user code. + it is returned to user code. This `post_update_customer` interceptor runs + before the `post_update_customer_with_metadata` interceptor. """ return response + def post_update_customer_with_metadata( + self, + response: customers.Customer, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[customers.Customer, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_customer + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudControlsPartnerCore server but before it is returned to user code. + + We recommend only using this `post_update_customer_with_metadata` + interceptor in new development instead of the `post_update_customer` interceptor. + When both interceptors are used, this `post_update_customer_with_metadata` interceptor runs after the + `post_update_customer` interceptor. The (possibly modified) response returned by + `post_update_customer` will be passed to + `post_update_customer_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class CloudControlsPartnerCoreRestStub: @@ -634,6 +874,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_customer(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_customer_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -886,6 +1130,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_customer(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_customer_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1034,6 +1282,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_ekm_connections(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_ekm_connections_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1175,6 +1427,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_partner(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_partner_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1321,6 +1577,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_partner_permissions(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_partner_permissions_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1468,6 +1728,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_workload(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_workload_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1619,6 +1883,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_access_approval_requests(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_list_access_approval_requests_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1766,6 +2037,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_customers(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_customers_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1911,6 +2186,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_workloads(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_workloads_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2064,6 +2343,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_customer(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_customer_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-cloudcontrolspartner/google/cloud/cloudcontrolspartner_v1beta/services/cloud_controls_partner_monitoring/client.py b/packages/google-cloud-cloudcontrolspartner/google/cloud/cloudcontrolspartner_v1beta/services/cloud_controls_partner_monitoring/client.py index 67f7db23d20d..8879e496e673 100644 --- a/packages/google-cloud-cloudcontrolspartner/google/cloud/cloudcontrolspartner_v1beta/services/cloud_controls_partner_monitoring/client.py +++ b/packages/google-cloud-cloudcontrolspartner/google/cloud/cloudcontrolspartner_v1beta/services/cloud_controls_partner_monitoring/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 @@ -501,6 +503,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-cloudcontrolspartner/google/cloud/cloudcontrolspartner_v1beta/services/cloud_controls_partner_monitoring/transports/rest.py b/packages/google-cloud-cloudcontrolspartner/google/cloud/cloudcontrolspartner_v1beta/services/cloud_controls_partner_monitoring/transports/rest.py index 1d6f57440b70..64064d2340db 100644 --- a/packages/google-cloud-cloudcontrolspartner/google/cloud/cloudcontrolspartner_v1beta/services/cloud_controls_partner_monitoring/transports/rest.py +++ b/packages/google-cloud-cloudcontrolspartner/google/cloud/cloudcontrolspartner_v1beta/services/cloud_controls_partner_monitoring/transports/rest.py @@ -107,12 +107,35 @@ def post_get_violation( ) -> violations.Violation: """Post-rpc interceptor for get_violation - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_violation_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudControlsPartnerMonitoring server but before - it is returned to user code. + it is returned to user code. This `post_get_violation` interceptor runs + before the `post_get_violation_with_metadata` interceptor. """ return response + def post_get_violation_with_metadata( + self, + response: violations.Violation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[violations.Violation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_violation + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudControlsPartnerMonitoring server but before it is returned to user code. + + We recommend only using this `post_get_violation_with_metadata` + interceptor in new development instead of the `post_get_violation` interceptor. + When both interceptors are used, this `post_get_violation_with_metadata` interceptor runs after the + `post_get_violation` interceptor. The (possibly modified) response returned by + `post_get_violation` will be passed to + `post_get_violation_with_metadata`. + """ + return response, metadata + def pre_list_violations( self, request: violations.ListViolationsRequest, @@ -132,12 +155,37 @@ def post_list_violations( ) -> violations.ListViolationsResponse: """Post-rpc interceptor for list_violations - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_violations_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudControlsPartnerMonitoring server but before - it is returned to user code. + it is returned to user code. This `post_list_violations` interceptor runs + before the `post_list_violations_with_metadata` interceptor. """ return response + def post_list_violations_with_metadata( + self, + response: violations.ListViolationsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + violations.ListViolationsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_violations + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudControlsPartnerMonitoring server but before it is returned to user code. + + We recommend only using this `post_list_violations_with_metadata` + interceptor in new development instead of the `post_list_violations` interceptor. + When both interceptors are used, this `post_list_violations_with_metadata` interceptor runs after the + `post_list_violations` interceptor. The (possibly modified) response returned by + `post_list_violations` will be passed to + `post_list_violations_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class CloudControlsPartnerMonitoringRestStub: @@ -349,6 +397,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_violation(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_violation_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -493,6 +545,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_violations(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_violations_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-cloudcontrolspartner/samples/generated_samples/snippet_metadata_google.cloud.cloudcontrolspartner.v1.json b/packages/google-cloud-cloudcontrolspartner/samples/generated_samples/snippet_metadata_google.cloud.cloudcontrolspartner.v1.json index cc6a34e808d2..7e3c2e43d948 100644 --- a/packages/google-cloud-cloudcontrolspartner/samples/generated_samples/snippet_metadata_google.cloud.cloudcontrolspartner.v1.json +++ b/packages/google-cloud-cloudcontrolspartner/samples/generated_samples/snippet_metadata_google.cloud.cloudcontrolspartner.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-cloudcontrolspartner", - "version": "0.2.4" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-cloudcontrolspartner/samples/generated_samples/snippet_metadata_google.cloud.cloudcontrolspartner.v1beta.json b/packages/google-cloud-cloudcontrolspartner/samples/generated_samples/snippet_metadata_google.cloud.cloudcontrolspartner.v1beta.json index f03be5bf25eb..586e22745082 100644 --- a/packages/google-cloud-cloudcontrolspartner/samples/generated_samples/snippet_metadata_google.cloud.cloudcontrolspartner.v1beta.json +++ b/packages/google-cloud-cloudcontrolspartner/samples/generated_samples/snippet_metadata_google.cloud.cloudcontrolspartner.v1beta.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-cloudcontrolspartner", - "version": "0.2.4" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-cloudcontrolspartner/tests/unit/gapic/cloudcontrolspartner_v1/test_cloud_controls_partner_core.py b/packages/google-cloud-cloudcontrolspartner/tests/unit/gapic/cloudcontrolspartner_v1/test_cloud_controls_partner_core.py index 673f4cb40d7c..4e558ad8b865 100644 --- a/packages/google-cloud-cloudcontrolspartner/tests/unit/gapic/cloudcontrolspartner_v1/test_cloud_controls_partner_core.py +++ b/packages/google-cloud-cloudcontrolspartner/tests/unit/gapic/cloudcontrolspartner_v1/test_cloud_controls_partner_core.py @@ -68,6 +68,13 @@ partners, ) +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 +350,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 = CloudControlsPartnerCoreClient(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 = CloudControlsPartnerCoreClient(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", [ @@ -6813,10 +6863,14 @@ def test_get_workload_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudControlsPartnerCoreRestInterceptor, "post_get_workload" ) as post, mock.patch.object( + transports.CloudControlsPartnerCoreRestInterceptor, + "post_get_workload_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudControlsPartnerCoreRestInterceptor, "pre_get_workload" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = customer_workloads.GetWorkloadRequest.pb( customer_workloads.GetWorkloadRequest() ) @@ -6842,6 +6896,7 @@ def test_get_workload_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = customer_workloads.Workload() + post_with_metadata.return_value = customer_workloads.Workload(), metadata client.get_workload( request, @@ -6853,6 +6908,7 @@ def test_get_workload_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_workloads_rest_bad_request( @@ -6943,10 +6999,14 @@ def test_list_workloads_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudControlsPartnerCoreRestInterceptor, "post_list_workloads" ) as post, mock.patch.object( + transports.CloudControlsPartnerCoreRestInterceptor, + "post_list_workloads_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudControlsPartnerCoreRestInterceptor, "pre_list_workloads" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = customer_workloads.ListWorkloadsRequest.pb( customer_workloads.ListWorkloadsRequest() ) @@ -6972,6 +7032,10 @@ def test_list_workloads_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = customer_workloads.ListWorkloadsResponse() + post_with_metadata.return_value = ( + customer_workloads.ListWorkloadsResponse(), + metadata, + ) client.list_workloads( request, @@ -6983,6 +7047,7 @@ def test_list_workloads_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_customer_rest_bad_request(request_type=customers.GetCustomerRequest): @@ -7069,10 +7134,14 @@ def test_get_customer_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudControlsPartnerCoreRestInterceptor, "post_get_customer" ) as post, mock.patch.object( + transports.CloudControlsPartnerCoreRestInterceptor, + "post_get_customer_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudControlsPartnerCoreRestInterceptor, "pre_get_customer" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = customers.GetCustomerRequest.pb(customers.GetCustomerRequest()) transcode.return_value = { "method": "post", @@ -7094,6 +7163,7 @@ def test_get_customer_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = customers.Customer() + post_with_metadata.return_value = customers.Customer(), metadata client.get_customer( request, @@ -7105,6 +7175,7 @@ def test_get_customer_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_customers_rest_bad_request(request_type=customers.ListCustomersRequest): @@ -7189,10 +7260,14 @@ def test_list_customers_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudControlsPartnerCoreRestInterceptor, "post_list_customers" ) as post, mock.patch.object( + transports.CloudControlsPartnerCoreRestInterceptor, + "post_list_customers_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudControlsPartnerCoreRestInterceptor, "pre_list_customers" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = customers.ListCustomersRequest.pb(customers.ListCustomersRequest()) transcode.return_value = { "method": "post", @@ -7216,6 +7291,7 @@ def test_list_customers_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = customers.ListCustomersResponse() + post_with_metadata.return_value = customers.ListCustomersResponse(), metadata client.list_customers( request, @@ -7227,6 +7303,7 @@ def test_list_customers_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_ekm_connections_rest_bad_request( @@ -7315,10 +7392,14 @@ def test_get_ekm_connections_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudControlsPartnerCoreRestInterceptor, "post_get_ekm_connections" ) as post, mock.patch.object( + transports.CloudControlsPartnerCoreRestInterceptor, + "post_get_ekm_connections_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudControlsPartnerCoreRestInterceptor, "pre_get_ekm_connections" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = ekm_connections.GetEkmConnectionsRequest.pb( ekm_connections.GetEkmConnectionsRequest() ) @@ -7344,6 +7425,7 @@ def test_get_ekm_connections_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = ekm_connections.EkmConnections() + post_with_metadata.return_value = ekm_connections.EkmConnections(), metadata client.get_ekm_connections( request, @@ -7355,6 +7437,7 @@ def test_get_ekm_connections_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_partner_permissions_rest_bad_request( @@ -7450,11 +7533,15 @@ def test_get_partner_permissions_rest_interceptors(null_interceptor): transports.CloudControlsPartnerCoreRestInterceptor, "post_get_partner_permissions", ) as post, mock.patch.object( + transports.CloudControlsPartnerCoreRestInterceptor, + "post_get_partner_permissions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudControlsPartnerCoreRestInterceptor, "pre_get_partner_permissions", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = partner_permissions.GetPartnerPermissionsRequest.pb( partner_permissions.GetPartnerPermissionsRequest() ) @@ -7480,6 +7567,10 @@ def test_get_partner_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = partner_permissions.PartnerPermissions() + post_with_metadata.return_value = ( + partner_permissions.PartnerPermissions(), + metadata, + ) client.get_partner_permissions( request, @@ -7491,6 +7582,7 @@ def test_get_partner_permissions_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_access_approval_requests_rest_bad_request( @@ -7584,11 +7676,15 @@ def test_list_access_approval_requests_rest_interceptors(null_interceptor): transports.CloudControlsPartnerCoreRestInterceptor, "post_list_access_approval_requests", ) as post, mock.patch.object( + transports.CloudControlsPartnerCoreRestInterceptor, + "post_list_access_approval_requests_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudControlsPartnerCoreRestInterceptor, "pre_list_access_approval_requests", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = access_approval_requests.ListAccessApprovalRequestsRequest.pb( access_approval_requests.ListAccessApprovalRequestsRequest() ) @@ -7618,6 +7714,10 @@ def test_list_access_approval_requests_rest_interceptors(null_interceptor): post.return_value = ( access_approval_requests.ListAccessApprovalRequestsResponse() ) + post_with_metadata.return_value = ( + access_approval_requests.ListAccessApprovalRequestsResponse(), + metadata, + ) client.list_access_approval_requests( request, @@ -7629,6 +7729,7 @@ def test_list_access_approval_requests_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_partner_rest_bad_request(request_type=partners.GetPartnerRequest): @@ -7715,10 +7816,14 @@ def test_get_partner_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudControlsPartnerCoreRestInterceptor, "post_get_partner" ) as post, mock.patch.object( + transports.CloudControlsPartnerCoreRestInterceptor, + "post_get_partner_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudControlsPartnerCoreRestInterceptor, "pre_get_partner" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = partners.GetPartnerRequest.pb(partners.GetPartnerRequest()) transcode.return_value = { "method": "post", @@ -7740,6 +7845,7 @@ def test_get_partner_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = partners.Partner() + post_with_metadata.return_value = partners.Partner(), metadata client.get_partner( request, @@ -7751,6 +7857,7 @@ def test_get_partner_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-cloudcontrolspartner/tests/unit/gapic/cloudcontrolspartner_v1/test_cloud_controls_partner_monitoring.py b/packages/google-cloud-cloudcontrolspartner/tests/unit/gapic/cloudcontrolspartner_v1/test_cloud_controls_partner_monitoring.py index 4ca06b66d61d..abd85374fb0d 100644 --- a/packages/google-cloud-cloudcontrolspartner/tests/unit/gapic/cloudcontrolspartner_v1/test_cloud_controls_partner_monitoring.py +++ b/packages/google-cloud-cloudcontrolspartner/tests/unit/gapic/cloudcontrolspartner_v1/test_cloud_controls_partner_monitoring.py @@ -62,6 +62,13 @@ ) from google.cloud.cloudcontrolspartner_v1.types import violations +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 @@ -352,6 +359,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 = CloudControlsPartnerMonitoringClient(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 = CloudControlsPartnerMonitoringClient(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", [ @@ -2782,10 +2832,14 @@ def test_list_violations_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudControlsPartnerMonitoringRestInterceptor, "post_list_violations" ) as post, mock.patch.object( + transports.CloudControlsPartnerMonitoringRestInterceptor, + "post_list_violations_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudControlsPartnerMonitoringRestInterceptor, "pre_list_violations" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = violations.ListViolationsRequest.pb( violations.ListViolationsRequest() ) @@ -2811,6 +2865,7 @@ def test_list_violations_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = violations.ListViolationsResponse() + post_with_metadata.return_value = violations.ListViolationsResponse(), metadata client.list_violations( request, @@ -2822,6 +2877,7 @@ def test_list_violations_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_violation_rest_bad_request(request_type=violations.GetViolationRequest): @@ -2918,10 +2974,14 @@ def test_get_violation_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudControlsPartnerMonitoringRestInterceptor, "post_get_violation" ) as post, mock.patch.object( + transports.CloudControlsPartnerMonitoringRestInterceptor, + "post_get_violation_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudControlsPartnerMonitoringRestInterceptor, "pre_get_violation" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = violations.GetViolationRequest.pb(violations.GetViolationRequest()) transcode.return_value = { "method": "post", @@ -2943,6 +3003,7 @@ def test_get_violation_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = violations.Violation() + post_with_metadata.return_value = violations.Violation(), metadata client.get_violation( request, @@ -2954,6 +3015,7 @@ def test_get_violation_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-cloudcontrolspartner/tests/unit/gapic/cloudcontrolspartner_v1beta/test_cloud_controls_partner_core.py b/packages/google-cloud-cloudcontrolspartner/tests/unit/gapic/cloudcontrolspartner_v1beta/test_cloud_controls_partner_core.py index 813119e325cc..bc04f01bff51 100644 --- a/packages/google-cloud-cloudcontrolspartner/tests/unit/gapic/cloudcontrolspartner_v1beta/test_cloud_controls_partner_core.py +++ b/packages/google-cloud-cloudcontrolspartner/tests/unit/gapic/cloudcontrolspartner_v1beta/test_cloud_controls_partner_core.py @@ -70,6 +70,13 @@ partners, ) +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 @@ -345,6 +352,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 = CloudControlsPartnerCoreClient(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 = CloudControlsPartnerCoreClient(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", [ @@ -8532,10 +8582,14 @@ def test_get_workload_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudControlsPartnerCoreRestInterceptor, "post_get_workload" ) as post, mock.patch.object( + transports.CloudControlsPartnerCoreRestInterceptor, + "post_get_workload_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudControlsPartnerCoreRestInterceptor, "pre_get_workload" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = customer_workloads.GetWorkloadRequest.pb( customer_workloads.GetWorkloadRequest() ) @@ -8561,6 +8615,7 @@ def test_get_workload_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = customer_workloads.Workload() + post_with_metadata.return_value = customer_workloads.Workload(), metadata client.get_workload( request, @@ -8572,6 +8627,7 @@ def test_get_workload_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_workloads_rest_bad_request( @@ -8662,10 +8718,14 @@ def test_list_workloads_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudControlsPartnerCoreRestInterceptor, "post_list_workloads" ) as post, mock.patch.object( + transports.CloudControlsPartnerCoreRestInterceptor, + "post_list_workloads_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudControlsPartnerCoreRestInterceptor, "pre_list_workloads" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = customer_workloads.ListWorkloadsRequest.pb( customer_workloads.ListWorkloadsRequest() ) @@ -8691,6 +8751,10 @@ def test_list_workloads_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = customer_workloads.ListWorkloadsResponse() + post_with_metadata.return_value = ( + customer_workloads.ListWorkloadsResponse(), + metadata, + ) client.list_workloads( request, @@ -8702,6 +8766,7 @@ def test_list_workloads_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_customer_rest_bad_request(request_type=customers.GetCustomerRequest): @@ -8790,10 +8855,14 @@ def test_get_customer_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudControlsPartnerCoreRestInterceptor, "post_get_customer" ) as post, mock.patch.object( + transports.CloudControlsPartnerCoreRestInterceptor, + "post_get_customer_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudControlsPartnerCoreRestInterceptor, "pre_get_customer" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = customers.GetCustomerRequest.pb(customers.GetCustomerRequest()) transcode.return_value = { "method": "post", @@ -8815,6 +8884,7 @@ def test_get_customer_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = customers.Customer() + post_with_metadata.return_value = customers.Customer(), metadata client.get_customer( request, @@ -8826,6 +8896,7 @@ def test_get_customer_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_customers_rest_bad_request(request_type=customers.ListCustomersRequest): @@ -8910,10 +8981,14 @@ def test_list_customers_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudControlsPartnerCoreRestInterceptor, "post_list_customers" ) as post, mock.patch.object( + transports.CloudControlsPartnerCoreRestInterceptor, + "post_list_customers_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudControlsPartnerCoreRestInterceptor, "pre_list_customers" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = customers.ListCustomersRequest.pb(customers.ListCustomersRequest()) transcode.return_value = { "method": "post", @@ -8937,6 +9012,7 @@ def test_list_customers_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = customers.ListCustomersResponse() + post_with_metadata.return_value = customers.ListCustomersResponse(), metadata client.list_customers( request, @@ -8948,6 +9024,7 @@ def test_list_customers_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_ekm_connections_rest_bad_request( @@ -9036,10 +9113,14 @@ def test_get_ekm_connections_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudControlsPartnerCoreRestInterceptor, "post_get_ekm_connections" ) as post, mock.patch.object( + transports.CloudControlsPartnerCoreRestInterceptor, + "post_get_ekm_connections_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudControlsPartnerCoreRestInterceptor, "pre_get_ekm_connections" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = ekm_connections.GetEkmConnectionsRequest.pb( ekm_connections.GetEkmConnectionsRequest() ) @@ -9065,6 +9146,7 @@ def test_get_ekm_connections_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = ekm_connections.EkmConnections() + post_with_metadata.return_value = ekm_connections.EkmConnections(), metadata client.get_ekm_connections( request, @@ -9076,6 +9158,7 @@ def test_get_ekm_connections_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_partner_permissions_rest_bad_request( @@ -9171,11 +9254,15 @@ def test_get_partner_permissions_rest_interceptors(null_interceptor): transports.CloudControlsPartnerCoreRestInterceptor, "post_get_partner_permissions", ) as post, mock.patch.object( + transports.CloudControlsPartnerCoreRestInterceptor, + "post_get_partner_permissions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudControlsPartnerCoreRestInterceptor, "pre_get_partner_permissions", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = partner_permissions.GetPartnerPermissionsRequest.pb( partner_permissions.GetPartnerPermissionsRequest() ) @@ -9201,6 +9288,10 @@ def test_get_partner_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = partner_permissions.PartnerPermissions() + post_with_metadata.return_value = ( + partner_permissions.PartnerPermissions(), + metadata, + ) client.get_partner_permissions( request, @@ -9212,6 +9303,7 @@ def test_get_partner_permissions_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_access_approval_requests_rest_bad_request( @@ -9305,11 +9397,15 @@ def test_list_access_approval_requests_rest_interceptors(null_interceptor): transports.CloudControlsPartnerCoreRestInterceptor, "post_list_access_approval_requests", ) as post, mock.patch.object( + transports.CloudControlsPartnerCoreRestInterceptor, + "post_list_access_approval_requests_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudControlsPartnerCoreRestInterceptor, "pre_list_access_approval_requests", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = access_approval_requests.ListAccessApprovalRequestsRequest.pb( access_approval_requests.ListAccessApprovalRequestsRequest() ) @@ -9339,6 +9435,10 @@ def test_list_access_approval_requests_rest_interceptors(null_interceptor): post.return_value = ( access_approval_requests.ListAccessApprovalRequestsResponse() ) + post_with_metadata.return_value = ( + access_approval_requests.ListAccessApprovalRequestsResponse(), + metadata, + ) client.list_access_approval_requests( request, @@ -9350,6 +9450,7 @@ def test_list_access_approval_requests_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_partner_rest_bad_request(request_type=partners.GetPartnerRequest): @@ -9436,10 +9537,14 @@ def test_get_partner_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudControlsPartnerCoreRestInterceptor, "post_get_partner" ) as post, mock.patch.object( + transports.CloudControlsPartnerCoreRestInterceptor, + "post_get_partner_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudControlsPartnerCoreRestInterceptor, "pre_get_partner" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = partners.GetPartnerRequest.pb(partners.GetPartnerRequest()) transcode.return_value = { "method": "post", @@ -9461,6 +9566,7 @@ def test_get_partner_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = partners.Partner() + post_with_metadata.return_value = partners.Partner(), metadata client.get_partner( request, @@ -9472,6 +9578,7 @@ def test_get_partner_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_customer_rest_bad_request(request_type=customers.CreateCustomerRequest): @@ -9643,10 +9750,14 @@ def test_create_customer_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudControlsPartnerCoreRestInterceptor, "post_create_customer" ) as post, mock.patch.object( + transports.CloudControlsPartnerCoreRestInterceptor, + "post_create_customer_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudControlsPartnerCoreRestInterceptor, "pre_create_customer" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = customers.CreateCustomerRequest.pb( customers.CreateCustomerRequest() ) @@ -9670,6 +9781,7 @@ def test_create_customer_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = customers.Customer() + post_with_metadata.return_value = customers.Customer(), metadata client.create_customer( request, @@ -9681,6 +9793,7 @@ def test_create_customer_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_customer_rest_bad_request(request_type=customers.UpdateCustomerRequest): @@ -9860,10 +9973,14 @@ def test_update_customer_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudControlsPartnerCoreRestInterceptor, "post_update_customer" ) as post, mock.patch.object( + transports.CloudControlsPartnerCoreRestInterceptor, + "post_update_customer_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudControlsPartnerCoreRestInterceptor, "pre_update_customer" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = customers.UpdateCustomerRequest.pb( customers.UpdateCustomerRequest() ) @@ -9887,6 +10004,7 @@ def test_update_customer_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = customers.Customer() + post_with_metadata.return_value = customers.Customer(), metadata client.update_customer( request, @@ -9898,6 +10016,7 @@ def test_update_customer_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_customer_rest_bad_request(request_type=customers.DeleteCustomerRequest): diff --git a/packages/google-cloud-cloudcontrolspartner/tests/unit/gapic/cloudcontrolspartner_v1beta/test_cloud_controls_partner_monitoring.py b/packages/google-cloud-cloudcontrolspartner/tests/unit/gapic/cloudcontrolspartner_v1beta/test_cloud_controls_partner_monitoring.py index 8f9319b093ae..622ddcdb9bad 100644 --- a/packages/google-cloud-cloudcontrolspartner/tests/unit/gapic/cloudcontrolspartner_v1beta/test_cloud_controls_partner_monitoring.py +++ b/packages/google-cloud-cloudcontrolspartner/tests/unit/gapic/cloudcontrolspartner_v1beta/test_cloud_controls_partner_monitoring.py @@ -62,6 +62,13 @@ ) from google.cloud.cloudcontrolspartner_v1beta.types import violations +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 @@ -352,6 +359,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 = CloudControlsPartnerMonitoringClient(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 = CloudControlsPartnerMonitoringClient(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", [ @@ -2782,10 +2832,14 @@ def test_list_violations_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudControlsPartnerMonitoringRestInterceptor, "post_list_violations" ) as post, mock.patch.object( + transports.CloudControlsPartnerMonitoringRestInterceptor, + "post_list_violations_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudControlsPartnerMonitoringRestInterceptor, "pre_list_violations" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = violations.ListViolationsRequest.pb( violations.ListViolationsRequest() ) @@ -2811,6 +2865,7 @@ def test_list_violations_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = violations.ListViolationsResponse() + post_with_metadata.return_value = violations.ListViolationsResponse(), metadata client.list_violations( request, @@ -2822,6 +2877,7 @@ def test_list_violations_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_violation_rest_bad_request(request_type=violations.GetViolationRequest): @@ -2918,10 +2974,14 @@ def test_get_violation_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudControlsPartnerMonitoringRestInterceptor, "post_get_violation" ) as post, mock.patch.object( + transports.CloudControlsPartnerMonitoringRestInterceptor, + "post_get_violation_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudControlsPartnerMonitoringRestInterceptor, "pre_get_violation" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = violations.GetViolationRequest.pb(violations.GetViolationRequest()) transcode.return_value = { "method": "post", @@ -2943,6 +3003,7 @@ def test_get_violation_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = violations.Violation() + post_with_metadata.return_value = violations.Violation(), metadata client.get_violation( request, @@ -2954,6 +3015,7 @@ def test_get_violation_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-commerce-consumer-procurement/google/cloud/commerce_consumer_procurement/gapic_version.py b/packages/google-cloud-commerce-consumer-procurement/google/cloud/commerce_consumer_procurement/gapic_version.py index 4b834789ba9e..558c8aab67c5 100644 --- a/packages/google-cloud-commerce-consumer-procurement/google/cloud/commerce_consumer_procurement/gapic_version.py +++ b/packages/google-cloud-commerce-consumer-procurement/google/cloud/commerce_consumer_procurement/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.1.11" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-commerce-consumer-procurement/google/cloud/commerce_consumer_procurement_v1/gapic_version.py b/packages/google-cloud-commerce-consumer-procurement/google/cloud/commerce_consumer_procurement_v1/gapic_version.py index 4b834789ba9e..558c8aab67c5 100644 --- a/packages/google-cloud-commerce-consumer-procurement/google/cloud/commerce_consumer_procurement_v1/gapic_version.py +++ b/packages/google-cloud-commerce-consumer-procurement/google/cloud/commerce_consumer_procurement_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.1.11" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-commerce-consumer-procurement/google/cloud/commerce_consumer_procurement_v1/services/consumer_procurement_service/client.py b/packages/google-cloud-commerce-consumer-procurement/google/cloud/commerce_consumer_procurement_v1/services/consumer_procurement_service/client.py index 5ade0f639a10..2866eb28b824 100644 --- a/packages/google-cloud-commerce-consumer-procurement/google/cloud/commerce_consumer_procurement_v1/services/consumer_procurement_service/client.py +++ b/packages/google-cloud-commerce-consumer-procurement/google/cloud/commerce_consumer_procurement_v1/services/consumer_procurement_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 @@ -520,6 +522,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. @@ -1372,16 +1401,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-commerce-consumer-procurement/google/cloud/commerce_consumer_procurement_v1/services/consumer_procurement_service/transports/rest.py b/packages/google-cloud-commerce-consumer-procurement/google/cloud/commerce_consumer_procurement_v1/services/consumer_procurement_service/transports/rest.py index f826ffcf49c1..429c901481d9 100644 --- a/packages/google-cloud-commerce-consumer-procurement/google/cloud/commerce_consumer_procurement_v1/services/consumer_procurement_service/transports/rest.py +++ b/packages/google-cloud-commerce-consumer-procurement/google/cloud/commerce_consumer_procurement_v1/services/consumer_procurement_service/transports/rest.py @@ -137,12 +137,35 @@ def post_cancel_order( ) -> operations_pb2.Operation: """Post-rpc interceptor for cancel_order - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_cancel_order_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ConsumerProcurementService server but before - it is returned to user code. + it is returned to user code. This `post_cancel_order` interceptor runs + before the `post_cancel_order_with_metadata` interceptor. """ return response + def post_cancel_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 cancel_order + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ConsumerProcurementService server but before it is returned to user code. + + We recommend only using this `post_cancel_order_with_metadata` + interceptor in new development instead of the `post_cancel_order` interceptor. + When both interceptors are used, this `post_cancel_order_with_metadata` interceptor runs after the + `post_cancel_order` interceptor. The (possibly modified) response returned by + `post_cancel_order` will be passed to + `post_cancel_order_with_metadata`. + """ + return response, metadata + def pre_get_order( self, request: procurement_service.GetOrderRequest, @@ -160,12 +183,33 @@ def pre_get_order( def post_get_order(self, response: order.Order) -> order.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 ConsumerProcurementService 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: order.Order, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[order.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 ConsumerProcurementService 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_list_orders( self, request: procurement_service.ListOrdersRequest, @@ -185,12 +229,37 @@ def post_list_orders( ) -> procurement_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 ConsumerProcurementService 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: procurement_service.ListOrdersResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + procurement_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 ConsumerProcurementService 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_modify_order( self, request: procurement_service.ModifyOrderRequest, @@ -210,12 +279,35 @@ def post_modify_order( ) -> operations_pb2.Operation: """Post-rpc interceptor for modify_order - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_modify_order_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ConsumerProcurementService server but before - it is returned to user code. + it is returned to user code. This `post_modify_order` interceptor runs + before the `post_modify_order_with_metadata` interceptor. """ return response + def post_modify_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 modify_order + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ConsumerProcurementService server but before it is returned to user code. + + We recommend only using this `post_modify_order_with_metadata` + interceptor in new development instead of the `post_modify_order` interceptor. + When both interceptors are used, this `post_modify_order_with_metadata` interceptor runs after the + `post_modify_order` interceptor. The (possibly modified) response returned by + `post_modify_order` will be passed to + `post_modify_order_with_metadata`. + """ + return response, metadata + def pre_place_order( self, request: procurement_service.PlaceOrderRequest, @@ -235,12 +327,35 @@ def post_place_order( ) -> operations_pb2.Operation: """Post-rpc interceptor for place_order - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_place_order_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ConsumerProcurementService server but before - it is returned to user code. + it is returned to user code. This `post_place_order` interceptor runs + before the `post_place_order_with_metadata` interceptor. """ return response + def post_place_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 place_order + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ConsumerProcurementService server but before it is returned to user code. + + We recommend only using this `post_place_order_with_metadata` + interceptor in new development instead of the `post_place_order` interceptor. + When both interceptors are used, this `post_place_order_with_metadata` interceptor runs after the + `post_place_order` interceptor. The (possibly modified) response returned by + `post_place_order` will be passed to + `post_place_order_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -525,6 +640,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_cancel_order(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_cancel_order_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -685,6 +804,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 @@ -831,6 +954,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 @@ -984,6 +1111,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_modify_order(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_modify_order_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1135,6 +1266,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_place_order(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_place_order_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-commerce-consumer-procurement/google/cloud/commerce_consumer_procurement_v1/services/license_management_service/client.py b/packages/google-cloud-commerce-consumer-procurement/google/cloud/commerce_consumer_procurement_v1/services/license_management_service/client.py index d8d488348037..2bcad5dac59a 100644 --- a/packages/google-cloud-commerce-consumer-procurement/google/cloud/commerce_consumer_procurement_v1/services/license_management_service/client.py +++ b/packages/google-cloud-commerce-consumer-procurement/google/cloud/commerce_consumer_procurement_v1/services/license_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 @@ -493,6 +495,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. @@ -1330,16 +1359,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-commerce-consumer-procurement/google/cloud/commerce_consumer_procurement_v1/services/license_management_service/transports/rest.py b/packages/google-cloud-commerce-consumer-procurement/google/cloud/commerce_consumer_procurement_v1/services/license_management_service/transports/rest.py index 28c9b57e26ce..e48c416ba3bb 100644 --- a/packages/google-cloud-commerce-consumer-procurement/google/cloud/commerce_consumer_procurement_v1/services/license_management_service/transports/rest.py +++ b/packages/google-cloud-commerce-consumer-procurement/google/cloud/commerce_consumer_procurement_v1/services/license_management_service/transports/rest.py @@ -137,12 +137,38 @@ def post_assign( ) -> license_management_service.AssignResponse: """Post-rpc interceptor for assign - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_assign_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the LicenseManagementService server but before - it is returned to user code. + it is returned to user code. This `post_assign` interceptor runs + before the `post_assign_with_metadata` interceptor. """ return response + def post_assign_with_metadata( + self, + response: license_management_service.AssignResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + license_management_service.AssignResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for assign + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the LicenseManagementService server but before it is returned to user code. + + We recommend only using this `post_assign_with_metadata` + interceptor in new development instead of the `post_assign` interceptor. + When both interceptors are used, this `post_assign_with_metadata` interceptor runs after the + `post_assign` interceptor. The (possibly modified) response returned by + `post_assign` will be passed to + `post_assign_with_metadata`. + """ + return response, metadata + def pre_enumerate_licensed_users( self, request: license_management_service.EnumerateLicensedUsersRequest, @@ -163,12 +189,38 @@ def post_enumerate_licensed_users( ) -> license_management_service.EnumerateLicensedUsersResponse: """Post-rpc interceptor for enumerate_licensed_users - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_enumerate_licensed_users_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the LicenseManagementService server but before - it is returned to user code. + it is returned to user code. This `post_enumerate_licensed_users` interceptor runs + before the `post_enumerate_licensed_users_with_metadata` interceptor. """ return response + def post_enumerate_licensed_users_with_metadata( + self, + response: license_management_service.EnumerateLicensedUsersResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + license_management_service.EnumerateLicensedUsersResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for enumerate_licensed_users + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the LicenseManagementService server but before it is returned to user code. + + We recommend only using this `post_enumerate_licensed_users_with_metadata` + interceptor in new development instead of the `post_enumerate_licensed_users` interceptor. + When both interceptors are used, this `post_enumerate_licensed_users_with_metadata` interceptor runs after the + `post_enumerate_licensed_users` interceptor. The (possibly modified) response returned by + `post_enumerate_licensed_users` will be passed to + `post_enumerate_licensed_users_with_metadata`. + """ + return response, metadata + def pre_get_license_pool( self, request: license_management_service.GetLicensePoolRequest, @@ -189,12 +241,37 @@ def post_get_license_pool( ) -> license_management_service.LicensePool: """Post-rpc interceptor for get_license_pool - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_license_pool_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the LicenseManagementService server but before - it is returned to user code. + it is returned to user code. This `post_get_license_pool` interceptor runs + before the `post_get_license_pool_with_metadata` interceptor. """ return response + def post_get_license_pool_with_metadata( + self, + response: license_management_service.LicensePool, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + license_management_service.LicensePool, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_license_pool + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the LicenseManagementService server but before it is returned to user code. + + We recommend only using this `post_get_license_pool_with_metadata` + interceptor in new development instead of the `post_get_license_pool` interceptor. + When both interceptors are used, this `post_get_license_pool_with_metadata` interceptor runs after the + `post_get_license_pool` interceptor. The (possibly modified) response returned by + `post_get_license_pool` will be passed to + `post_get_license_pool_with_metadata`. + """ + return response, metadata + def pre_unassign( self, request: license_management_service.UnassignRequest, @@ -215,12 +292,38 @@ def post_unassign( ) -> license_management_service.UnassignResponse: """Post-rpc interceptor for unassign - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_unassign_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the LicenseManagementService server but before - it is returned to user code. + it is returned to user code. This `post_unassign` interceptor runs + before the `post_unassign_with_metadata` interceptor. """ return response + def post_unassign_with_metadata( + self, + response: license_management_service.UnassignResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + license_management_service.UnassignResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for unassign + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the LicenseManagementService server but before it is returned to user code. + + We recommend only using this `post_unassign_with_metadata` + interceptor in new development instead of the `post_unassign` interceptor. + When both interceptors are used, this `post_unassign_with_metadata` interceptor runs after the + `post_unassign` interceptor. The (possibly modified) response returned by + `post_unassign` will be passed to + `post_unassign_with_metadata`. + """ + return response, metadata + def pre_update_license_pool( self, request: license_management_service.UpdateLicensePoolRequest, @@ -241,12 +344,37 @@ def post_update_license_pool( ) -> license_management_service.LicensePool: """Post-rpc interceptor for update_license_pool - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_license_pool_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the LicenseManagementService server but before - it is returned to user code. + it is returned to user code. This `post_update_license_pool` interceptor runs + before the `post_update_license_pool_with_metadata` interceptor. """ return response + def post_update_license_pool_with_metadata( + self, + response: license_management_service.LicensePool, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + license_management_service.LicensePool, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for update_license_pool + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the LicenseManagementService server but before it is returned to user code. + + We recommend only using this `post_update_license_pool_with_metadata` + interceptor in new development instead of the `post_update_license_pool` interceptor. + When both interceptors are used, this `post_update_license_pool_with_metadata` interceptor runs after the + `post_update_license_pool` interceptor. The (possibly modified) response returned by + `post_update_license_pool` will be passed to + `post_update_license_pool_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -486,6 +614,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_assign(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_assign_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -634,6 +766,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_enumerate_licensed_users(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_enumerate_licensed_users_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -784,6 +920,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_license_pool(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_license_pool_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -936,6 +1076,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_unassign(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_unassign_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1092,6 +1236,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_license_pool(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_license_pool_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-commerce-consumer-procurement/google/cloud/commerce_consumer_procurement_v1alpha1/gapic_version.py b/packages/google-cloud-commerce-consumer-procurement/google/cloud/commerce_consumer_procurement_v1alpha1/gapic_version.py index 4b834789ba9e..558c8aab67c5 100644 --- a/packages/google-cloud-commerce-consumer-procurement/google/cloud/commerce_consumer_procurement_v1alpha1/gapic_version.py +++ b/packages/google-cloud-commerce-consumer-procurement/google/cloud/commerce_consumer_procurement_v1alpha1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.1.11" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-commerce-consumer-procurement/google/cloud/commerce_consumer_procurement_v1alpha1/services/consumer_procurement_service/client.py b/packages/google-cloud-commerce-consumer-procurement/google/cloud/commerce_consumer_procurement_v1alpha1/services/consumer_procurement_service/client.py index 863d914b359d..c2707e33ddac 100644 --- a/packages/google-cloud-commerce-consumer-procurement/google/cloud/commerce_consumer_procurement_v1alpha1/services/consumer_procurement_service/client.py +++ b/packages/google-cloud-commerce-consumer-procurement/google/cloud/commerce_consumer_procurement_v1alpha1/services/consumer_procurement_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 @@ -520,6 +522,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. @@ -1148,16 +1177,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-commerce-consumer-procurement/google/cloud/commerce_consumer_procurement_v1alpha1/services/consumer_procurement_service/transports/rest.py b/packages/google-cloud-commerce-consumer-procurement/google/cloud/commerce_consumer_procurement_v1alpha1/services/consumer_procurement_service/transports/rest.py index 8ba9f7686121..804ef46f0bb1 100644 --- a/packages/google-cloud-commerce-consumer-procurement/google/cloud/commerce_consumer_procurement_v1alpha1/services/consumer_procurement_service/transports/rest.py +++ b/packages/google-cloud-commerce-consumer-procurement/google/cloud/commerce_consumer_procurement_v1alpha1/services/consumer_procurement_service/transports/rest.py @@ -119,12 +119,33 @@ def pre_get_order( def post_get_order(self, response: order.Order) -> order.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 ConsumerProcurementService 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: order.Order, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[order.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 ConsumerProcurementService 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_list_orders( self, request: procurement_service.ListOrdersRequest, @@ -144,12 +165,37 @@ def post_list_orders( ) -> procurement_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 ConsumerProcurementService 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: procurement_service.ListOrdersResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + procurement_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 ConsumerProcurementService 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_place_order( self, request: procurement_service.PlaceOrderRequest, @@ -169,12 +215,35 @@ def post_place_order( ) -> operations_pb2.Operation: """Post-rpc interceptor for place_order - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_place_order_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ConsumerProcurementService server but before - it is returned to user code. + it is returned to user code. This `post_place_order` interceptor runs + before the `post_place_order_with_metadata` interceptor. """ return response + def post_place_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 place_order + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ConsumerProcurementService server but before it is returned to user code. + + We recommend only using this `post_place_order_with_metadata` + interceptor in new development instead of the `post_place_order` interceptor. + When both interceptors are used, this `post_place_order_with_metadata` interceptor runs after the + `post_place_order` interceptor. The (possibly modified) response returned by + `post_place_order` will be passed to + `post_place_order_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -472,6 +541,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 @@ -618,6 +691,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 @@ -771,6 +848,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_place_order(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_place_order_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-commerce-consumer-procurement/samples/generated_samples/snippet_metadata_google.cloud.commerce.consumer.procurement.v1.json b/packages/google-cloud-commerce-consumer-procurement/samples/generated_samples/snippet_metadata_google.cloud.commerce.consumer.procurement.v1.json index 152d2dbcbb25..969c021010bd 100644 --- a/packages/google-cloud-commerce-consumer-procurement/samples/generated_samples/snippet_metadata_google.cloud.commerce.consumer.procurement.v1.json +++ b/packages/google-cloud-commerce-consumer-procurement/samples/generated_samples/snippet_metadata_google.cloud.commerce.consumer.procurement.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-commerce-consumer-procurement", - "version": "0.1.11" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-commerce-consumer-procurement/samples/generated_samples/snippet_metadata_google.cloud.commerce.consumer.procurement.v1alpha1.json b/packages/google-cloud-commerce-consumer-procurement/samples/generated_samples/snippet_metadata_google.cloud.commerce.consumer.procurement.v1alpha1.json index c82e7b22d7ee..5d6b7cc97a9a 100644 --- a/packages/google-cloud-commerce-consumer-procurement/samples/generated_samples/snippet_metadata_google.cloud.commerce.consumer.procurement.v1alpha1.json +++ b/packages/google-cloud-commerce-consumer-procurement/samples/generated_samples/snippet_metadata_google.cloud.commerce.consumer.procurement.v1alpha1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-commerce-consumer-procurement", - "version": "0.1.11" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-commerce-consumer-procurement/tests/unit/gapic/commerce_consumer_procurement_v1/test_consumer_procurement_service.py b/packages/google-cloud-commerce-consumer-procurement/tests/unit/gapic/commerce_consumer_procurement_v1/test_consumer_procurement_service.py index 181fa80f615b..9b84638e05cd 100644 --- a/packages/google-cloud-commerce-consumer-procurement/tests/unit/gapic/commerce_consumer_procurement_v1/test_consumer_procurement_service.py +++ b/packages/google-cloud-commerce-consumer-procurement/tests/unit/gapic/commerce_consumer_procurement_v1/test_consumer_procurement_service.py @@ -74,6 +74,13 @@ procurement_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 @@ -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 = ConsumerProcurementServiceClient(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 = ConsumerProcurementServiceClient(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", [ @@ -3992,10 +4042,14 @@ def test_place_order_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ConsumerProcurementServiceRestInterceptor, "post_place_order" ) as post, mock.patch.object( + transports.ConsumerProcurementServiceRestInterceptor, + "post_place_order_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ConsumerProcurementServiceRestInterceptor, "pre_place_order" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = procurement_service.PlaceOrderRequest.pb( procurement_service.PlaceOrderRequest() ) @@ -4019,6 +4073,7 @@ def test_place_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.place_order( request, @@ -4030,6 +4085,7 @@ def test_place_order_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=procurement_service.GetOrderRequest): @@ -4116,10 +4172,14 @@ def test_get_order_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ConsumerProcurementServiceRestInterceptor, "post_get_order" ) as post, mock.patch.object( + transports.ConsumerProcurementServiceRestInterceptor, + "post_get_order_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ConsumerProcurementServiceRestInterceptor, "pre_get_order" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = procurement_service.GetOrderRequest.pb( procurement_service.GetOrderRequest() ) @@ -4143,6 +4203,7 @@ def test_get_order_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = order.Order() + post_with_metadata.return_value = order.Order(), metadata client.get_order( request, @@ -4154,6 +4215,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_list_orders_rest_bad_request( @@ -4238,10 +4300,14 @@ def test_list_orders_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ConsumerProcurementServiceRestInterceptor, "post_list_orders" ) as post, mock.patch.object( + transports.ConsumerProcurementServiceRestInterceptor, + "post_list_orders_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ConsumerProcurementServiceRestInterceptor, "pre_list_orders" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = procurement_service.ListOrdersRequest.pb( procurement_service.ListOrdersRequest() ) @@ -4267,6 +4333,10 @@ def test_list_orders_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = procurement_service.ListOrdersResponse() + post_with_metadata.return_value = ( + procurement_service.ListOrdersResponse(), + metadata, + ) client.list_orders( request, @@ -4278,6 +4348,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_modify_order_rest_bad_request( @@ -4358,10 +4429,14 @@ def test_modify_order_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ConsumerProcurementServiceRestInterceptor, "post_modify_order" ) as post, mock.patch.object( + transports.ConsumerProcurementServiceRestInterceptor, + "post_modify_order_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ConsumerProcurementServiceRestInterceptor, "pre_modify_order" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = procurement_service.ModifyOrderRequest.pb( procurement_service.ModifyOrderRequest() ) @@ -4385,6 +4460,7 @@ def test_modify_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.modify_order( request, @@ -4396,6 +4472,7 @@ def test_modify_order_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_cancel_order_rest_bad_request( @@ -4476,10 +4553,14 @@ def test_cancel_order_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ConsumerProcurementServiceRestInterceptor, "post_cancel_order" ) as post, mock.patch.object( + transports.ConsumerProcurementServiceRestInterceptor, + "post_cancel_order_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ConsumerProcurementServiceRestInterceptor, "pre_cancel_order" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = procurement_service.CancelOrderRequest.pb( procurement_service.CancelOrderRequest() ) @@ -4503,6 +4584,7 @@ def test_cancel_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.cancel_order( request, @@ -4514,6 +4596,7 @@ def test_cancel_order_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-commerce-consumer-procurement/tests/unit/gapic/commerce_consumer_procurement_v1/test_license_management_service.py b/packages/google-cloud-commerce-consumer-procurement/tests/unit/gapic/commerce_consumer_procurement_v1/test_license_management_service.py index 5bad798cbb10..8b1317603f8f 100644 --- a/packages/google-cloud-commerce-consumer-procurement/tests/unit/gapic/commerce_consumer_procurement_v1/test_license_management_service.py +++ b/packages/google-cloud-commerce-consumer-procurement/tests/unit/gapic/commerce_consumer_procurement_v1/test_license_management_service.py @@ -65,6 +65,13 @@ license_management_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 @@ -340,6 +347,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 = LicenseManagementServiceClient(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 = LicenseManagementServiceClient(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", [ @@ -4527,10 +4577,14 @@ def test_get_license_pool_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.LicenseManagementServiceRestInterceptor, "post_get_license_pool" ) as post, mock.patch.object( + transports.LicenseManagementServiceRestInterceptor, + "post_get_license_pool_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.LicenseManagementServiceRestInterceptor, "pre_get_license_pool" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = license_management_service.GetLicensePoolRequest.pb( license_management_service.GetLicensePoolRequest() ) @@ -4556,6 +4610,10 @@ def test_get_license_pool_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = license_management_service.LicensePool() + post_with_metadata.return_value = ( + license_management_service.LicensePool(), + metadata, + ) client.get_license_pool( request, @@ -4567,6 +4625,7 @@ def test_get_license_pool_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_license_pool_rest_bad_request( @@ -4743,10 +4802,14 @@ def test_update_license_pool_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.LicenseManagementServiceRestInterceptor, "post_update_license_pool" ) as post, mock.patch.object( + transports.LicenseManagementServiceRestInterceptor, + "post_update_license_pool_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.LicenseManagementServiceRestInterceptor, "pre_update_license_pool" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = license_management_service.UpdateLicensePoolRequest.pb( license_management_service.UpdateLicensePoolRequest() ) @@ -4772,6 +4835,10 @@ def test_update_license_pool_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = license_management_service.LicensePool() + post_with_metadata.return_value = ( + license_management_service.LicensePool(), + metadata, + ) client.update_license_pool( request, @@ -4783,6 +4850,7 @@ def test_update_license_pool_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_assign_rest_bad_request(request_type=license_management_service.AssignRequest): @@ -4862,10 +4930,13 @@ def test_assign_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.LicenseManagementServiceRestInterceptor, "post_assign" ) as post, mock.patch.object( + transports.LicenseManagementServiceRestInterceptor, "post_assign_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.LicenseManagementServiceRestInterceptor, "pre_assign" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = license_management_service.AssignRequest.pb( license_management_service.AssignRequest() ) @@ -4891,6 +4962,10 @@ def test_assign_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = license_management_service.AssignResponse() + post_with_metadata.return_value = ( + license_management_service.AssignResponse(), + metadata, + ) client.assign( request, @@ -4902,6 +4977,7 @@ def test_assign_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_unassign_rest_bad_request( @@ -4983,10 +5059,14 @@ def test_unassign_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.LicenseManagementServiceRestInterceptor, "post_unassign" ) as post, mock.patch.object( + transports.LicenseManagementServiceRestInterceptor, + "post_unassign_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.LicenseManagementServiceRestInterceptor, "pre_unassign" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = license_management_service.UnassignRequest.pb( license_management_service.UnassignRequest() ) @@ -5012,6 +5092,10 @@ def test_unassign_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = license_management_service.UnassignResponse() + post_with_metadata.return_value = ( + license_management_service.UnassignResponse(), + metadata, + ) client.unassign( request, @@ -5023,6 +5107,7 @@ def test_unassign_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_enumerate_licensed_users_rest_bad_request( @@ -5110,11 +5195,15 @@ def test_enumerate_licensed_users_rest_interceptors(null_interceptor): transports.LicenseManagementServiceRestInterceptor, "post_enumerate_licensed_users", ) as post, mock.patch.object( + transports.LicenseManagementServiceRestInterceptor, + "post_enumerate_licensed_users_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.LicenseManagementServiceRestInterceptor, "pre_enumerate_licensed_users", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = license_management_service.EnumerateLicensedUsersRequest.pb( license_management_service.EnumerateLicensedUsersRequest() ) @@ -5142,6 +5231,10 @@ def test_enumerate_licensed_users_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = license_management_service.EnumerateLicensedUsersResponse() + post_with_metadata.return_value = ( + license_management_service.EnumerateLicensedUsersResponse(), + metadata, + ) client.enumerate_licensed_users( request, @@ -5153,6 +5246,7 @@ def test_enumerate_licensed_users_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-commerce-consumer-procurement/tests/unit/gapic/commerce_consumer_procurement_v1alpha1/test_consumer_procurement_service.py b/packages/google-cloud-commerce-consumer-procurement/tests/unit/gapic/commerce_consumer_procurement_v1alpha1/test_consumer_procurement_service.py index 67024ddb75bb..809182f6d058 100644 --- a/packages/google-cloud-commerce-consumer-procurement/tests/unit/gapic/commerce_consumer_procurement_v1alpha1/test_consumer_procurement_service.py +++ b/packages/google-cloud-commerce-consumer-procurement/tests/unit/gapic/commerce_consumer_procurement_v1alpha1/test_consumer_procurement_service.py @@ -74,6 +74,13 @@ procurement_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 @@ -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 = ConsumerProcurementServiceClient(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 = ConsumerProcurementServiceClient(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", [ @@ -3162,10 +3212,14 @@ def test_place_order_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ConsumerProcurementServiceRestInterceptor, "post_place_order" ) as post, mock.patch.object( + transports.ConsumerProcurementServiceRestInterceptor, + "post_place_order_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ConsumerProcurementServiceRestInterceptor, "pre_place_order" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = procurement_service.PlaceOrderRequest.pb( procurement_service.PlaceOrderRequest() ) @@ -3189,6 +3243,7 @@ def test_place_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.place_order( request, @@ -3200,6 +3255,7 @@ def test_place_order_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=procurement_service.GetOrderRequest): @@ -3286,10 +3342,14 @@ def test_get_order_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ConsumerProcurementServiceRestInterceptor, "post_get_order" ) as post, mock.patch.object( + transports.ConsumerProcurementServiceRestInterceptor, + "post_get_order_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ConsumerProcurementServiceRestInterceptor, "pre_get_order" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = procurement_service.GetOrderRequest.pb( procurement_service.GetOrderRequest() ) @@ -3313,6 +3373,7 @@ def test_get_order_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = order.Order() + post_with_metadata.return_value = order.Order(), metadata client.get_order( request, @@ -3324,6 +3385,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_list_orders_rest_bad_request( @@ -3408,10 +3470,14 @@ def test_list_orders_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ConsumerProcurementServiceRestInterceptor, "post_list_orders" ) as post, mock.patch.object( + transports.ConsumerProcurementServiceRestInterceptor, + "post_list_orders_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ConsumerProcurementServiceRestInterceptor, "pre_list_orders" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = procurement_service.ListOrdersRequest.pb( procurement_service.ListOrdersRequest() ) @@ -3437,6 +3503,10 @@ def test_list_orders_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = procurement_service.ListOrdersResponse() + post_with_metadata.return_value = ( + procurement_service.ListOrdersResponse(), + metadata, + ) client.list_orders( request, @@ -3448,6 +3518,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_operation_rest_bad_request( diff --git a/packages/google-cloud-common/google/cloud/common/gapic_version.py b/packages/google-cloud-common/google/cloud/common/gapic_version.py index 4660de83cb4b..558c8aab67c5 100644 --- a/packages/google-cloud-common/google/cloud/common/gapic_version.py +++ b/packages/google-cloud-common/google/cloud/common/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.4.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-confidentialcomputing/google/cloud/confidentialcomputing/gapic_version.py b/packages/google-cloud-confidentialcomputing/google/cloud/confidentialcomputing/gapic_version.py index 3106ac663ac7..558c8aab67c5 100644 --- a/packages/google-cloud-confidentialcomputing/google/cloud/confidentialcomputing/gapic_version.py +++ b/packages/google-cloud-confidentialcomputing/google/cloud/confidentialcomputing/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.4.14" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-confidentialcomputing/google/cloud/confidentialcomputing_v1/gapic_version.py b/packages/google-cloud-confidentialcomputing/google/cloud/confidentialcomputing_v1/gapic_version.py index 3106ac663ac7..558c8aab67c5 100644 --- a/packages/google-cloud-confidentialcomputing/google/cloud/confidentialcomputing_v1/gapic_version.py +++ b/packages/google-cloud-confidentialcomputing/google/cloud/confidentialcomputing_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.4.14" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-confidentialcomputing/google/cloud/confidentialcomputing_v1/services/confidential_computing/client.py b/packages/google-cloud-confidentialcomputing/google/cloud/confidentialcomputing_v1/services/confidential_computing/client.py index 387ad0647e12..996ca1880e99 100644 --- a/packages/google-cloud-confidentialcomputing/google/cloud/confidentialcomputing_v1/services/confidential_computing/client.py +++ b/packages/google-cloud-confidentialcomputing/google/cloud/confidentialcomputing_v1/services/confidential_computing/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. @@ -955,16 +984,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, @@ -1010,16 +1043,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-confidentialcomputing/google/cloud/confidentialcomputing_v1/services/confidential_computing/transports/rest.py b/packages/google-cloud-confidentialcomputing/google/cloud/confidentialcomputing_v1/services/confidential_computing/transports/rest.py index 184ccec17a70..981ba01438d4 100644 --- a/packages/google-cloud-confidentialcomputing/google/cloud/confidentialcomputing_v1/services/confidential_computing/transports/rest.py +++ b/packages/google-cloud-confidentialcomputing/google/cloud/confidentialcomputing_v1/services/confidential_computing/transports/rest.py @@ -106,12 +106,35 @@ def pre_create_challenge( def post_create_challenge(self, response: service.Challenge) -> service.Challenge: """Post-rpc interceptor for create_challenge - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_challenge_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ConfidentialComputing server but before - it is returned to user code. + it is returned to user code. This `post_create_challenge` interceptor runs + before the `post_create_challenge_with_metadata` interceptor. """ return response + def post_create_challenge_with_metadata( + self, + response: service.Challenge, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.Challenge, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_challenge + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ConfidentialComputing server but before it is returned to user code. + + We recommend only using this `post_create_challenge_with_metadata` + interceptor in new development instead of the `post_create_challenge` interceptor. + When both interceptors are used, this `post_create_challenge_with_metadata` interceptor runs after the + `post_create_challenge` interceptor. The (possibly modified) response returned by + `post_create_challenge` will be passed to + `post_create_challenge_with_metadata`. + """ + return response, metadata + def pre_verify_attestation( self, request: service.VerifyAttestationRequest, @@ -131,12 +154,37 @@ def post_verify_attestation( ) -> service.VerifyAttestationResponse: """Post-rpc interceptor for verify_attestation - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_verify_attestation_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ConfidentialComputing server but before - it is returned to user code. + it is returned to user code. This `post_verify_attestation` interceptor runs + before the `post_verify_attestation_with_metadata` interceptor. """ return response + def post_verify_attestation_with_metadata( + self, + response: service.VerifyAttestationResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service.VerifyAttestationResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for verify_attestation + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ConfidentialComputing server but before it is returned to user code. + + We recommend only using this `post_verify_attestation_with_metadata` + interceptor in new development instead of the `post_verify_attestation` interceptor. + When both interceptors are used, this `post_verify_attestation_with_metadata` interceptor runs after the + `post_verify_attestation` interceptor. The (possibly modified) response returned by + `post_verify_attestation` will be passed to + `post_verify_attestation_with_metadata`. + """ + return response, metadata + def pre_get_location( self, request: locations_pb2.GetLocationRequest, @@ -404,6 +452,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_challenge(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_challenge_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -561,6 +613,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_verify_attestation(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_verify_attestation_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-confidentialcomputing/samples/generated_samples/snippet_metadata_google.cloud.confidentialcomputing.v1.json b/packages/google-cloud-confidentialcomputing/samples/generated_samples/snippet_metadata_google.cloud.confidentialcomputing.v1.json index b6e7be855de2..09c4ea010a47 100644 --- a/packages/google-cloud-confidentialcomputing/samples/generated_samples/snippet_metadata_google.cloud.confidentialcomputing.v1.json +++ b/packages/google-cloud-confidentialcomputing/samples/generated_samples/snippet_metadata_google.cloud.confidentialcomputing.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-confidentialcomputing", - "version": "0.4.14" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-confidentialcomputing/tests/unit/gapic/confidentialcomputing_v1/test_confidential_computing.py b/packages/google-cloud-confidentialcomputing/tests/unit/gapic/confidentialcomputing_v1/test_confidential_computing.py index 5b21b4407e06..3c51a1f0314b 100644 --- a/packages/google-cloud-confidentialcomputing/tests/unit/gapic/confidentialcomputing_v1/test_confidential_computing.py +++ b/packages/google-cloud-confidentialcomputing/tests/unit/gapic/confidentialcomputing_v1/test_confidential_computing.py @@ -62,6 +62,13 @@ ) from google.cloud.confidentialcomputing_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 @@ -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 = ConfidentialComputingClient(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 = ConfidentialComputingClient(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", [ @@ -2428,10 +2478,14 @@ def test_create_challenge_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ConfidentialComputingRestInterceptor, "post_create_challenge" ) as post, mock.patch.object( + transports.ConfidentialComputingRestInterceptor, + "post_create_challenge_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ConfidentialComputingRestInterceptor, "pre_create_challenge" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateChallengeRequest.pb(service.CreateChallengeRequest()) transcode.return_value = { "method": "post", @@ -2453,6 +2507,7 @@ def test_create_challenge_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.Challenge() + post_with_metadata.return_value = service.Challenge(), metadata client.create_challenge( request, @@ -2464,6 +2519,7 @@ def test_create_challenge_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_verify_attestation_rest_bad_request( @@ -2552,10 +2608,14 @@ def test_verify_attestation_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ConfidentialComputingRestInterceptor, "post_verify_attestation" ) as post, mock.patch.object( + transports.ConfidentialComputingRestInterceptor, + "post_verify_attestation_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ConfidentialComputingRestInterceptor, "pre_verify_attestation" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.VerifyAttestationRequest.pb( service.VerifyAttestationRequest() ) @@ -2581,6 +2641,7 @@ def test_verify_attestation_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.VerifyAttestationResponse() + post_with_metadata.return_value = service.VerifyAttestationResponse(), metadata client.verify_attestation( request, @@ -2592,6 +2653,7 @@ def test_verify_attestation_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-config/google/cloud/config/gapic_version.py b/packages/google-cloud-config/google/cloud/config/gapic_version.py index 7a4d810a47da..558c8aab67c5 100644 --- a/packages/google-cloud-config/google/cloud/config/gapic_version.py +++ b/packages/google-cloud-config/google/cloud/config/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.1.14" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-config/google/cloud/config_v1/gapic_version.py b/packages/google-cloud-config/google/cloud/config_v1/gapic_version.py index 7a4d810a47da..558c8aab67c5 100644 --- a/packages/google-cloud-config/google/cloud/config_v1/gapic_version.py +++ b/packages/google-cloud-config/google/cloud/config_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.1.14" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-config/google/cloud/config_v1/services/config/client.py b/packages/google-cloud-config/google/cloud/config_v1/services/config/client.py index faa3c74eea47..5c73b07e4991 100644 --- a/packages/google-cloud-config/google/cloud/config_v1/services/config/client.py +++ b/packages/google-cloud-config/google/cloud/config_v1/services/config/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 @@ -635,6 +637,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. @@ -3514,16 +3543,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, @@ -3569,16 +3602,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, @@ -3801,16 +3838,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, @@ -3923,16 +3964,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, @@ -3983,16 +4028,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, @@ -4038,16 +4087,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, @@ -4093,16 +4146,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-config/google/cloud/config_v1/services/config/transports/rest.py b/packages/google-cloud-config/google/cloud/config_v1/services/config/transports/rest.py index ee4e755ffdde..83acdb1d3108 100644 --- a/packages/google-cloud-config/google/cloud/config_v1/services/config/transports/rest.py +++ b/packages/google-cloud-config/google/cloud/config_v1/services/config/transports/rest.py @@ -276,12 +276,35 @@ def post_create_deployment( ) -> operations_pb2.Operation: """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 Config 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: 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_deployment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Config 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_create_preview( self, request: config.CreatePreviewRequest, @@ -299,12 +322,35 @@ def post_create_preview( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_preview - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_preview_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Config server but before - it is returned to user code. + it is returned to user code. This `post_create_preview` interceptor runs + before the `post_create_preview_with_metadata` interceptor. """ return response + def post_create_preview_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_preview + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Config server but before it is returned to user code. + + We recommend only using this `post_create_preview_with_metadata` + interceptor in new development instead of the `post_create_preview` interceptor. + When both interceptors are used, this `post_create_preview_with_metadata` interceptor runs after the + `post_create_preview` interceptor. The (possibly modified) response returned by + `post_create_preview` will be passed to + `post_create_preview_with_metadata`. + """ + return response, metadata + def pre_delete_deployment( self, request: config.DeleteDeploymentRequest, @@ -322,12 +368,35 @@ def post_delete_deployment( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_deployment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_deployment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Config server but before - it is returned to user code. + it is returned to user code. This `post_delete_deployment` interceptor runs + before the `post_delete_deployment_with_metadata` interceptor. """ return response + def post_delete_deployment_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_deployment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Config server but before it is returned to user code. + + We recommend only using this `post_delete_deployment_with_metadata` + interceptor in new development instead of the `post_delete_deployment` interceptor. + When both interceptors are used, this `post_delete_deployment_with_metadata` interceptor runs after the + `post_delete_deployment` interceptor. The (possibly modified) response returned by + `post_delete_deployment` will be passed to + `post_delete_deployment_with_metadata`. + """ + return response, metadata + def pre_delete_preview( self, request: config.DeletePreviewRequest, @@ -345,12 +414,35 @@ def post_delete_preview( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_preview - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_preview_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Config server but before - it is returned to user code. + it is returned to user code. This `post_delete_preview` interceptor runs + before the `post_delete_preview_with_metadata` interceptor. """ return response + def post_delete_preview_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_preview + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Config server but before it is returned to user code. + + We recommend only using this `post_delete_preview_with_metadata` + interceptor in new development instead of the `post_delete_preview` interceptor. + When both interceptors are used, this `post_delete_preview_with_metadata` interceptor runs after the + `post_delete_preview` interceptor. The (possibly modified) response returned by + `post_delete_preview` will be passed to + `post_delete_preview_with_metadata`. + """ + return response, metadata + def pre_delete_statefile( self, request: config.DeleteStatefileRequest, @@ -382,12 +474,35 @@ def post_export_deployment_statefile( ) -> config.Statefile: """Post-rpc interceptor for export_deployment_statefile - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_export_deployment_statefile_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Config server but before - it is returned to user code. + it is returned to user code. This `post_export_deployment_statefile` interceptor runs + before the `post_export_deployment_statefile_with_metadata` interceptor. """ return response + def post_export_deployment_statefile_with_metadata( + self, + response: config.Statefile, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[config.Statefile, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for export_deployment_statefile + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Config server but before it is returned to user code. + + We recommend only using this `post_export_deployment_statefile_with_metadata` + interceptor in new development instead of the `post_export_deployment_statefile` interceptor. + When both interceptors are used, this `post_export_deployment_statefile_with_metadata` interceptor runs after the + `post_export_deployment_statefile` interceptor. The (possibly modified) response returned by + `post_export_deployment_statefile` will be passed to + `post_export_deployment_statefile_with_metadata`. + """ + return response, metadata + def pre_export_lock_info( self, request: config.ExportLockInfoRequest, @@ -403,12 +518,35 @@ def pre_export_lock_info( def post_export_lock_info(self, response: config.LockInfo) -> config.LockInfo: """Post-rpc interceptor for export_lock_info - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_export_lock_info_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Config server but before - it is returned to user code. + it is returned to user code. This `post_export_lock_info` interceptor runs + before the `post_export_lock_info_with_metadata` interceptor. """ return response + def post_export_lock_info_with_metadata( + self, + response: config.LockInfo, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[config.LockInfo, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for export_lock_info + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Config server but before it is returned to user code. + + We recommend only using this `post_export_lock_info_with_metadata` + interceptor in new development instead of the `post_export_lock_info` interceptor. + When both interceptors are used, this `post_export_lock_info_with_metadata` interceptor runs after the + `post_export_lock_info` interceptor. The (possibly modified) response returned by + `post_export_lock_info` will be passed to + `post_export_lock_info_with_metadata`. + """ + return response, metadata + def pre_export_preview_result( self, request: config.ExportPreviewResultRequest, @@ -428,12 +566,37 @@ def post_export_preview_result( ) -> config.ExportPreviewResultResponse: """Post-rpc interceptor for export_preview_result - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_export_preview_result_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Config server but before - it is returned to user code. + it is returned to user code. This `post_export_preview_result` interceptor runs + before the `post_export_preview_result_with_metadata` interceptor. """ return response + def post_export_preview_result_with_metadata( + self, + response: config.ExportPreviewResultResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + config.ExportPreviewResultResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for export_preview_result + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Config server but before it is returned to user code. + + We recommend only using this `post_export_preview_result_with_metadata` + interceptor in new development instead of the `post_export_preview_result` interceptor. + When both interceptors are used, this `post_export_preview_result_with_metadata` interceptor runs after the + `post_export_preview_result` interceptor. The (possibly modified) response returned by + `post_export_preview_result` will be passed to + `post_export_preview_result_with_metadata`. + """ + return response, metadata + def pre_export_revision_statefile( self, request: config.ExportRevisionStatefileRequest, @@ -453,12 +616,35 @@ def post_export_revision_statefile( ) -> config.Statefile: """Post-rpc interceptor for export_revision_statefile - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_export_revision_statefile_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Config server but before - it is returned to user code. + it is returned to user code. This `post_export_revision_statefile` interceptor runs + before the `post_export_revision_statefile_with_metadata` interceptor. """ return response + def post_export_revision_statefile_with_metadata( + self, + response: config.Statefile, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[config.Statefile, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for export_revision_statefile + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Config server but before it is returned to user code. + + We recommend only using this `post_export_revision_statefile_with_metadata` + interceptor in new development instead of the `post_export_revision_statefile` interceptor. + When both interceptors are used, this `post_export_revision_statefile_with_metadata` interceptor runs after the + `post_export_revision_statefile` interceptor. The (possibly modified) response returned by + `post_export_revision_statefile` will be passed to + `post_export_revision_statefile_with_metadata`. + """ + return response, metadata + def pre_get_deployment( self, request: config.GetDeploymentRequest, @@ -474,12 +660,35 @@ def pre_get_deployment( def post_get_deployment(self, response: config.Deployment) -> config.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 Config 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: config.Deployment, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[config.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 Config 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_preview( self, request: config.GetPreviewRequest, @@ -495,12 +704,35 @@ def pre_get_preview( def post_get_preview(self, response: config.Preview) -> config.Preview: """Post-rpc interceptor for get_preview - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_preview_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Config server but before - it is returned to user code. + it is returned to user code. This `post_get_preview` interceptor runs + before the `post_get_preview_with_metadata` interceptor. """ return response + def post_get_preview_with_metadata( + self, + response: config.Preview, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[config.Preview, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_preview + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Config server but before it is returned to user code. + + We recommend only using this `post_get_preview_with_metadata` + interceptor in new development instead of the `post_get_preview` interceptor. + When both interceptors are used, this `post_get_preview_with_metadata` interceptor runs after the + `post_get_preview` interceptor. The (possibly modified) response returned by + `post_get_preview` will be passed to + `post_get_preview_with_metadata`. + """ + return response, metadata + def pre_get_resource( self, request: config.GetResourceRequest, @@ -516,12 +748,35 @@ def pre_get_resource( def post_get_resource(self, response: config.Resource) -> config.Resource: """Post-rpc interceptor for get_resource - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_resource_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Config server but before - it is returned to user code. + it is returned to user code. This `post_get_resource` interceptor runs + before the `post_get_resource_with_metadata` interceptor. """ return response + def post_get_resource_with_metadata( + self, + response: config.Resource, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[config.Resource, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_resource + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Config server but before it is returned to user code. + + We recommend only using this `post_get_resource_with_metadata` + interceptor in new development instead of the `post_get_resource` interceptor. + When both interceptors are used, this `post_get_resource_with_metadata` interceptor runs after the + `post_get_resource` interceptor. The (possibly modified) response returned by + `post_get_resource` will be passed to + `post_get_resource_with_metadata`. + """ + return response, metadata + def pre_get_revision( self, request: config.GetRevisionRequest, @@ -537,12 +792,35 @@ def pre_get_revision( def post_get_revision(self, response: config.Revision) -> config.Revision: """Post-rpc interceptor for get_revision - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_revision_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Config server but before - it is returned to user code. + it is returned to user code. This `post_get_revision` interceptor runs + before the `post_get_revision_with_metadata` interceptor. """ return response + def post_get_revision_with_metadata( + self, + response: config.Revision, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[config.Revision, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_revision + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Config server but before it is returned to user code. + + We recommend only using this `post_get_revision_with_metadata` + interceptor in new development instead of the `post_get_revision` interceptor. + When both interceptors are used, this `post_get_revision_with_metadata` interceptor runs after the + `post_get_revision` interceptor. The (possibly modified) response returned by + `post_get_revision` will be passed to + `post_get_revision_with_metadata`. + """ + return response, metadata + def pre_get_terraform_version( self, request: config.GetTerraformVersionRequest, @@ -562,12 +840,35 @@ def post_get_terraform_version( ) -> config.TerraformVersion: """Post-rpc interceptor for get_terraform_version - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_terraform_version_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Config server but before - it is returned to user code. + it is returned to user code. This `post_get_terraform_version` interceptor runs + before the `post_get_terraform_version_with_metadata` interceptor. """ return response + def post_get_terraform_version_with_metadata( + self, + response: config.TerraformVersion, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[config.TerraformVersion, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_terraform_version + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Config server but before it is returned to user code. + + We recommend only using this `post_get_terraform_version_with_metadata` + interceptor in new development instead of the `post_get_terraform_version` interceptor. + When both interceptors are used, this `post_get_terraform_version_with_metadata` interceptor runs after the + `post_get_terraform_version` interceptor. The (possibly modified) response returned by + `post_get_terraform_version` will be passed to + `post_get_terraform_version_with_metadata`. + """ + return response, metadata + def pre_import_statefile( self, request: config.ImportStatefileRequest, @@ -583,12 +884,35 @@ def pre_import_statefile( def post_import_statefile(self, response: config.Statefile) -> config.Statefile: """Post-rpc interceptor for import_statefile - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_import_statefile_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Config server but before - it is returned to user code. + it is returned to user code. This `post_import_statefile` interceptor runs + before the `post_import_statefile_with_metadata` interceptor. """ return response + def post_import_statefile_with_metadata( + self, + response: config.Statefile, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[config.Statefile, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for import_statefile + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Config server but before it is returned to user code. + + We recommend only using this `post_import_statefile_with_metadata` + interceptor in new development instead of the `post_import_statefile` interceptor. + When both interceptors are used, this `post_import_statefile_with_metadata` interceptor runs after the + `post_import_statefile` interceptor. The (possibly modified) response returned by + `post_import_statefile` will be passed to + `post_import_statefile_with_metadata`. + """ + return response, metadata + def pre_list_deployments( self, request: config.ListDeploymentsRequest, @@ -606,12 +930,35 @@ def post_list_deployments( ) -> config.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 Config 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: config.ListDeploymentsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[config.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 Config 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_list_previews( self, request: config.ListPreviewsRequest, @@ -629,12 +976,35 @@ def post_list_previews( ) -> config.ListPreviewsResponse: """Post-rpc interceptor for list_previews - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_previews_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Config server but before - it is returned to user code. + it is returned to user code. This `post_list_previews` interceptor runs + before the `post_list_previews_with_metadata` interceptor. """ return response + def post_list_previews_with_metadata( + self, + response: config.ListPreviewsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[config.ListPreviewsResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_previews + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Config server but before it is returned to user code. + + We recommend only using this `post_list_previews_with_metadata` + interceptor in new development instead of the `post_list_previews` interceptor. + When both interceptors are used, this `post_list_previews_with_metadata` interceptor runs after the + `post_list_previews` interceptor. The (possibly modified) response returned by + `post_list_previews` will be passed to + `post_list_previews_with_metadata`. + """ + return response, metadata + def pre_list_resources( self, request: config.ListResourcesRequest, @@ -652,12 +1022,35 @@ def post_list_resources( ) -> config.ListResourcesResponse: """Post-rpc interceptor for list_resources - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_resources_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Config server but before - it is returned to user code. + it is returned to user code. This `post_list_resources` interceptor runs + before the `post_list_resources_with_metadata` interceptor. """ return response + def post_list_resources_with_metadata( + self, + response: config.ListResourcesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[config.ListResourcesResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_resources + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Config server but before it is returned to user code. + + We recommend only using this `post_list_resources_with_metadata` + interceptor in new development instead of the `post_list_resources` interceptor. + When both interceptors are used, this `post_list_resources_with_metadata` interceptor runs after the + `post_list_resources` interceptor. The (possibly modified) response returned by + `post_list_resources` will be passed to + `post_list_resources_with_metadata`. + """ + return response, metadata + def pre_list_revisions( self, request: config.ListRevisionsRequest, @@ -675,12 +1068,35 @@ def post_list_revisions( ) -> config.ListRevisionsResponse: """Post-rpc interceptor for list_revisions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_revisions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Config server but before - it is returned to user code. + it is returned to user code. This `post_list_revisions` interceptor runs + before the `post_list_revisions_with_metadata` interceptor. """ return response + def post_list_revisions_with_metadata( + self, + response: config.ListRevisionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[config.ListRevisionsResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_revisions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Config server but before it is returned to user code. + + We recommend only using this `post_list_revisions_with_metadata` + interceptor in new development instead of the `post_list_revisions` interceptor. + When both interceptors are used, this `post_list_revisions_with_metadata` interceptor runs after the + `post_list_revisions` interceptor. The (possibly modified) response returned by + `post_list_revisions` will be passed to + `post_list_revisions_with_metadata`. + """ + return response, metadata + def pre_list_terraform_versions( self, request: config.ListTerraformVersionsRequest, @@ -700,12 +1116,37 @@ def post_list_terraform_versions( ) -> config.ListTerraformVersionsResponse: """Post-rpc interceptor for list_terraform_versions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_terraform_versions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Config server but before - it is returned to user code. + it is returned to user code. This `post_list_terraform_versions` interceptor runs + before the `post_list_terraform_versions_with_metadata` interceptor. """ return response + def post_list_terraform_versions_with_metadata( + self, + response: config.ListTerraformVersionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + config.ListTerraformVersionsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_terraform_versions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Config server but before it is returned to user code. + + We recommend only using this `post_list_terraform_versions_with_metadata` + interceptor in new development instead of the `post_list_terraform_versions` interceptor. + When both interceptors are used, this `post_list_terraform_versions_with_metadata` interceptor runs after the + `post_list_terraform_versions` interceptor. The (possibly modified) response returned by + `post_list_terraform_versions` will be passed to + `post_list_terraform_versions_with_metadata`. + """ + return response, metadata + def pre_lock_deployment( self, request: config.LockDeploymentRequest, @@ -723,12 +1164,35 @@ def post_lock_deployment( ) -> operations_pb2.Operation: """Post-rpc interceptor for lock_deployment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_lock_deployment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Config server but before - it is returned to user code. + it is returned to user code. This `post_lock_deployment` interceptor runs + before the `post_lock_deployment_with_metadata` interceptor. """ return response + def post_lock_deployment_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 lock_deployment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Config server but before it is returned to user code. + + We recommend only using this `post_lock_deployment_with_metadata` + interceptor in new development instead of the `post_lock_deployment` interceptor. + When both interceptors are used, this `post_lock_deployment_with_metadata` interceptor runs after the + `post_lock_deployment` interceptor. The (possibly modified) response returned by + `post_lock_deployment` will be passed to + `post_lock_deployment_with_metadata`. + """ + return response, metadata + def pre_unlock_deployment( self, request: config.UnlockDeploymentRequest, @@ -746,12 +1210,35 @@ def post_unlock_deployment( ) -> operations_pb2.Operation: """Post-rpc interceptor for unlock_deployment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_unlock_deployment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Config server but before - it is returned to user code. + it is returned to user code. This `post_unlock_deployment` interceptor runs + before the `post_unlock_deployment_with_metadata` interceptor. """ return response + def post_unlock_deployment_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 unlock_deployment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Config server but before it is returned to user code. + + We recommend only using this `post_unlock_deployment_with_metadata` + interceptor in new development instead of the `post_unlock_deployment` interceptor. + When both interceptors are used, this `post_unlock_deployment_with_metadata` interceptor runs after the + `post_unlock_deployment` interceptor. The (possibly modified) response returned by + `post_unlock_deployment` will be passed to + `post_unlock_deployment_with_metadata`. + """ + return response, metadata + def pre_update_deployment( self, request: config.UpdateDeploymentRequest, @@ -769,12 +1256,35 @@ def post_update_deployment( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_deployment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_deployment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Config server but before - it is returned to user code. + it is returned to user code. This `post_update_deployment` interceptor runs + before the `post_update_deployment_with_metadata` interceptor. """ return response + def post_update_deployment_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_deployment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Config server but before it is returned to user code. + + We recommend only using this `post_update_deployment_with_metadata` + interceptor in new development instead of the `post_update_deployment` interceptor. + When both interceptors are used, this `post_update_deployment_with_metadata` interceptor runs after the + `post_update_deployment` interceptor. The (possibly modified) response returned by + `post_update_deployment` will be passed to + `post_update_deployment_with_metadata`. + """ + return response, metadata + def pre_get_location( self, request: locations_pb2.GetLocationRequest, @@ -1268,6 +1778,10 @@ def __call__( json_format.Parse(response.content, 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 @@ -1417,6 +1931,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_preview(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_preview_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1564,6 +2082,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_deployment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_deployment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1707,6 +2229,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_preview(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_preview_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1979,6 +2505,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_export_deployment_statefile(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_export_deployment_statefile_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2126,6 +2656,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_export_lock_info(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_export_lock_info_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2276,6 +2810,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_export_preview_result(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_export_preview_result_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2430,6 +2968,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_export_revision_statefile(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_export_revision_statefile_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2575,6 +3117,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 @@ -2720,6 +3266,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_preview(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_preview_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2865,6 +3415,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_resource(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_resource_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3011,6 +3565,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_revision(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_revision_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3157,6 +3715,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_terraform_version(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_terraform_version_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3312,6 +3874,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_import_statefile(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_import_statefile_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3458,6 +4024,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 @@ -3603,6 +4173,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_previews(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_previews_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3748,6 +4322,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_resources(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_resources_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3893,6 +4471,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_revisions(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_revisions_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4038,6 +4620,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_terraform_versions(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_terraform_versions_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4190,6 +4776,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_lock_deployment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_lock_deployment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4346,6 +4936,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_unlock_deployment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_unlock_deployment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4501,6 +5095,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_deployment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_deployment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-config/samples/generated_samples/snippet_metadata_google.cloud.config.v1.json b/packages/google-cloud-config/samples/generated_samples/snippet_metadata_google.cloud.config.v1.json index e545476a0498..e9c423a602a2 100644 --- a/packages/google-cloud-config/samples/generated_samples/snippet_metadata_google.cloud.config.v1.json +++ b/packages/google-cloud-config/samples/generated_samples/snippet_metadata_google.cloud.config.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-config", - "version": "0.1.14" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-config/tests/unit/gapic/config_v1/test_config.py b/packages/google-cloud-config/tests/unit/gapic/config_v1/test_config.py index b71e304a5eff..b83fa2ee6633 100644 --- a/packages/google-cloud-config/tests/unit/gapic/config_v1/test_config.py +++ b/packages/google-cloud-config/tests/unit/gapic/config_v1/test_config.py @@ -79,6 +79,13 @@ ) from google.cloud.config_v1.types import config +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 @@ -301,6 +308,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 = ConfigClient(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 = ConfigClient(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", [ @@ -15590,10 +15640,13 @@ def test_list_deployments_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ConfigRestInterceptor, "post_list_deployments" ) as post, mock.patch.object( + transports.ConfigRestInterceptor, "post_list_deployments_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ConfigRestInterceptor, "pre_list_deployments" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = config.ListDeploymentsRequest.pb(config.ListDeploymentsRequest()) transcode.return_value = { "method": "post", @@ -15617,6 +15670,7 @@ def test_list_deployments_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = config.ListDeploymentsResponse() + post_with_metadata.return_value = config.ListDeploymentsResponse(), metadata client.list_deployments( request, @@ -15628,6 +15682,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_get_deployment_rest_bad_request(request_type=config.GetDeploymentRequest): @@ -15738,10 +15793,13 @@ def test_get_deployment_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ConfigRestInterceptor, "post_get_deployment" ) as post, mock.patch.object( + transports.ConfigRestInterceptor, "post_get_deployment_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ConfigRestInterceptor, "pre_get_deployment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = config.GetDeploymentRequest.pb(config.GetDeploymentRequest()) transcode.return_value = { "method": "post", @@ -15763,6 +15821,7 @@ def test_get_deployment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = config.Deployment() + post_with_metadata.return_value = config.Deployment(), metadata client.get_deployment( request, @@ -15774,6 +15833,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_create_deployment_rest_bad_request( @@ -15972,10 +16032,13 @@ def test_create_deployment_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ConfigRestInterceptor, "post_create_deployment" ) as post, mock.patch.object( + transports.ConfigRestInterceptor, "post_create_deployment_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ConfigRestInterceptor, "pre_create_deployment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = config.CreateDeploymentRequest.pb(config.CreateDeploymentRequest()) transcode.return_value = { "method": "post", @@ -15997,6 +16060,7 @@ def test_create_deployment_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_deployment( request, @@ -16008,6 +16072,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_update_deployment_rest_bad_request( @@ -16210,10 +16275,13 @@ def test_update_deployment_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ConfigRestInterceptor, "post_update_deployment" ) as post, mock.patch.object( + transports.ConfigRestInterceptor, "post_update_deployment_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ConfigRestInterceptor, "pre_update_deployment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = config.UpdateDeploymentRequest.pb(config.UpdateDeploymentRequest()) transcode.return_value = { "method": "post", @@ -16235,6 +16303,7 @@ def test_update_deployment_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_deployment( request, @@ -16246,6 +16315,7 @@ def test_update_deployment_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( @@ -16324,10 +16394,13 @@ def test_delete_deployment_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ConfigRestInterceptor, "post_delete_deployment" ) as post, mock.patch.object( + transports.ConfigRestInterceptor, "post_delete_deployment_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ConfigRestInterceptor, "pre_delete_deployment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = config.DeleteDeploymentRequest.pb(config.DeleteDeploymentRequest()) transcode.return_value = { "method": "post", @@ -16349,6 +16422,7 @@ def test_delete_deployment_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_deployment( request, @@ -16360,6 +16434,7 @@ def test_delete_deployment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_revisions_rest_bad_request(request_type=config.ListRevisionsRequest): @@ -16442,10 +16517,13 @@ def test_list_revisions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ConfigRestInterceptor, "post_list_revisions" ) as post, mock.patch.object( + transports.ConfigRestInterceptor, "post_list_revisions_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ConfigRestInterceptor, "pre_list_revisions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = config.ListRevisionsRequest.pb(config.ListRevisionsRequest()) transcode.return_value = { "method": "post", @@ -16469,6 +16547,7 @@ def test_list_revisions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = config.ListRevisionsResponse() + post_with_metadata.return_value = config.ListRevisionsResponse(), metadata client.list_revisions( request, @@ -16480,6 +16559,7 @@ def test_list_revisions_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_revision_rest_bad_request(request_type=config.GetRevisionRequest): @@ -16594,10 +16674,13 @@ def test_get_revision_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ConfigRestInterceptor, "post_get_revision" ) as post, mock.patch.object( + transports.ConfigRestInterceptor, "post_get_revision_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ConfigRestInterceptor, "pre_get_revision" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = config.GetRevisionRequest.pb(config.GetRevisionRequest()) transcode.return_value = { "method": "post", @@ -16619,6 +16702,7 @@ def test_get_revision_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = config.Revision() + post_with_metadata.return_value = config.Revision(), metadata client.get_revision( request, @@ -16630,6 +16714,7 @@ def test_get_revision_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_resource_rest_bad_request(request_type=config.GetResourceRequest): @@ -16718,10 +16803,13 @@ def test_get_resource_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ConfigRestInterceptor, "post_get_resource" ) as post, mock.patch.object( + transports.ConfigRestInterceptor, "post_get_resource_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ConfigRestInterceptor, "pre_get_resource" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = config.GetResourceRequest.pb(config.GetResourceRequest()) transcode.return_value = { "method": "post", @@ -16743,6 +16831,7 @@ def test_get_resource_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = config.Resource() + post_with_metadata.return_value = config.Resource(), metadata client.get_resource( request, @@ -16754,6 +16843,7 @@ def test_get_resource_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_resources_rest_bad_request(request_type=config.ListResourcesRequest): @@ -16840,10 +16930,13 @@ def test_list_resources_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ConfigRestInterceptor, "post_list_resources" ) as post, mock.patch.object( + transports.ConfigRestInterceptor, "post_list_resources_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ConfigRestInterceptor, "pre_list_resources" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = config.ListResourcesRequest.pb(config.ListResourcesRequest()) transcode.return_value = { "method": "post", @@ -16867,6 +16960,7 @@ def test_list_resources_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = config.ListResourcesResponse() + post_with_metadata.return_value = config.ListResourcesResponse(), metadata client.list_resources( request, @@ -16878,6 +16972,7 @@ def test_list_resources_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_export_deployment_statefile_rest_bad_request( @@ -16960,10 +17055,14 @@ def test_export_deployment_statefile_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ConfigRestInterceptor, "post_export_deployment_statefile" ) as post, mock.patch.object( + transports.ConfigRestInterceptor, + "post_export_deployment_statefile_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ConfigRestInterceptor, "pre_export_deployment_statefile" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = config.ExportDeploymentStatefileRequest.pb( config.ExportDeploymentStatefileRequest() ) @@ -16987,6 +17086,7 @@ def test_export_deployment_statefile_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = config.Statefile() + post_with_metadata.return_value = config.Statefile(), metadata client.export_deployment_statefile( request, @@ -16998,6 +17098,7 @@ def test_export_deployment_statefile_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_export_revision_statefile_rest_bad_request( @@ -17084,10 +17185,13 @@ def test_export_revision_statefile_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ConfigRestInterceptor, "post_export_revision_statefile" ) as post, mock.patch.object( + transports.ConfigRestInterceptor, "post_export_revision_statefile_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ConfigRestInterceptor, "pre_export_revision_statefile" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = config.ExportRevisionStatefileRequest.pb( config.ExportRevisionStatefileRequest() ) @@ -17111,6 +17215,7 @@ def test_export_revision_statefile_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = config.Statefile() + post_with_metadata.return_value = config.Statefile(), metadata client.export_revision_statefile( request, @@ -17122,6 +17227,7 @@ def test_export_revision_statefile_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_import_statefile_rest_bad_request(request_type=config.ImportStatefileRequest): @@ -17202,10 +17308,13 @@ def test_import_statefile_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ConfigRestInterceptor, "post_import_statefile" ) as post, mock.patch.object( + transports.ConfigRestInterceptor, "post_import_statefile_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ConfigRestInterceptor, "pre_import_statefile" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = config.ImportStatefileRequest.pb(config.ImportStatefileRequest()) transcode.return_value = { "method": "post", @@ -17227,6 +17336,7 @@ def test_import_statefile_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = config.Statefile() + post_with_metadata.return_value = config.Statefile(), metadata client.import_statefile( request, @@ -17238,6 +17348,7 @@ def test_import_statefile_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_statefile_rest_bad_request(request_type=config.DeleteStatefileRequest): @@ -17417,10 +17528,13 @@ def test_lock_deployment_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ConfigRestInterceptor, "post_lock_deployment" ) as post, mock.patch.object( + transports.ConfigRestInterceptor, "post_lock_deployment_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ConfigRestInterceptor, "pre_lock_deployment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = config.LockDeploymentRequest.pb(config.LockDeploymentRequest()) transcode.return_value = { "method": "post", @@ -17442,6 +17556,7 @@ def test_lock_deployment_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.lock_deployment( request, @@ -17453,6 +17568,7 @@ def test_lock_deployment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_unlock_deployment_rest_bad_request( @@ -17531,10 +17647,13 @@ def test_unlock_deployment_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ConfigRestInterceptor, "post_unlock_deployment" ) as post, mock.patch.object( + transports.ConfigRestInterceptor, "post_unlock_deployment_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ConfigRestInterceptor, "pre_unlock_deployment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = config.UnlockDeploymentRequest.pb(config.UnlockDeploymentRequest()) transcode.return_value = { "method": "post", @@ -17556,6 +17675,7 @@ def test_unlock_deployment_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.unlock_deployment( request, @@ -17567,6 +17687,7 @@ def test_unlock_deployment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_export_lock_info_rest_bad_request(request_type=config.ExportLockInfoRequest): @@ -17655,10 +17776,13 @@ def test_export_lock_info_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ConfigRestInterceptor, "post_export_lock_info" ) as post, mock.patch.object( + transports.ConfigRestInterceptor, "post_export_lock_info_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ConfigRestInterceptor, "pre_export_lock_info" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = config.ExportLockInfoRequest.pb(config.ExportLockInfoRequest()) transcode.return_value = { "method": "post", @@ -17680,6 +17804,7 @@ def test_export_lock_info_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = config.LockInfo() + post_with_metadata.return_value = config.LockInfo(), metadata client.export_lock_info( request, @@ -17691,6 +17816,7 @@ def test_export_lock_info_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_preview_rest_bad_request(request_type=config.CreatePreviewRequest): @@ -17883,10 +18009,13 @@ def test_create_preview_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ConfigRestInterceptor, "post_create_preview" ) as post, mock.patch.object( + transports.ConfigRestInterceptor, "post_create_preview_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ConfigRestInterceptor, "pre_create_preview" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = config.CreatePreviewRequest.pb(config.CreatePreviewRequest()) transcode.return_value = { "method": "post", @@ -17908,6 +18037,7 @@ def test_create_preview_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_preview( request, @@ -17919,6 +18049,7 @@ def test_create_preview_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_preview_rest_bad_request(request_type=config.GetPreviewRequest): @@ -18023,10 +18154,13 @@ def test_get_preview_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ConfigRestInterceptor, "post_get_preview" ) as post, mock.patch.object( + transports.ConfigRestInterceptor, "post_get_preview_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ConfigRestInterceptor, "pre_get_preview" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = config.GetPreviewRequest.pb(config.GetPreviewRequest()) transcode.return_value = { "method": "post", @@ -18048,6 +18182,7 @@ def test_get_preview_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = config.Preview() + post_with_metadata.return_value = config.Preview(), metadata client.get_preview( request, @@ -18059,6 +18194,7 @@ def test_get_preview_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_previews_rest_bad_request(request_type=config.ListPreviewsRequest): @@ -18141,10 +18277,13 @@ def test_list_previews_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ConfigRestInterceptor, "post_list_previews" ) as post, mock.patch.object( + transports.ConfigRestInterceptor, "post_list_previews_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ConfigRestInterceptor, "pre_list_previews" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = config.ListPreviewsRequest.pb(config.ListPreviewsRequest()) transcode.return_value = { "method": "post", @@ -18168,6 +18307,7 @@ def test_list_previews_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = config.ListPreviewsResponse() + post_with_metadata.return_value = config.ListPreviewsResponse(), metadata client.list_previews( request, @@ -18179,6 +18319,7 @@ def test_list_previews_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_preview_rest_bad_request(request_type=config.DeletePreviewRequest): @@ -18255,10 +18396,13 @@ def test_delete_preview_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ConfigRestInterceptor, "post_delete_preview" ) as post, mock.patch.object( + transports.ConfigRestInterceptor, "post_delete_preview_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ConfigRestInterceptor, "pre_delete_preview" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = config.DeletePreviewRequest.pb(config.DeletePreviewRequest()) transcode.return_value = { "method": "post", @@ -18280,6 +18424,7 @@ def test_delete_preview_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_preview( request, @@ -18291,6 +18436,7 @@ def test_delete_preview_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_export_preview_result_rest_bad_request( @@ -18370,10 +18516,13 @@ def test_export_preview_result_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ConfigRestInterceptor, "post_export_preview_result" ) as post, mock.patch.object( + transports.ConfigRestInterceptor, "post_export_preview_result_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ConfigRestInterceptor, "pre_export_preview_result" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = config.ExportPreviewResultRequest.pb( config.ExportPreviewResultRequest() ) @@ -18399,6 +18548,7 @@ def test_export_preview_result_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = config.ExportPreviewResultResponse() + post_with_metadata.return_value = config.ExportPreviewResultResponse(), metadata client.export_preview_result( request, @@ -18410,6 +18560,7 @@ def test_export_preview_result_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_terraform_versions_rest_bad_request( @@ -18494,10 +18645,13 @@ def test_list_terraform_versions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ConfigRestInterceptor, "post_list_terraform_versions" ) as post, mock.patch.object( + transports.ConfigRestInterceptor, "post_list_terraform_versions_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ConfigRestInterceptor, "pre_list_terraform_versions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = config.ListTerraformVersionsRequest.pb( config.ListTerraformVersionsRequest() ) @@ -18523,6 +18677,10 @@ def test_list_terraform_versions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = config.ListTerraformVersionsResponse() + post_with_metadata.return_value = ( + config.ListTerraformVersionsResponse(), + metadata, + ) client.list_terraform_versions( request, @@ -18534,6 +18692,7 @@ def test_list_terraform_versions_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_terraform_version_rest_bad_request( @@ -18622,10 +18781,13 @@ def test_get_terraform_version_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ConfigRestInterceptor, "post_get_terraform_version" ) as post, mock.patch.object( + transports.ConfigRestInterceptor, "post_get_terraform_version_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ConfigRestInterceptor, "pre_get_terraform_version" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = config.GetTerraformVersionRequest.pb( config.GetTerraformVersionRequest() ) @@ -18649,6 +18811,7 @@ def test_get_terraform_version_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = config.TerraformVersion() + post_with_metadata.return_value = config.TerraformVersion(), metadata client.get_terraform_version( request, @@ -18660,6 +18823,7 @@ def test_get_terraform_version_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-contact-center-insights/google/cloud/contact_center_insights/gapic_version.py b/packages/google-cloud-contact-center-insights/google/cloud/contact_center_insights/gapic_version.py index 8b80cf328714..558c8aab67c5 100644 --- a/packages/google-cloud-contact-center-insights/google/cloud/contact_center_insights/gapic_version.py +++ b/packages/google-cloud-contact-center-insights/google/cloud/contact_center_insights/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.22.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-contact-center-insights/google/cloud/contact_center_insights_v1/gapic_version.py b/packages/google-cloud-contact-center-insights/google/cloud/contact_center_insights_v1/gapic_version.py index 8b80cf328714..558c8aab67c5 100644 --- a/packages/google-cloud-contact-center-insights/google/cloud/contact_center_insights_v1/gapic_version.py +++ b/packages/google-cloud-contact-center-insights/google/cloud/contact_center_insights_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.22.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-contact-center-insights/google/cloud/contact_center_insights_v1/services/contact_center_insights/client.py b/packages/google-cloud-contact-center-insights/google/cloud/contact_center_insights_v1/services/contact_center_insights/client.py index 3a2a7ed162bb..300aee9ac1b8 100644 --- a/packages/google-cloud-contact-center-insights/google/cloud/contact_center_insights_v1/services/contact_center_insights/client.py +++ b/packages/google-cloud-contact-center-insights/google/cloud/contact_center_insights_v1/services/contact_center_insights/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 @@ -866,6 +868,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. @@ -9731,16 +9760,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, @@ -9786,16 +9819,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, diff --git a/packages/google-cloud-contact-center-insights/google/cloud/contact_center_insights_v1/services/contact_center_insights/transports/rest.py b/packages/google-cloud-contact-center-insights/google/cloud/contact_center_insights_v1/services/contact_center_insights/transports/rest.py index 9e065717bc1b..cecff381525b 100644 --- a/packages/google-cloud-contact-center-insights/google/cloud/contact_center_insights_v1/services/contact_center_insights/transports/rest.py +++ b/packages/google-cloud-contact-center-insights/google/cloud/contact_center_insights_v1/services/contact_center_insights/transports/rest.py @@ -653,12 +653,35 @@ def post_bulk_analyze_conversations( ) -> operations_pb2.Operation: """Post-rpc interceptor for bulk_analyze_conversations - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_bulk_analyze_conversations_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_bulk_analyze_conversations` interceptor runs + before the `post_bulk_analyze_conversations_with_metadata` interceptor. """ return response + def post_bulk_analyze_conversations_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 bulk_analyze_conversations + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_bulk_analyze_conversations_with_metadata` + interceptor in new development instead of the `post_bulk_analyze_conversations` interceptor. + When both interceptors are used, this `post_bulk_analyze_conversations_with_metadata` interceptor runs after the + `post_bulk_analyze_conversations` interceptor. The (possibly modified) response returned by + `post_bulk_analyze_conversations` will be passed to + `post_bulk_analyze_conversations_with_metadata`. + """ + return response, metadata + def pre_bulk_delete_conversations( self, request: contact_center_insights.BulkDeleteConversationsRequest, @@ -679,12 +702,35 @@ def post_bulk_delete_conversations( ) -> operations_pb2.Operation: """Post-rpc interceptor for bulk_delete_conversations - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_bulk_delete_conversations_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_bulk_delete_conversations` interceptor runs + before the `post_bulk_delete_conversations_with_metadata` interceptor. """ return response + def post_bulk_delete_conversations_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 bulk_delete_conversations + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_bulk_delete_conversations_with_metadata` + interceptor in new development instead of the `post_bulk_delete_conversations` interceptor. + When both interceptors are used, this `post_bulk_delete_conversations_with_metadata` interceptor runs after the + `post_bulk_delete_conversations` interceptor. The (possibly modified) response returned by + `post_bulk_delete_conversations` will be passed to + `post_bulk_delete_conversations_with_metadata`. + """ + return response, metadata + def pre_bulk_download_feedback_labels( self, request: contact_center_insights.BulkDownloadFeedbackLabelsRequest, @@ -705,12 +751,35 @@ def post_bulk_download_feedback_labels( ) -> operations_pb2.Operation: """Post-rpc interceptor for bulk_download_feedback_labels - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_bulk_download_feedback_labels_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_bulk_download_feedback_labels` interceptor runs + before the `post_bulk_download_feedback_labels_with_metadata` interceptor. """ return response + def post_bulk_download_feedback_labels_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 bulk_download_feedback_labels + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_bulk_download_feedback_labels_with_metadata` + interceptor in new development instead of the `post_bulk_download_feedback_labels` interceptor. + When both interceptors are used, this `post_bulk_download_feedback_labels_with_metadata` interceptor runs after the + `post_bulk_download_feedback_labels` interceptor. The (possibly modified) response returned by + `post_bulk_download_feedback_labels` will be passed to + `post_bulk_download_feedback_labels_with_metadata`. + """ + return response, metadata + def pre_bulk_upload_feedback_labels( self, request: contact_center_insights.BulkUploadFeedbackLabelsRequest, @@ -731,12 +800,35 @@ def post_bulk_upload_feedback_labels( ) -> operations_pb2.Operation: """Post-rpc interceptor for bulk_upload_feedback_labels - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_bulk_upload_feedback_labels_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_bulk_upload_feedback_labels` interceptor runs + before the `post_bulk_upload_feedback_labels_with_metadata` interceptor. """ return response + def post_bulk_upload_feedback_labels_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 bulk_upload_feedback_labels + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_bulk_upload_feedback_labels_with_metadata` + interceptor in new development instead of the `post_bulk_upload_feedback_labels` interceptor. + When both interceptors are used, this `post_bulk_upload_feedback_labels_with_metadata` interceptor runs after the + `post_bulk_upload_feedback_labels` interceptor. The (possibly modified) response returned by + `post_bulk_upload_feedback_labels` will be passed to + `post_bulk_upload_feedback_labels_with_metadata`. + """ + return response, metadata + def pre_calculate_issue_model_stats( self, request: contact_center_insights.CalculateIssueModelStatsRequest, @@ -757,12 +849,38 @@ def post_calculate_issue_model_stats( ) -> contact_center_insights.CalculateIssueModelStatsResponse: """Post-rpc interceptor for calculate_issue_model_stats - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_calculate_issue_model_stats_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_calculate_issue_model_stats` interceptor runs + before the `post_calculate_issue_model_stats_with_metadata` interceptor. """ return response + def post_calculate_issue_model_stats_with_metadata( + self, + response: contact_center_insights.CalculateIssueModelStatsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + contact_center_insights.CalculateIssueModelStatsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for calculate_issue_model_stats + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_calculate_issue_model_stats_with_metadata` + interceptor in new development instead of the `post_calculate_issue_model_stats` interceptor. + When both interceptors are used, this `post_calculate_issue_model_stats_with_metadata` interceptor runs after the + `post_calculate_issue_model_stats` interceptor. The (possibly modified) response returned by + `post_calculate_issue_model_stats` will be passed to + `post_calculate_issue_model_stats_with_metadata`. + """ + return response, metadata + def pre_calculate_stats( self, request: contact_center_insights.CalculateStatsRequest, @@ -783,12 +901,38 @@ def post_calculate_stats( ) -> contact_center_insights.CalculateStatsResponse: """Post-rpc interceptor for calculate_stats - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_calculate_stats_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_calculate_stats` interceptor runs + before the `post_calculate_stats_with_metadata` interceptor. """ return response + def post_calculate_stats_with_metadata( + self, + response: contact_center_insights.CalculateStatsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + contact_center_insights.CalculateStatsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for calculate_stats + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_calculate_stats_with_metadata` + interceptor in new development instead of the `post_calculate_stats` interceptor. + When both interceptors are used, this `post_calculate_stats_with_metadata` interceptor runs after the + `post_calculate_stats` interceptor. The (possibly modified) response returned by + `post_calculate_stats` will be passed to + `post_calculate_stats_with_metadata`. + """ + return response, metadata + def pre_create_analysis( self, request: contact_center_insights.CreateAnalysisRequest, @@ -809,12 +953,35 @@ def post_create_analysis( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_analysis - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_analysis_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_create_analysis` interceptor runs + before the `post_create_analysis_with_metadata` interceptor. """ return response + def post_create_analysis_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_analysis + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_create_analysis_with_metadata` + interceptor in new development instead of the `post_create_analysis` interceptor. + When both interceptors are used, this `post_create_analysis_with_metadata` interceptor runs after the + `post_create_analysis` interceptor. The (possibly modified) response returned by + `post_create_analysis` will be passed to + `post_create_analysis_with_metadata`. + """ + return response, metadata + def pre_create_analysis_rule( self, request: contact_center_insights.CreateAnalysisRuleRequest, @@ -835,12 +1002,35 @@ def post_create_analysis_rule( ) -> resources.AnalysisRule: """Post-rpc interceptor for create_analysis_rule - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_analysis_rule_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_create_analysis_rule` interceptor runs + before the `post_create_analysis_rule_with_metadata` interceptor. """ return response + def post_create_analysis_rule_with_metadata( + self, + response: resources.AnalysisRule, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.AnalysisRule, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_analysis_rule + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_create_analysis_rule_with_metadata` + interceptor in new development instead of the `post_create_analysis_rule` interceptor. + When both interceptors are used, this `post_create_analysis_rule_with_metadata` interceptor runs after the + `post_create_analysis_rule` interceptor. The (possibly modified) response returned by + `post_create_analysis_rule` will be passed to + `post_create_analysis_rule_with_metadata`. + """ + return response, metadata + def pre_create_conversation( self, request: contact_center_insights.CreateConversationRequest, @@ -861,12 +1051,35 @@ def post_create_conversation( ) -> resources.Conversation: """Post-rpc interceptor for create_conversation - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_conversation_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_create_conversation` interceptor runs + before the `post_create_conversation_with_metadata` interceptor. """ return response + def post_create_conversation_with_metadata( + self, + response: resources.Conversation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.Conversation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_conversation + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_create_conversation_with_metadata` + interceptor in new development instead of the `post_create_conversation` interceptor. + When both interceptors are used, this `post_create_conversation_with_metadata` interceptor runs after the + `post_create_conversation` interceptor. The (possibly modified) response returned by + `post_create_conversation` will be passed to + `post_create_conversation_with_metadata`. + """ + return response, metadata + def pre_create_feedback_label( self, request: contact_center_insights.CreateFeedbackLabelRequest, @@ -887,12 +1100,35 @@ def post_create_feedback_label( ) -> resources.FeedbackLabel: """Post-rpc interceptor for create_feedback_label - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_feedback_label_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_create_feedback_label` interceptor runs + before the `post_create_feedback_label_with_metadata` interceptor. """ return response + def post_create_feedback_label_with_metadata( + self, + response: resources.FeedbackLabel, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.FeedbackLabel, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_feedback_label + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_create_feedback_label_with_metadata` + interceptor in new development instead of the `post_create_feedback_label` interceptor. + When both interceptors are used, this `post_create_feedback_label_with_metadata` interceptor runs after the + `post_create_feedback_label` interceptor. The (possibly modified) response returned by + `post_create_feedback_label` will be passed to + `post_create_feedback_label_with_metadata`. + """ + return response, metadata + def pre_create_issue_model( self, request: contact_center_insights.CreateIssueModelRequest, @@ -913,12 +1149,35 @@ def post_create_issue_model( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_issue_model - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_issue_model_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_create_issue_model` interceptor runs + before the `post_create_issue_model_with_metadata` interceptor. """ return response + def post_create_issue_model_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_issue_model + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_create_issue_model_with_metadata` + interceptor in new development instead of the `post_create_issue_model` interceptor. + When both interceptors are used, this `post_create_issue_model_with_metadata` interceptor runs after the + `post_create_issue_model` interceptor. The (possibly modified) response returned by + `post_create_issue_model` will be passed to + `post_create_issue_model_with_metadata`. + """ + return response, metadata + def pre_create_phrase_matcher( self, request: contact_center_insights.CreatePhraseMatcherRequest, @@ -939,12 +1198,35 @@ def post_create_phrase_matcher( ) -> resources.PhraseMatcher: """Post-rpc interceptor for create_phrase_matcher - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_phrase_matcher_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_create_phrase_matcher` interceptor runs + before the `post_create_phrase_matcher_with_metadata` interceptor. """ return response + def post_create_phrase_matcher_with_metadata( + self, + response: resources.PhraseMatcher, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.PhraseMatcher, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_phrase_matcher + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_create_phrase_matcher_with_metadata` + interceptor in new development instead of the `post_create_phrase_matcher` interceptor. + When both interceptors are used, this `post_create_phrase_matcher_with_metadata` interceptor runs after the + `post_create_phrase_matcher` interceptor. The (possibly modified) response returned by + `post_create_phrase_matcher` will be passed to + `post_create_phrase_matcher_with_metadata`. + """ + return response, metadata + def pre_create_qa_question( self, request: contact_center_insights.CreateQaQuestionRequest, @@ -965,12 +1247,35 @@ def post_create_qa_question( ) -> resources.QaQuestion: """Post-rpc interceptor for create_qa_question - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_qa_question_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_create_qa_question` interceptor runs + before the `post_create_qa_question_with_metadata` interceptor. """ return response + def post_create_qa_question_with_metadata( + self, + response: resources.QaQuestion, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.QaQuestion, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_qa_question + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_create_qa_question_with_metadata` + interceptor in new development instead of the `post_create_qa_question` interceptor. + When both interceptors are used, this `post_create_qa_question_with_metadata` interceptor runs after the + `post_create_qa_question` interceptor. The (possibly modified) response returned by + `post_create_qa_question` will be passed to + `post_create_qa_question_with_metadata`. + """ + return response, metadata + def pre_create_qa_scorecard( self, request: contact_center_insights.CreateQaScorecardRequest, @@ -991,12 +1296,35 @@ def post_create_qa_scorecard( ) -> resources.QaScorecard: """Post-rpc interceptor for create_qa_scorecard - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_qa_scorecard_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_create_qa_scorecard` interceptor runs + before the `post_create_qa_scorecard_with_metadata` interceptor. """ return response + def post_create_qa_scorecard_with_metadata( + self, + response: resources.QaScorecard, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.QaScorecard, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_qa_scorecard + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_create_qa_scorecard_with_metadata` + interceptor in new development instead of the `post_create_qa_scorecard` interceptor. + When both interceptors are used, this `post_create_qa_scorecard_with_metadata` interceptor runs after the + `post_create_qa_scorecard` interceptor. The (possibly modified) response returned by + `post_create_qa_scorecard` will be passed to + `post_create_qa_scorecard_with_metadata`. + """ + return response, metadata + def pre_create_qa_scorecard_revision( self, request: contact_center_insights.CreateQaScorecardRevisionRequest, @@ -1017,12 +1345,35 @@ def post_create_qa_scorecard_revision( ) -> resources.QaScorecardRevision: """Post-rpc interceptor for create_qa_scorecard_revision - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_qa_scorecard_revision_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_create_qa_scorecard_revision` interceptor runs + before the `post_create_qa_scorecard_revision_with_metadata` interceptor. """ return response + def post_create_qa_scorecard_revision_with_metadata( + self, + response: resources.QaScorecardRevision, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.QaScorecardRevision, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_qa_scorecard_revision + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_create_qa_scorecard_revision_with_metadata` + interceptor in new development instead of the `post_create_qa_scorecard_revision` interceptor. + When both interceptors are used, this `post_create_qa_scorecard_revision_with_metadata` interceptor runs after the + `post_create_qa_scorecard_revision` interceptor. The (possibly modified) response returned by + `post_create_qa_scorecard_revision` will be passed to + `post_create_qa_scorecard_revision_with_metadata`. + """ + return response, metadata + def pre_create_view( self, request: contact_center_insights.CreateViewRequest, @@ -1041,12 +1392,35 @@ def pre_create_view( def post_create_view(self, response: resources.View) -> resources.View: """Post-rpc interceptor for create_view - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_view_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_create_view` interceptor runs + before the `post_create_view_with_metadata` interceptor. """ return response + def post_create_view_with_metadata( + self, + response: resources.View, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.View, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_view + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_create_view_with_metadata` + interceptor in new development instead of the `post_create_view` interceptor. + When both interceptors are used, this `post_create_view_with_metadata` interceptor runs after the + `post_create_view` interceptor. The (possibly modified) response returned by + `post_create_view` will be passed to + `post_create_view_with_metadata`. + """ + return response, metadata + def pre_delete_analysis( self, request: contact_center_insights.DeleteAnalysisRequest, @@ -1142,12 +1516,35 @@ def post_delete_issue_model( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_issue_model - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_issue_model_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_delete_issue_model` interceptor runs + before the `post_delete_issue_model_with_metadata` interceptor. """ return response + def post_delete_issue_model_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_issue_model + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_delete_issue_model_with_metadata` + interceptor in new development instead of the `post_delete_issue_model` interceptor. + When both interceptors are used, this `post_delete_issue_model_with_metadata` interceptor runs after the + `post_delete_issue_model` interceptor. The (possibly modified) response returned by + `post_delete_issue_model` will be passed to + `post_delete_issue_model_with_metadata`. + """ + return response, metadata + def pre_delete_phrase_matcher( self, request: contact_center_insights.DeletePhraseMatcherRequest, @@ -1243,12 +1640,35 @@ def post_deploy_issue_model( ) -> operations_pb2.Operation: """Post-rpc interceptor for deploy_issue_model - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_deploy_issue_model_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_deploy_issue_model` interceptor runs + before the `post_deploy_issue_model_with_metadata` interceptor. """ return response + def post_deploy_issue_model_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 deploy_issue_model + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_deploy_issue_model_with_metadata` + interceptor in new development instead of the `post_deploy_issue_model` interceptor. + When both interceptors are used, this `post_deploy_issue_model_with_metadata` interceptor runs after the + `post_deploy_issue_model` interceptor. The (possibly modified) response returned by + `post_deploy_issue_model` will be passed to + `post_deploy_issue_model_with_metadata`. + """ + return response, metadata + def pre_deploy_qa_scorecard_revision( self, request: contact_center_insights.DeployQaScorecardRevisionRequest, @@ -1269,12 +1689,35 @@ def post_deploy_qa_scorecard_revision( ) -> resources.QaScorecardRevision: """Post-rpc interceptor for deploy_qa_scorecard_revision - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_deploy_qa_scorecard_revision_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_deploy_qa_scorecard_revision` interceptor runs + before the `post_deploy_qa_scorecard_revision_with_metadata` interceptor. """ return response + def post_deploy_qa_scorecard_revision_with_metadata( + self, + response: resources.QaScorecardRevision, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.QaScorecardRevision, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for deploy_qa_scorecard_revision + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_deploy_qa_scorecard_revision_with_metadata` + interceptor in new development instead of the `post_deploy_qa_scorecard_revision` interceptor. + When both interceptors are used, this `post_deploy_qa_scorecard_revision_with_metadata` interceptor runs after the + `post_deploy_qa_scorecard_revision` interceptor. The (possibly modified) response returned by + `post_deploy_qa_scorecard_revision` will be passed to + `post_deploy_qa_scorecard_revision_with_metadata`. + """ + return response, metadata + def pre_export_insights_data( self, request: contact_center_insights.ExportInsightsDataRequest, @@ -1295,12 +1738,35 @@ def post_export_insights_data( ) -> operations_pb2.Operation: """Post-rpc interceptor for export_insights_data - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_export_insights_data_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_export_insights_data` interceptor runs + before the `post_export_insights_data_with_metadata` interceptor. """ return response + def post_export_insights_data_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 export_insights_data + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_export_insights_data_with_metadata` + interceptor in new development instead of the `post_export_insights_data` interceptor. + When both interceptors are used, this `post_export_insights_data_with_metadata` interceptor runs after the + `post_export_insights_data` interceptor. The (possibly modified) response returned by + `post_export_insights_data` will be passed to + `post_export_insights_data_with_metadata`. + """ + return response, metadata + def pre_export_issue_model( self, request: contact_center_insights.ExportIssueModelRequest, @@ -1321,12 +1787,35 @@ def post_export_issue_model( ) -> operations_pb2.Operation: """Post-rpc interceptor for export_issue_model - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_export_issue_model_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_export_issue_model` interceptor runs + before the `post_export_issue_model_with_metadata` interceptor. """ return response + def post_export_issue_model_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 export_issue_model + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_export_issue_model_with_metadata` + interceptor in new development instead of the `post_export_issue_model` interceptor. + When both interceptors are used, this `post_export_issue_model_with_metadata` interceptor runs after the + `post_export_issue_model` interceptor. The (possibly modified) response returned by + `post_export_issue_model` will be passed to + `post_export_issue_model_with_metadata`. + """ + return response, metadata + def pre_get_analysis( self, request: contact_center_insights.GetAnalysisRequest, @@ -1345,12 +1834,35 @@ def pre_get_analysis( def post_get_analysis(self, response: resources.Analysis) -> resources.Analysis: """Post-rpc interceptor for get_analysis - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_analysis_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_get_analysis` interceptor runs + before the `post_get_analysis_with_metadata` interceptor. """ return response + def post_get_analysis_with_metadata( + self, + response: resources.Analysis, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.Analysis, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_analysis + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_get_analysis_with_metadata` + interceptor in new development instead of the `post_get_analysis` interceptor. + When both interceptors are used, this `post_get_analysis_with_metadata` interceptor runs after the + `post_get_analysis` interceptor. The (possibly modified) response returned by + `post_get_analysis` will be passed to + `post_get_analysis_with_metadata`. + """ + return response, metadata + def pre_get_analysis_rule( self, request: contact_center_insights.GetAnalysisRuleRequest, @@ -1371,12 +1883,35 @@ def post_get_analysis_rule( ) -> resources.AnalysisRule: """Post-rpc interceptor for get_analysis_rule - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_analysis_rule_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_get_analysis_rule` interceptor runs + before the `post_get_analysis_rule_with_metadata` interceptor. """ return response + def post_get_analysis_rule_with_metadata( + self, + response: resources.AnalysisRule, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.AnalysisRule, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_analysis_rule + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_get_analysis_rule_with_metadata` + interceptor in new development instead of the `post_get_analysis_rule` interceptor. + When both interceptors are used, this `post_get_analysis_rule_with_metadata` interceptor runs after the + `post_get_analysis_rule` interceptor. The (possibly modified) response returned by + `post_get_analysis_rule` will be passed to + `post_get_analysis_rule_with_metadata`. + """ + return response, metadata + def pre_get_conversation( self, request: contact_center_insights.GetConversationRequest, @@ -1397,12 +1932,35 @@ def post_get_conversation( ) -> resources.Conversation: """Post-rpc interceptor for get_conversation - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_conversation_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_get_conversation` interceptor runs + before the `post_get_conversation_with_metadata` interceptor. """ return response + def post_get_conversation_with_metadata( + self, + response: resources.Conversation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.Conversation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_conversation + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_get_conversation_with_metadata` + interceptor in new development instead of the `post_get_conversation` interceptor. + When both interceptors are used, this `post_get_conversation_with_metadata` interceptor runs after the + `post_get_conversation` interceptor. The (possibly modified) response returned by + `post_get_conversation` will be passed to + `post_get_conversation_with_metadata`. + """ + return response, metadata + def pre_get_encryption_spec( self, request: contact_center_insights.GetEncryptionSpecRequest, @@ -1423,12 +1981,35 @@ def post_get_encryption_spec( ) -> resources.EncryptionSpec: """Post-rpc interceptor for get_encryption_spec - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_encryption_spec_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_get_encryption_spec` interceptor runs + before the `post_get_encryption_spec_with_metadata` interceptor. """ return response + def post_get_encryption_spec_with_metadata( + self, + response: resources.EncryptionSpec, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.EncryptionSpec, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_encryption_spec + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_get_encryption_spec_with_metadata` + interceptor in new development instead of the `post_get_encryption_spec` interceptor. + When both interceptors are used, this `post_get_encryption_spec_with_metadata` interceptor runs after the + `post_get_encryption_spec` interceptor. The (possibly modified) response returned by + `post_get_encryption_spec` will be passed to + `post_get_encryption_spec_with_metadata`. + """ + return response, metadata + def pre_get_feedback_label( self, request: contact_center_insights.GetFeedbackLabelRequest, @@ -1449,12 +2030,35 @@ def post_get_feedback_label( ) -> resources.FeedbackLabel: """Post-rpc interceptor for get_feedback_label - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_feedback_label_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_get_feedback_label` interceptor runs + before the `post_get_feedback_label_with_metadata` interceptor. """ return response + def post_get_feedback_label_with_metadata( + self, + response: resources.FeedbackLabel, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.FeedbackLabel, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_feedback_label + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_get_feedback_label_with_metadata` + interceptor in new development instead of the `post_get_feedback_label` interceptor. + When both interceptors are used, this `post_get_feedback_label_with_metadata` interceptor runs after the + `post_get_feedback_label` interceptor. The (possibly modified) response returned by + `post_get_feedback_label` will be passed to + `post_get_feedback_label_with_metadata`. + """ + return response, metadata + def pre_get_issue( self, request: contact_center_insights.GetIssueRequest, @@ -1472,12 +2076,35 @@ def pre_get_issue( def post_get_issue(self, response: resources.Issue) -> resources.Issue: """Post-rpc interceptor for get_issue - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_issue_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_get_issue` interceptor runs + before the `post_get_issue_with_metadata` interceptor. """ return response + def post_get_issue_with_metadata( + self, + response: resources.Issue, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.Issue, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_issue + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_get_issue_with_metadata` + interceptor in new development instead of the `post_get_issue` interceptor. + When both interceptors are used, this `post_get_issue_with_metadata` interceptor runs after the + `post_get_issue` interceptor. The (possibly modified) response returned by + `post_get_issue` will be passed to + `post_get_issue_with_metadata`. + """ + return response, metadata + def pre_get_issue_model( self, request: contact_center_insights.GetIssueModelRequest, @@ -1498,12 +2125,35 @@ def post_get_issue_model( ) -> resources.IssueModel: """Post-rpc interceptor for get_issue_model - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_issue_model_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_get_issue_model` interceptor runs + before the `post_get_issue_model_with_metadata` interceptor. """ return response + def post_get_issue_model_with_metadata( + self, + response: resources.IssueModel, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.IssueModel, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_issue_model + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_get_issue_model_with_metadata` + interceptor in new development instead of the `post_get_issue_model` interceptor. + When both interceptors are used, this `post_get_issue_model_with_metadata` interceptor runs after the + `post_get_issue_model` interceptor. The (possibly modified) response returned by + `post_get_issue_model` will be passed to + `post_get_issue_model_with_metadata`. + """ + return response, metadata + def pre_get_phrase_matcher( self, request: contact_center_insights.GetPhraseMatcherRequest, @@ -1524,12 +2174,35 @@ def post_get_phrase_matcher( ) -> resources.PhraseMatcher: """Post-rpc interceptor for get_phrase_matcher - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_phrase_matcher_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_get_phrase_matcher` interceptor runs + before the `post_get_phrase_matcher_with_metadata` interceptor. """ return response + def post_get_phrase_matcher_with_metadata( + self, + response: resources.PhraseMatcher, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.PhraseMatcher, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_phrase_matcher + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_get_phrase_matcher_with_metadata` + interceptor in new development instead of the `post_get_phrase_matcher` interceptor. + When both interceptors are used, this `post_get_phrase_matcher_with_metadata` interceptor runs after the + `post_get_phrase_matcher` interceptor. The (possibly modified) response returned by + `post_get_phrase_matcher` will be passed to + `post_get_phrase_matcher_with_metadata`. + """ + return response, metadata + def pre_get_qa_question( self, request: contact_center_insights.GetQaQuestionRequest, @@ -1550,12 +2223,35 @@ def post_get_qa_question( ) -> resources.QaQuestion: """Post-rpc interceptor for get_qa_question - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_qa_question_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_get_qa_question` interceptor runs + before the `post_get_qa_question_with_metadata` interceptor. """ return response + def post_get_qa_question_with_metadata( + self, + response: resources.QaQuestion, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.QaQuestion, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_qa_question + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_get_qa_question_with_metadata` + interceptor in new development instead of the `post_get_qa_question` interceptor. + When both interceptors are used, this `post_get_qa_question_with_metadata` interceptor runs after the + `post_get_qa_question` interceptor. The (possibly modified) response returned by + `post_get_qa_question` will be passed to + `post_get_qa_question_with_metadata`. + """ + return response, metadata + def pre_get_qa_scorecard( self, request: contact_center_insights.GetQaScorecardRequest, @@ -1576,12 +2272,35 @@ def post_get_qa_scorecard( ) -> resources.QaScorecard: """Post-rpc interceptor for get_qa_scorecard - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_qa_scorecard_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_get_qa_scorecard` interceptor runs + before the `post_get_qa_scorecard_with_metadata` interceptor. """ return response + def post_get_qa_scorecard_with_metadata( + self, + response: resources.QaScorecard, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.QaScorecard, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_qa_scorecard + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_get_qa_scorecard_with_metadata` + interceptor in new development instead of the `post_get_qa_scorecard` interceptor. + When both interceptors are used, this `post_get_qa_scorecard_with_metadata` interceptor runs after the + `post_get_qa_scorecard` interceptor. The (possibly modified) response returned by + `post_get_qa_scorecard` will be passed to + `post_get_qa_scorecard_with_metadata`. + """ + return response, metadata + def pre_get_qa_scorecard_revision( self, request: contact_center_insights.GetQaScorecardRevisionRequest, @@ -1602,12 +2321,35 @@ def post_get_qa_scorecard_revision( ) -> resources.QaScorecardRevision: """Post-rpc interceptor for get_qa_scorecard_revision - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_qa_scorecard_revision_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_get_qa_scorecard_revision` interceptor runs + before the `post_get_qa_scorecard_revision_with_metadata` interceptor. """ return response + def post_get_qa_scorecard_revision_with_metadata( + self, + response: resources.QaScorecardRevision, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.QaScorecardRevision, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_qa_scorecard_revision + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_get_qa_scorecard_revision_with_metadata` + interceptor in new development instead of the `post_get_qa_scorecard_revision` interceptor. + When both interceptors are used, this `post_get_qa_scorecard_revision_with_metadata` interceptor runs after the + `post_get_qa_scorecard_revision` interceptor. The (possibly modified) response returned by + `post_get_qa_scorecard_revision` will be passed to + `post_get_qa_scorecard_revision_with_metadata`. + """ + return response, metadata + def pre_get_settings( self, request: contact_center_insights.GetSettingsRequest, @@ -1626,12 +2368,35 @@ def pre_get_settings( def post_get_settings(self, response: resources.Settings) -> resources.Settings: """Post-rpc interceptor for get_settings - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_settings_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_get_settings` interceptor runs + before the `post_get_settings_with_metadata` interceptor. """ return response + def post_get_settings_with_metadata( + self, + response: resources.Settings, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.Settings, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_settings + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_get_settings_with_metadata` + interceptor in new development instead of the `post_get_settings` interceptor. + When both interceptors are used, this `post_get_settings_with_metadata` interceptor runs after the + `post_get_settings` interceptor. The (possibly modified) response returned by + `post_get_settings` will be passed to + `post_get_settings_with_metadata`. + """ + return response, metadata + def pre_get_view( self, request: contact_center_insights.GetViewRequest, @@ -1649,12 +2414,35 @@ def pre_get_view( def post_get_view(self, response: resources.View) -> resources.View: """Post-rpc interceptor for get_view - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_view_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_get_view` interceptor runs + before the `post_get_view_with_metadata` interceptor. """ return response + def post_get_view_with_metadata( + self, + response: resources.View, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.View, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_view + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_get_view_with_metadata` + interceptor in new development instead of the `post_get_view` interceptor. + When both interceptors are used, this `post_get_view_with_metadata` interceptor runs after the + `post_get_view` interceptor. The (possibly modified) response returned by + `post_get_view` will be passed to + `post_get_view_with_metadata`. + """ + return response, metadata + def pre_import_issue_model( self, request: contact_center_insights.ImportIssueModelRequest, @@ -1675,12 +2463,35 @@ def post_import_issue_model( ) -> operations_pb2.Operation: """Post-rpc interceptor for import_issue_model - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_import_issue_model_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_import_issue_model` interceptor runs + before the `post_import_issue_model_with_metadata` interceptor. """ return response + def post_import_issue_model_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_issue_model + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_import_issue_model_with_metadata` + interceptor in new development instead of the `post_import_issue_model` interceptor. + When both interceptors are used, this `post_import_issue_model_with_metadata` interceptor runs after the + `post_import_issue_model` interceptor. The (possibly modified) response returned by + `post_import_issue_model` will be passed to + `post_import_issue_model_with_metadata`. + """ + return response, metadata + def pre_ingest_conversations( self, request: contact_center_insights.IngestConversationsRequest, @@ -1701,12 +2512,35 @@ def post_ingest_conversations( ) -> operations_pb2.Operation: """Post-rpc interceptor for ingest_conversations - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_ingest_conversations_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_ingest_conversations` interceptor runs + before the `post_ingest_conversations_with_metadata` interceptor. """ return response + def post_ingest_conversations_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 ingest_conversations + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_ingest_conversations_with_metadata` + interceptor in new development instead of the `post_ingest_conversations` interceptor. + When both interceptors are used, this `post_ingest_conversations_with_metadata` interceptor runs after the + `post_ingest_conversations` interceptor. The (possibly modified) response returned by + `post_ingest_conversations` will be passed to + `post_ingest_conversations_with_metadata`. + """ + return response, metadata + def pre_initialize_encryption_spec( self, request: contact_center_insights.InitializeEncryptionSpecRequest, @@ -1727,12 +2561,35 @@ def post_initialize_encryption_spec( ) -> operations_pb2.Operation: """Post-rpc interceptor for initialize_encryption_spec - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_initialize_encryption_spec_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_initialize_encryption_spec` interceptor runs + before the `post_initialize_encryption_spec_with_metadata` interceptor. """ return response + def post_initialize_encryption_spec_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 initialize_encryption_spec + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_initialize_encryption_spec_with_metadata` + interceptor in new development instead of the `post_initialize_encryption_spec` interceptor. + When both interceptors are used, this `post_initialize_encryption_spec_with_metadata` interceptor runs after the + `post_initialize_encryption_spec` interceptor. The (possibly modified) response returned by + `post_initialize_encryption_spec` will be passed to + `post_initialize_encryption_spec_with_metadata`. + """ + return response, metadata + def pre_list_all_feedback_labels( self, request: contact_center_insights.ListAllFeedbackLabelsRequest, @@ -1753,12 +2610,38 @@ def post_list_all_feedback_labels( ) -> contact_center_insights.ListAllFeedbackLabelsResponse: """Post-rpc interceptor for list_all_feedback_labels - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_all_feedback_labels_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_list_all_feedback_labels` interceptor runs + before the `post_list_all_feedback_labels_with_metadata` interceptor. """ return response + def post_list_all_feedback_labels_with_metadata( + self, + response: contact_center_insights.ListAllFeedbackLabelsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + contact_center_insights.ListAllFeedbackLabelsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_all_feedback_labels + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_list_all_feedback_labels_with_metadata` + interceptor in new development instead of the `post_list_all_feedback_labels` interceptor. + When both interceptors are used, this `post_list_all_feedback_labels_with_metadata` interceptor runs after the + `post_list_all_feedback_labels` interceptor. The (possibly modified) response returned by + `post_list_all_feedback_labels` will be passed to + `post_list_all_feedback_labels_with_metadata`. + """ + return response, metadata + def pre_list_analyses( self, request: contact_center_insights.ListAnalysesRequest, @@ -1779,12 +2662,38 @@ def post_list_analyses( ) -> contact_center_insights.ListAnalysesResponse: """Post-rpc interceptor for list_analyses - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_analyses_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_list_analyses` interceptor runs + before the `post_list_analyses_with_metadata` interceptor. """ return response + def post_list_analyses_with_metadata( + self, + response: contact_center_insights.ListAnalysesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + contact_center_insights.ListAnalysesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_analyses + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_list_analyses_with_metadata` + interceptor in new development instead of the `post_list_analyses` interceptor. + When both interceptors are used, this `post_list_analyses_with_metadata` interceptor runs after the + `post_list_analyses` interceptor. The (possibly modified) response returned by + `post_list_analyses` will be passed to + `post_list_analyses_with_metadata`. + """ + return response, metadata + def pre_list_analysis_rules( self, request: contact_center_insights.ListAnalysisRulesRequest, @@ -1805,12 +2714,38 @@ def post_list_analysis_rules( ) -> contact_center_insights.ListAnalysisRulesResponse: """Post-rpc interceptor for list_analysis_rules - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_analysis_rules_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_list_analysis_rules` interceptor runs + before the `post_list_analysis_rules_with_metadata` interceptor. """ return response + def post_list_analysis_rules_with_metadata( + self, + response: contact_center_insights.ListAnalysisRulesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + contact_center_insights.ListAnalysisRulesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_analysis_rules + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_list_analysis_rules_with_metadata` + interceptor in new development instead of the `post_list_analysis_rules` interceptor. + When both interceptors are used, this `post_list_analysis_rules_with_metadata` interceptor runs after the + `post_list_analysis_rules` interceptor. The (possibly modified) response returned by + `post_list_analysis_rules` will be passed to + `post_list_analysis_rules_with_metadata`. + """ + return response, metadata + def pre_list_conversations( self, request: contact_center_insights.ListConversationsRequest, @@ -1831,12 +2766,38 @@ def post_list_conversations( ) -> contact_center_insights.ListConversationsResponse: """Post-rpc interceptor for list_conversations - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_conversations_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_list_conversations` interceptor runs + before the `post_list_conversations_with_metadata` interceptor. """ return response + def post_list_conversations_with_metadata( + self, + response: contact_center_insights.ListConversationsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + contact_center_insights.ListConversationsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_conversations + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_list_conversations_with_metadata` + interceptor in new development instead of the `post_list_conversations` interceptor. + When both interceptors are used, this `post_list_conversations_with_metadata` interceptor runs after the + `post_list_conversations` interceptor. The (possibly modified) response returned by + `post_list_conversations` will be passed to + `post_list_conversations_with_metadata`. + """ + return response, metadata + def pre_list_feedback_labels( self, request: contact_center_insights.ListFeedbackLabelsRequest, @@ -1857,12 +2818,38 @@ def post_list_feedback_labels( ) -> contact_center_insights.ListFeedbackLabelsResponse: """Post-rpc interceptor for list_feedback_labels - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_feedback_labels_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_list_feedback_labels` interceptor runs + before the `post_list_feedback_labels_with_metadata` interceptor. """ return response + def post_list_feedback_labels_with_metadata( + self, + response: contact_center_insights.ListFeedbackLabelsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + contact_center_insights.ListFeedbackLabelsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_feedback_labels + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_list_feedback_labels_with_metadata` + interceptor in new development instead of the `post_list_feedback_labels` interceptor. + When both interceptors are used, this `post_list_feedback_labels_with_metadata` interceptor runs after the + `post_list_feedback_labels` interceptor. The (possibly modified) response returned by + `post_list_feedback_labels` will be passed to + `post_list_feedback_labels_with_metadata`. + """ + return response, metadata + def pre_list_issue_models( self, request: contact_center_insights.ListIssueModelsRequest, @@ -1883,12 +2870,38 @@ def post_list_issue_models( ) -> contact_center_insights.ListIssueModelsResponse: """Post-rpc interceptor for list_issue_models - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_issue_models_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_list_issue_models` interceptor runs + before the `post_list_issue_models_with_metadata` interceptor. """ return response + def post_list_issue_models_with_metadata( + self, + response: contact_center_insights.ListIssueModelsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + contact_center_insights.ListIssueModelsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_issue_models + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_list_issue_models_with_metadata` + interceptor in new development instead of the `post_list_issue_models` interceptor. + When both interceptors are used, this `post_list_issue_models_with_metadata` interceptor runs after the + `post_list_issue_models` interceptor. The (possibly modified) response returned by + `post_list_issue_models` will be passed to + `post_list_issue_models_with_metadata`. + """ + return response, metadata + def pre_list_issues( self, request: contact_center_insights.ListIssuesRequest, @@ -1909,12 +2922,38 @@ def post_list_issues( ) -> contact_center_insights.ListIssuesResponse: """Post-rpc interceptor for list_issues - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_issues_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_list_issues` interceptor runs + before the `post_list_issues_with_metadata` interceptor. """ return response + def post_list_issues_with_metadata( + self, + response: contact_center_insights.ListIssuesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + contact_center_insights.ListIssuesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_issues + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_list_issues_with_metadata` + interceptor in new development instead of the `post_list_issues` interceptor. + When both interceptors are used, this `post_list_issues_with_metadata` interceptor runs after the + `post_list_issues` interceptor. The (possibly modified) response returned by + `post_list_issues` will be passed to + `post_list_issues_with_metadata`. + """ + return response, metadata + def pre_list_phrase_matchers( self, request: contact_center_insights.ListPhraseMatchersRequest, @@ -1935,12 +2974,38 @@ def post_list_phrase_matchers( ) -> contact_center_insights.ListPhraseMatchersResponse: """Post-rpc interceptor for list_phrase_matchers - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_phrase_matchers_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_list_phrase_matchers` interceptor runs + before the `post_list_phrase_matchers_with_metadata` interceptor. """ return response + def post_list_phrase_matchers_with_metadata( + self, + response: contact_center_insights.ListPhraseMatchersResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + contact_center_insights.ListPhraseMatchersResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_phrase_matchers + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_list_phrase_matchers_with_metadata` + interceptor in new development instead of the `post_list_phrase_matchers` interceptor. + When both interceptors are used, this `post_list_phrase_matchers_with_metadata` interceptor runs after the + `post_list_phrase_matchers` interceptor. The (possibly modified) response returned by + `post_list_phrase_matchers` will be passed to + `post_list_phrase_matchers_with_metadata`. + """ + return response, metadata + def pre_list_qa_questions( self, request: contact_center_insights.ListQaQuestionsRequest, @@ -1961,12 +3026,38 @@ def post_list_qa_questions( ) -> contact_center_insights.ListQaQuestionsResponse: """Post-rpc interceptor for list_qa_questions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_qa_questions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_list_qa_questions` interceptor runs + before the `post_list_qa_questions_with_metadata` interceptor. """ return response + def post_list_qa_questions_with_metadata( + self, + response: contact_center_insights.ListQaQuestionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + contact_center_insights.ListQaQuestionsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_qa_questions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_list_qa_questions_with_metadata` + interceptor in new development instead of the `post_list_qa_questions` interceptor. + When both interceptors are used, this `post_list_qa_questions_with_metadata` interceptor runs after the + `post_list_qa_questions` interceptor. The (possibly modified) response returned by + `post_list_qa_questions` will be passed to + `post_list_qa_questions_with_metadata`. + """ + return response, metadata + def pre_list_qa_scorecard_revisions( self, request: contact_center_insights.ListQaScorecardRevisionsRequest, @@ -1987,12 +3078,38 @@ def post_list_qa_scorecard_revisions( ) -> contact_center_insights.ListQaScorecardRevisionsResponse: """Post-rpc interceptor for list_qa_scorecard_revisions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_qa_scorecard_revisions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_list_qa_scorecard_revisions` interceptor runs + before the `post_list_qa_scorecard_revisions_with_metadata` interceptor. """ return response + def post_list_qa_scorecard_revisions_with_metadata( + self, + response: contact_center_insights.ListQaScorecardRevisionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + contact_center_insights.ListQaScorecardRevisionsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_qa_scorecard_revisions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_list_qa_scorecard_revisions_with_metadata` + interceptor in new development instead of the `post_list_qa_scorecard_revisions` interceptor. + When both interceptors are used, this `post_list_qa_scorecard_revisions_with_metadata` interceptor runs after the + `post_list_qa_scorecard_revisions` interceptor. The (possibly modified) response returned by + `post_list_qa_scorecard_revisions` will be passed to + `post_list_qa_scorecard_revisions_with_metadata`. + """ + return response, metadata + def pre_list_qa_scorecards( self, request: contact_center_insights.ListQaScorecardsRequest, @@ -2013,12 +3130,38 @@ def post_list_qa_scorecards( ) -> contact_center_insights.ListQaScorecardsResponse: """Post-rpc interceptor for list_qa_scorecards - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_qa_scorecards_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_list_qa_scorecards` interceptor runs + before the `post_list_qa_scorecards_with_metadata` interceptor. """ return response + def post_list_qa_scorecards_with_metadata( + self, + response: contact_center_insights.ListQaScorecardsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + contact_center_insights.ListQaScorecardsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_qa_scorecards + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_list_qa_scorecards_with_metadata` + interceptor in new development instead of the `post_list_qa_scorecards` interceptor. + When both interceptors are used, this `post_list_qa_scorecards_with_metadata` interceptor runs after the + `post_list_qa_scorecards` interceptor. The (possibly modified) response returned by + `post_list_qa_scorecards` will be passed to + `post_list_qa_scorecards_with_metadata`. + """ + return response, metadata + def pre_list_views( self, request: contact_center_insights.ListViewsRequest, @@ -2039,12 +3182,38 @@ def post_list_views( ) -> contact_center_insights.ListViewsResponse: """Post-rpc interceptor for list_views - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_views_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_list_views` interceptor runs + before the `post_list_views_with_metadata` interceptor. """ return response + def post_list_views_with_metadata( + self, + response: contact_center_insights.ListViewsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + contact_center_insights.ListViewsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_views + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_list_views_with_metadata` + interceptor in new development instead of the `post_list_views` interceptor. + When both interceptors are used, this `post_list_views_with_metadata` interceptor runs after the + `post_list_views` interceptor. The (possibly modified) response returned by + `post_list_views` will be passed to + `post_list_views_with_metadata`. + """ + return response, metadata + def pre_query_metrics( self, request: contact_center_insights.QueryMetricsRequest, @@ -2065,12 +3234,35 @@ def post_query_metrics( ) -> operations_pb2.Operation: """Post-rpc interceptor for query_metrics - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_query_metrics_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_query_metrics` interceptor runs + before the `post_query_metrics_with_metadata` interceptor. """ return response + def post_query_metrics_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 query_metrics + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_query_metrics_with_metadata` + interceptor in new development instead of the `post_query_metrics` interceptor. + When both interceptors are used, this `post_query_metrics_with_metadata` interceptor runs after the + `post_query_metrics` interceptor. The (possibly modified) response returned by + `post_query_metrics` will be passed to + `post_query_metrics_with_metadata`. + """ + return response, metadata + def pre_tune_qa_scorecard_revision( self, request: contact_center_insights.TuneQaScorecardRevisionRequest, @@ -2091,12 +3283,35 @@ def post_tune_qa_scorecard_revision( ) -> operations_pb2.Operation: """Post-rpc interceptor for tune_qa_scorecard_revision - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_tune_qa_scorecard_revision_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_tune_qa_scorecard_revision` interceptor runs + before the `post_tune_qa_scorecard_revision_with_metadata` interceptor. """ return response + def post_tune_qa_scorecard_revision_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 tune_qa_scorecard_revision + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_tune_qa_scorecard_revision_with_metadata` + interceptor in new development instead of the `post_tune_qa_scorecard_revision` interceptor. + When both interceptors are used, this `post_tune_qa_scorecard_revision_with_metadata` interceptor runs after the + `post_tune_qa_scorecard_revision` interceptor. The (possibly modified) response returned by + `post_tune_qa_scorecard_revision` will be passed to + `post_tune_qa_scorecard_revision_with_metadata`. + """ + return response, metadata + def pre_undeploy_issue_model( self, request: contact_center_insights.UndeployIssueModelRequest, @@ -2117,12 +3332,35 @@ def post_undeploy_issue_model( ) -> operations_pb2.Operation: """Post-rpc interceptor for undeploy_issue_model - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_undeploy_issue_model_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_undeploy_issue_model` interceptor runs + before the `post_undeploy_issue_model_with_metadata` interceptor. """ return response + def post_undeploy_issue_model_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 undeploy_issue_model + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_undeploy_issue_model_with_metadata` + interceptor in new development instead of the `post_undeploy_issue_model` interceptor. + When both interceptors are used, this `post_undeploy_issue_model_with_metadata` interceptor runs after the + `post_undeploy_issue_model` interceptor. The (possibly modified) response returned by + `post_undeploy_issue_model` will be passed to + `post_undeploy_issue_model_with_metadata`. + """ + return response, metadata + def pre_undeploy_qa_scorecard_revision( self, request: contact_center_insights.UndeployQaScorecardRevisionRequest, @@ -2143,12 +3381,35 @@ def post_undeploy_qa_scorecard_revision( ) -> resources.QaScorecardRevision: """Post-rpc interceptor for undeploy_qa_scorecard_revision - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_undeploy_qa_scorecard_revision_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_undeploy_qa_scorecard_revision` interceptor runs + before the `post_undeploy_qa_scorecard_revision_with_metadata` interceptor. """ return response + def post_undeploy_qa_scorecard_revision_with_metadata( + self, + response: resources.QaScorecardRevision, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.QaScorecardRevision, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for undeploy_qa_scorecard_revision + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_undeploy_qa_scorecard_revision_with_metadata` + interceptor in new development instead of the `post_undeploy_qa_scorecard_revision` interceptor. + When both interceptors are used, this `post_undeploy_qa_scorecard_revision_with_metadata` interceptor runs after the + `post_undeploy_qa_scorecard_revision` interceptor. The (possibly modified) response returned by + `post_undeploy_qa_scorecard_revision` will be passed to + `post_undeploy_qa_scorecard_revision_with_metadata`. + """ + return response, metadata + def pre_update_analysis_rule( self, request: contact_center_insights.UpdateAnalysisRuleRequest, @@ -2169,12 +3430,35 @@ def post_update_analysis_rule( ) -> resources.AnalysisRule: """Post-rpc interceptor for update_analysis_rule - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_analysis_rule_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_update_analysis_rule` interceptor runs + before the `post_update_analysis_rule_with_metadata` interceptor. """ return response + def post_update_analysis_rule_with_metadata( + self, + response: resources.AnalysisRule, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.AnalysisRule, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_analysis_rule + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_update_analysis_rule_with_metadata` + interceptor in new development instead of the `post_update_analysis_rule` interceptor. + When both interceptors are used, this `post_update_analysis_rule_with_metadata` interceptor runs after the + `post_update_analysis_rule` interceptor. The (possibly modified) response returned by + `post_update_analysis_rule` will be passed to + `post_update_analysis_rule_with_metadata`. + """ + return response, metadata + def pre_update_conversation( self, request: contact_center_insights.UpdateConversationRequest, @@ -2195,12 +3479,35 @@ def post_update_conversation( ) -> resources.Conversation: """Post-rpc interceptor for update_conversation - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_conversation_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_update_conversation` interceptor runs + before the `post_update_conversation_with_metadata` interceptor. """ return response + def post_update_conversation_with_metadata( + self, + response: resources.Conversation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.Conversation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_conversation + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_update_conversation_with_metadata` + interceptor in new development instead of the `post_update_conversation` interceptor. + When both interceptors are used, this `post_update_conversation_with_metadata` interceptor runs after the + `post_update_conversation` interceptor. The (possibly modified) response returned by + `post_update_conversation` will be passed to + `post_update_conversation_with_metadata`. + """ + return response, metadata + def pre_update_feedback_label( self, request: contact_center_insights.UpdateFeedbackLabelRequest, @@ -2221,12 +3528,35 @@ def post_update_feedback_label( ) -> resources.FeedbackLabel: """Post-rpc interceptor for update_feedback_label - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_feedback_label_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_update_feedback_label` interceptor runs + before the `post_update_feedback_label_with_metadata` interceptor. """ return response + def post_update_feedback_label_with_metadata( + self, + response: resources.FeedbackLabel, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.FeedbackLabel, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_feedback_label + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_update_feedback_label_with_metadata` + interceptor in new development instead of the `post_update_feedback_label` interceptor. + When both interceptors are used, this `post_update_feedback_label_with_metadata` interceptor runs after the + `post_update_feedback_label` interceptor. The (possibly modified) response returned by + `post_update_feedback_label` will be passed to + `post_update_feedback_label_with_metadata`. + """ + return response, metadata + def pre_update_issue( self, request: contact_center_insights.UpdateIssueRequest, @@ -2245,12 +3575,35 @@ def pre_update_issue( def post_update_issue(self, response: resources.Issue) -> resources.Issue: """Post-rpc interceptor for update_issue - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_issue_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_update_issue` interceptor runs + before the `post_update_issue_with_metadata` interceptor. """ return response + def post_update_issue_with_metadata( + self, + response: resources.Issue, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.Issue, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_issue + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_update_issue_with_metadata` + interceptor in new development instead of the `post_update_issue` interceptor. + When both interceptors are used, this `post_update_issue_with_metadata` interceptor runs after the + `post_update_issue` interceptor. The (possibly modified) response returned by + `post_update_issue` will be passed to + `post_update_issue_with_metadata`. + """ + return response, metadata + def pre_update_issue_model( self, request: contact_center_insights.UpdateIssueModelRequest, @@ -2271,12 +3624,35 @@ def post_update_issue_model( ) -> resources.IssueModel: """Post-rpc interceptor for update_issue_model - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_issue_model_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_update_issue_model` interceptor runs + before the `post_update_issue_model_with_metadata` interceptor. """ return response + def post_update_issue_model_with_metadata( + self, + response: resources.IssueModel, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.IssueModel, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_issue_model + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_update_issue_model_with_metadata` + interceptor in new development instead of the `post_update_issue_model` interceptor. + When both interceptors are used, this `post_update_issue_model_with_metadata` interceptor runs after the + `post_update_issue_model` interceptor. The (possibly modified) response returned by + `post_update_issue_model` will be passed to + `post_update_issue_model_with_metadata`. + """ + return response, metadata + def pre_update_phrase_matcher( self, request: contact_center_insights.UpdatePhraseMatcherRequest, @@ -2297,12 +3673,35 @@ def post_update_phrase_matcher( ) -> resources.PhraseMatcher: """Post-rpc interceptor for update_phrase_matcher - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_phrase_matcher_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_update_phrase_matcher` interceptor runs + before the `post_update_phrase_matcher_with_metadata` interceptor. """ return response + def post_update_phrase_matcher_with_metadata( + self, + response: resources.PhraseMatcher, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.PhraseMatcher, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_phrase_matcher + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_update_phrase_matcher_with_metadata` + interceptor in new development instead of the `post_update_phrase_matcher` interceptor. + When both interceptors are used, this `post_update_phrase_matcher_with_metadata` interceptor runs after the + `post_update_phrase_matcher` interceptor. The (possibly modified) response returned by + `post_update_phrase_matcher` will be passed to + `post_update_phrase_matcher_with_metadata`. + """ + return response, metadata + def pre_update_qa_question( self, request: contact_center_insights.UpdateQaQuestionRequest, @@ -2323,12 +3722,35 @@ def post_update_qa_question( ) -> resources.QaQuestion: """Post-rpc interceptor for update_qa_question - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_qa_question_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_update_qa_question` interceptor runs + before the `post_update_qa_question_with_metadata` interceptor. """ return response + def post_update_qa_question_with_metadata( + self, + response: resources.QaQuestion, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.QaQuestion, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_qa_question + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_update_qa_question_with_metadata` + interceptor in new development instead of the `post_update_qa_question` interceptor. + When both interceptors are used, this `post_update_qa_question_with_metadata` interceptor runs after the + `post_update_qa_question` interceptor. The (possibly modified) response returned by + `post_update_qa_question` will be passed to + `post_update_qa_question_with_metadata`. + """ + return response, metadata + def pre_update_qa_scorecard( self, request: contact_center_insights.UpdateQaScorecardRequest, @@ -2349,12 +3771,35 @@ def post_update_qa_scorecard( ) -> resources.QaScorecard: """Post-rpc interceptor for update_qa_scorecard - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_qa_scorecard_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_update_qa_scorecard` interceptor runs + before the `post_update_qa_scorecard_with_metadata` interceptor. """ return response + def post_update_qa_scorecard_with_metadata( + self, + response: resources.QaScorecard, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.QaScorecard, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_qa_scorecard + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_update_qa_scorecard_with_metadata` + interceptor in new development instead of the `post_update_qa_scorecard` interceptor. + When both interceptors are used, this `post_update_qa_scorecard_with_metadata` interceptor runs after the + `post_update_qa_scorecard` interceptor. The (possibly modified) response returned by + `post_update_qa_scorecard` will be passed to + `post_update_qa_scorecard_with_metadata`. + """ + return response, metadata + def pre_update_settings( self, request: contact_center_insights.UpdateSettingsRequest, @@ -2373,12 +3818,35 @@ def pre_update_settings( def post_update_settings(self, response: resources.Settings) -> resources.Settings: """Post-rpc interceptor for update_settings - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_settings_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_update_settings` interceptor runs + before the `post_update_settings_with_metadata` interceptor. """ return response + def post_update_settings_with_metadata( + self, + response: resources.Settings, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.Settings, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_settings + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_update_settings_with_metadata` + interceptor in new development instead of the `post_update_settings` interceptor. + When both interceptors are used, this `post_update_settings_with_metadata` interceptor runs after the + `post_update_settings` interceptor. The (possibly modified) response returned by + `post_update_settings` will be passed to + `post_update_settings_with_metadata`. + """ + return response, metadata + def pre_update_view( self, request: contact_center_insights.UpdateViewRequest, @@ -2397,12 +3865,35 @@ def pre_update_view( def post_update_view(self, response: resources.View) -> resources.View: """Post-rpc interceptor for update_view - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_view_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_update_view` interceptor runs + before the `post_update_view_with_metadata` interceptor. """ return response + def post_update_view_with_metadata( + self, + response: resources.View, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.View, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_view + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_update_view_with_metadata` + interceptor in new development instead of the `post_update_view` interceptor. + When both interceptors are used, this `post_update_view_with_metadata` interceptor runs after the + `post_update_view` interceptor. The (possibly modified) response returned by + `post_update_view` will be passed to + `post_update_view_with_metadata`. + """ + return response, metadata + def pre_upload_conversation( self, request: contact_center_insights.UploadConversationRequest, @@ -2423,12 +3914,35 @@ def post_upload_conversation( ) -> operations_pb2.Operation: """Post-rpc interceptor for upload_conversation - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_upload_conversation_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContactCenterInsights server but before - it is returned to user code. + it is returned to user code. This `post_upload_conversation` interceptor runs + before the `post_upload_conversation_with_metadata` interceptor. """ return response + def post_upload_conversation_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 upload_conversation + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContactCenterInsights server but before it is returned to user code. + + We recommend only using this `post_upload_conversation_with_metadata` + interceptor in new development instead of the `post_upload_conversation` interceptor. + When both interceptors are used, this `post_upload_conversation_with_metadata` interceptor runs after the + `post_upload_conversation` interceptor. The (possibly modified) response returned by + `post_upload_conversation` will be passed to + `post_upload_conversation_with_metadata`. + """ + return response, metadata + def pre_cancel_operation( self, request: operations_pb2.CancelOperationRequest, @@ -2766,6 +4280,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_bulk_analyze_conversations(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_bulk_analyze_conversations_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2917,6 +4435,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_bulk_delete_conversations(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_bulk_delete_conversations_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3069,6 +4591,13 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_bulk_download_feedback_labels(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_bulk_download_feedback_labels_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3221,6 +4750,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_bulk_upload_feedback_labels(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_bulk_upload_feedback_labels_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3368,6 +4901,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_calculate_issue_model_stats(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_calculate_issue_model_stats_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3514,6 +5051,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_calculate_stats(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_calculate_stats_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3664,6 +5205,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_analysis(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_analysis_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3826,6 +5371,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_analysis_rule(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_analysis_rule_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3977,6 +5526,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_conversation(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_conversation_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4131,6 +5684,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_feedback_label(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_feedback_label_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4283,6 +5840,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_issue_model(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_issue_model_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4434,6 +5995,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_phrase_matcher(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_phrase_matcher_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4588,6 +6153,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_qa_question(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_qa_question_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4743,6 +6312,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_qa_scorecard(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_qa_scorecard_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4904,6 +6477,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_qa_scorecard_revision(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_qa_scorecard_revision_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5051,6 +6628,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_view(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_view_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5746,6 +7327,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_issue_model(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_issue_model_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6452,6 +8037,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_deploy_issue_model(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_deploy_issue_model_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6613,6 +8202,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_deploy_qa_scorecard_revision(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_deploy_qa_scorecard_revision_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6765,6 +8358,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_export_insights_data(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_export_insights_data_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6917,6 +8514,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_export_issue_model(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_export_issue_model_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -7058,6 +8659,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_analysis(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_analysis_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -7214,6 +8819,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_analysis_rule(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_analysis_rule_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -7359,6 +8968,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_conversation(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_conversation_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -7508,6 +9121,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_encryption_spec(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_encryption_spec_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -7656,6 +9273,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_feedback_label(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_feedback_label_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -7797,6 +9418,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_issue(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_issue_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -7938,6 +9563,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_issue_model(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_issue_model_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -8084,6 +9713,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_phrase_matcher(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_phrase_matcher_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -8227,6 +9860,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_qa_question(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_qa_question_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -8374,6 +10011,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_qa_scorecard(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_qa_scorecard_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -8528,6 +10169,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_qa_scorecard_revision(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_qa_scorecard_revision_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -8676,6 +10321,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_settings(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_settings_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -8817,6 +10466,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_view(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_view_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -8969,6 +10622,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_import_issue_model(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_import_issue_model_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -9121,6 +10778,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_ingest_conversations(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_ingest_conversations_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -9273,6 +10934,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_initialize_encryption_spec(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_initialize_encryption_spec_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -9421,6 +11086,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_all_feedback_labels(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_all_feedback_labels_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -9566,6 +11235,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_analyses(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_analyses_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -9713,6 +11386,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_analysis_rules(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_analysis_rules_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -9864,6 +11541,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_conversations(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_conversations_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -10016,6 +11697,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_feedback_labels(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_feedback_labels_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -10165,6 +11850,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_issue_models(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_issue_models_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -10310,6 +11999,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_issues(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_issues_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -10459,6 +12152,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_phrase_matchers(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_phrase_matchers_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -10610,6 +12307,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_qa_questions(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_qa_questions_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -10760,6 +12461,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_qa_scorecard_revisions(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_qa_scorecard_revisions_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -10909,6 +12614,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_qa_scorecards(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_qa_scorecards_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -11054,6 +12763,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_views(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_views_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -11204,6 +12917,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_query_metrics(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_query_metrics_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -11356,6 +13073,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_tune_qa_scorecard_revision(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_tune_qa_scorecard_revision_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -11509,6 +13230,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_undeploy_issue_model(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_undeploy_issue_model_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -11672,6 +13397,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_undeploy_qa_scorecard_revision(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_undeploy_qa_scorecard_revision_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -11834,6 +13566,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_analysis_rule(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_analysis_rule_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -11985,6 +13721,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_conversation(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_conversation_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -12139,6 +13879,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_feedback_label(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_feedback_label_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -12286,6 +14030,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_issue(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_issue_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -12437,6 +14185,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_issue_model(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_issue_model_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -12589,6 +14341,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_phrase_matcher(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_phrase_matcher_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -12743,6 +14499,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_qa_question(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_qa_question_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -12898,6 +14658,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_qa_scorecard(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_qa_scorecard_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -13052,6 +14816,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_settings(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_settings_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -13199,6 +14967,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_view(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_view_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -13351,6 +15123,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_upload_conversation(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_upload_conversation_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-contact-center-insights/samples/generated_samples/snippet_metadata_google.cloud.contactcenterinsights.v1.json b/packages/google-cloud-contact-center-insights/samples/generated_samples/snippet_metadata_google.cloud.contactcenterinsights.v1.json index aebdfd8f5ae2..53fac2587492 100644 --- a/packages/google-cloud-contact-center-insights/samples/generated_samples/snippet_metadata_google.cloud.contactcenterinsights.v1.json +++ b/packages/google-cloud-contact-center-insights/samples/generated_samples/snippet_metadata_google.cloud.contactcenterinsights.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-contact-center-insights", - "version": "1.22.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-contact-center-insights/tests/unit/gapic/contact_center_insights_v1/test_contact_center_insights.py b/packages/google-cloud-contact-center-insights/tests/unit/gapic/contact_center_insights_v1/test_contact_center_insights.py index ffa9a9013565..8fb1f5ca0bba 100644 --- a/packages/google-cloud-contact-center-insights/tests/unit/gapic/contact_center_insights_v1/test_contact_center_insights.py +++ b/packages/google-cloud-contact-center-insights/tests/unit/gapic/contact_center_insights_v1/test_contact_center_insights.py @@ -80,6 +80,13 @@ 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 @@ -355,6 +362,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 = ContactCenterInsightsClient(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 = ContactCenterInsightsClient(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", [ @@ -47072,10 +47122,14 @@ def test_create_conversation_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_create_conversation" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_create_conversation_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_create_conversation" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.CreateConversationRequest.pb( contact_center_insights.CreateConversationRequest() ) @@ -47099,6 +47153,7 @@ def test_create_conversation_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Conversation() + post_with_metadata.return_value = resources.Conversation(), metadata client.create_conversation( request, @@ -47110,6 +47165,7 @@ def test_create_conversation_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_upload_conversation_rest_bad_request( @@ -47190,10 +47246,14 @@ def test_upload_conversation_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_upload_conversation" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_upload_conversation_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_upload_conversation" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.UploadConversationRequest.pb( contact_center_insights.UploadConversationRequest() ) @@ -47217,6 +47277,7 @@ def test_upload_conversation_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.upload_conversation( request, @@ -47228,6 +47289,7 @@ def test_upload_conversation_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_conversation_rest_bad_request( @@ -47659,10 +47721,14 @@ def test_update_conversation_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_update_conversation" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_update_conversation_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_update_conversation" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.UpdateConversationRequest.pb( contact_center_insights.UpdateConversationRequest() ) @@ -47686,6 +47752,7 @@ def test_update_conversation_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Conversation() + post_with_metadata.return_value = resources.Conversation(), metadata client.update_conversation( request, @@ -47697,6 +47764,7 @@ def test_update_conversation_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_conversation_rest_bad_request( @@ -47793,10 +47861,14 @@ def test_get_conversation_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_get_conversation" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_get_conversation_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_get_conversation" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.GetConversationRequest.pb( contact_center_insights.GetConversationRequest() ) @@ -47820,6 +47892,7 @@ def test_get_conversation_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Conversation() + post_with_metadata.return_value = resources.Conversation(), metadata client.get_conversation( request, @@ -47831,6 +47904,7 @@ def test_get_conversation_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_conversations_rest_bad_request( @@ -47917,10 +47991,14 @@ def test_list_conversations_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_list_conversations" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_list_conversations_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_list_conversations" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.ListConversationsRequest.pb( contact_center_insights.ListConversationsRequest() ) @@ -47946,6 +48024,10 @@ def test_list_conversations_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = contact_center_insights.ListConversationsResponse() + post_with_metadata.return_value = ( + contact_center_insights.ListConversationsResponse(), + metadata, + ) client.list_conversations( request, @@ -47957,6 +48039,7 @@ def test_list_conversations_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_conversation_rest_bad_request( @@ -48350,10 +48433,14 @@ def test_create_analysis_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_create_analysis" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_create_analysis_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_create_analysis" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.CreateAnalysisRequest.pb( contact_center_insights.CreateAnalysisRequest() ) @@ -48377,6 +48464,7 @@ def test_create_analysis_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_analysis( request, @@ -48388,6 +48476,7 @@ def test_create_analysis_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_analysis_rest_bad_request( @@ -48476,10 +48565,14 @@ def test_get_analysis_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_get_analysis" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_get_analysis_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_get_analysis" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.GetAnalysisRequest.pb( contact_center_insights.GetAnalysisRequest() ) @@ -48503,6 +48596,7 @@ def test_get_analysis_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Analysis() + post_with_metadata.return_value = resources.Analysis(), metadata client.get_analysis( request, @@ -48514,6 +48608,7 @@ def test_get_analysis_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_analyses_rest_bad_request( @@ -48602,10 +48697,14 @@ def test_list_analyses_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_list_analyses" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_list_analyses_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_list_analyses" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.ListAnalysesRequest.pb( contact_center_insights.ListAnalysesRequest() ) @@ -48631,6 +48730,10 @@ def test_list_analyses_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = contact_center_insights.ListAnalysesResponse() + post_with_metadata.return_value = ( + contact_center_insights.ListAnalysesResponse(), + metadata, + ) client.list_analyses( request, @@ -48642,6 +48745,7 @@ def test_list_analyses_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_analysis_rest_bad_request( @@ -48836,11 +48940,15 @@ def test_bulk_analyze_conversations_rest_interceptors(null_interceptor): transports.ContactCenterInsightsRestInterceptor, "post_bulk_analyze_conversations", ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_bulk_analyze_conversations_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_bulk_analyze_conversations", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.BulkAnalyzeConversationsRequest.pb( contact_center_insights.BulkAnalyzeConversationsRequest() ) @@ -48864,6 +48972,7 @@ def test_bulk_analyze_conversations_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.bulk_analyze_conversations( request, @@ -48875,6 +48984,7 @@ def test_bulk_analyze_conversations_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_bulk_delete_conversations_rest_bad_request( @@ -48956,10 +49066,14 @@ def test_bulk_delete_conversations_rest_interceptors(null_interceptor): transports.ContactCenterInsightsRestInterceptor, "post_bulk_delete_conversations", ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_bulk_delete_conversations_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_bulk_delete_conversations" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.BulkDeleteConversationsRequest.pb( contact_center_insights.BulkDeleteConversationsRequest() ) @@ -48983,6 +49097,7 @@ def test_bulk_delete_conversations_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.bulk_delete_conversations( request, @@ -48994,6 +49109,7 @@ def test_bulk_delete_conversations_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_ingest_conversations_rest_bad_request( @@ -49074,10 +49190,14 @@ def test_ingest_conversations_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_ingest_conversations" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_ingest_conversations_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_ingest_conversations" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.IngestConversationsRequest.pb( contact_center_insights.IngestConversationsRequest() ) @@ -49101,6 +49221,7 @@ def test_ingest_conversations_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.ingest_conversations( request, @@ -49112,6 +49233,7 @@ def test_ingest_conversations_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_export_insights_data_rest_bad_request( @@ -49192,10 +49314,14 @@ def test_export_insights_data_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_export_insights_data" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_export_insights_data_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_export_insights_data" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.ExportInsightsDataRequest.pb( contact_center_insights.ExportInsightsDataRequest() ) @@ -49219,6 +49345,7 @@ def test_export_insights_data_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.export_insights_data( request, @@ -49230,6 +49357,7 @@ def test_export_insights_data_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_issue_model_rest_bad_request( @@ -49399,10 +49527,14 @@ def test_create_issue_model_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_create_issue_model" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_create_issue_model_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_create_issue_model" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.CreateIssueModelRequest.pb( contact_center_insights.CreateIssueModelRequest() ) @@ -49426,6 +49558,7 @@ def test_create_issue_model_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_issue_model( request, @@ -49437,6 +49570,7 @@ def test_create_issue_model_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_issue_model_rest_bad_request( @@ -49628,10 +49762,14 @@ def test_update_issue_model_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_update_issue_model" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_update_issue_model_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_update_issue_model" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.UpdateIssueModelRequest.pb( contact_center_insights.UpdateIssueModelRequest() ) @@ -49655,6 +49793,7 @@ def test_update_issue_model_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.IssueModel() + post_with_metadata.return_value = resources.IssueModel(), metadata client.update_issue_model( request, @@ -49666,6 +49805,7 @@ def test_update_issue_model_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_issue_model_rest_bad_request( @@ -49760,10 +49900,14 @@ def test_get_issue_model_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_get_issue_model" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_get_issue_model_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_get_issue_model" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.GetIssueModelRequest.pb( contact_center_insights.GetIssueModelRequest() ) @@ -49787,6 +49931,7 @@ def test_get_issue_model_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.IssueModel() + post_with_metadata.return_value = resources.IssueModel(), metadata client.get_issue_model( request, @@ -49798,6 +49943,7 @@ def test_get_issue_model_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_issue_models_rest_bad_request( @@ -49879,10 +50025,14 @@ def test_list_issue_models_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_list_issue_models" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_list_issue_models_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_list_issue_models" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.ListIssueModelsRequest.pb( contact_center_insights.ListIssueModelsRequest() ) @@ -49908,6 +50058,10 @@ def test_list_issue_models_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = contact_center_insights.ListIssueModelsResponse() + post_with_metadata.return_value = ( + contact_center_insights.ListIssueModelsResponse(), + metadata, + ) client.list_issue_models( request, @@ -49919,6 +50073,7 @@ def test_list_issue_models_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_issue_model_rest_bad_request( @@ -49999,10 +50154,14 @@ def test_delete_issue_model_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_delete_issue_model" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_delete_issue_model_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_delete_issue_model" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.DeleteIssueModelRequest.pb( contact_center_insights.DeleteIssueModelRequest() ) @@ -50026,6 +50185,7 @@ def test_delete_issue_model_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_issue_model( request, @@ -50037,6 +50197,7 @@ def test_delete_issue_model_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_deploy_issue_model_rest_bad_request( @@ -50117,10 +50278,14 @@ def test_deploy_issue_model_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_deploy_issue_model" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_deploy_issue_model_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_deploy_issue_model" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.DeployIssueModelRequest.pb( contact_center_insights.DeployIssueModelRequest() ) @@ -50144,6 +50309,7 @@ def test_deploy_issue_model_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.deploy_issue_model( request, @@ -50155,6 +50321,7 @@ def test_deploy_issue_model_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_undeploy_issue_model_rest_bad_request( @@ -50235,10 +50402,14 @@ def test_undeploy_issue_model_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_undeploy_issue_model" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_undeploy_issue_model_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_undeploy_issue_model" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.UndeployIssueModelRequest.pb( contact_center_insights.UndeployIssueModelRequest() ) @@ -50262,6 +50433,7 @@ def test_undeploy_issue_model_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.undeploy_issue_model( request, @@ -50273,6 +50445,7 @@ def test_undeploy_issue_model_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_export_issue_model_rest_bad_request( @@ -50353,10 +50526,14 @@ def test_export_issue_model_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_export_issue_model" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_export_issue_model_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_export_issue_model" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.ExportIssueModelRequest.pb( contact_center_insights.ExportIssueModelRequest() ) @@ -50380,6 +50557,7 @@ def test_export_issue_model_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.export_issue_model( request, @@ -50391,6 +50569,7 @@ def test_export_issue_model_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_import_issue_model_rest_bad_request( @@ -50471,10 +50650,14 @@ def test_import_issue_model_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_import_issue_model" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_import_issue_model_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_import_issue_model" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.ImportIssueModelRequest.pb( contact_center_insights.ImportIssueModelRequest() ) @@ -50498,6 +50681,7 @@ def test_import_issue_model_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_issue_model( request, @@ -50509,6 +50693,7 @@ def test_import_issue_model_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_issue_rest_bad_request( @@ -50603,10 +50788,13 @@ def test_get_issue_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_get_issue" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, "post_get_issue_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_get_issue" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.GetIssueRequest.pb( contact_center_insights.GetIssueRequest() ) @@ -50630,6 +50818,7 @@ def test_get_issue_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Issue() + post_with_metadata.return_value = resources.Issue(), metadata client.get_issue( request, @@ -50641,6 +50830,7 @@ def test_get_issue_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_issues_rest_bad_request( @@ -50722,10 +50912,14 @@ def test_list_issues_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_list_issues" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_list_issues_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_list_issues" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.ListIssuesRequest.pb( contact_center_insights.ListIssuesRequest() ) @@ -50751,6 +50945,10 @@ def test_list_issues_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = contact_center_insights.ListIssuesResponse() + post_with_metadata.return_value = ( + contact_center_insights.ListIssuesResponse(), + metadata, + ) client.list_issues( request, @@ -50762,6 +50960,7 @@ def test_list_issues_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_issue_rest_bad_request( @@ -50935,10 +51134,14 @@ def test_update_issue_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_update_issue" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_update_issue_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_update_issue" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.UpdateIssueRequest.pb( contact_center_insights.UpdateIssueRequest() ) @@ -50962,6 +51165,7 @@ def test_update_issue_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Issue() + post_with_metadata.return_value = resources.Issue(), metadata client.update_issue( request, @@ -50973,6 +51177,7 @@ def test_update_issue_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_issue_rest_bad_request( @@ -51176,11 +51381,15 @@ def test_calculate_issue_model_stats_rest_interceptors(null_interceptor): transports.ContactCenterInsightsRestInterceptor, "post_calculate_issue_model_stats", ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_calculate_issue_model_stats_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_calculate_issue_model_stats", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.CalculateIssueModelStatsRequest.pb( contact_center_insights.CalculateIssueModelStatsRequest() ) @@ -51206,6 +51415,10 @@ def test_calculate_issue_model_stats_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = contact_center_insights.CalculateIssueModelStatsResponse() + post_with_metadata.return_value = ( + contact_center_insights.CalculateIssueModelStatsResponse(), + metadata, + ) client.calculate_issue_model_stats( request, @@ -51217,6 +51430,7 @@ def test_calculate_issue_model_stats_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_phrase_matcher_rest_bad_request( @@ -51406,10 +51620,14 @@ def test_create_phrase_matcher_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_create_phrase_matcher" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_create_phrase_matcher_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_create_phrase_matcher" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.CreatePhraseMatcherRequest.pb( contact_center_insights.CreatePhraseMatcherRequest() ) @@ -51433,6 +51651,7 @@ def test_create_phrase_matcher_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.PhraseMatcher() + post_with_metadata.return_value = resources.PhraseMatcher(), metadata client.create_phrase_matcher( request, @@ -51444,6 +51663,7 @@ def test_create_phrase_matcher_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_phrase_matcher_rest_bad_request( @@ -51540,10 +51760,14 @@ def test_get_phrase_matcher_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_get_phrase_matcher" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_get_phrase_matcher_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_get_phrase_matcher" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.GetPhraseMatcherRequest.pb( contact_center_insights.GetPhraseMatcherRequest() ) @@ -51567,6 +51791,7 @@ def test_get_phrase_matcher_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.PhraseMatcher() + post_with_metadata.return_value = resources.PhraseMatcher(), metadata client.get_phrase_matcher( request, @@ -51578,6 +51803,7 @@ def test_get_phrase_matcher_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_phrase_matchers_rest_bad_request( @@ -51664,10 +51890,14 @@ def test_list_phrase_matchers_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_list_phrase_matchers" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_list_phrase_matchers_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_list_phrase_matchers" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.ListPhraseMatchersRequest.pb( contact_center_insights.ListPhraseMatchersRequest() ) @@ -51693,6 +51923,10 @@ def test_list_phrase_matchers_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = contact_center_insights.ListPhraseMatchersResponse() + post_with_metadata.return_value = ( + contact_center_insights.ListPhraseMatchersResponse(), + metadata, + ) client.list_phrase_matchers( request, @@ -51704,6 +51938,7 @@ def test_list_phrase_matchers_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_phrase_matcher_rest_bad_request( @@ -52010,10 +52245,14 @@ def test_update_phrase_matcher_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_update_phrase_matcher" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_update_phrase_matcher_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_update_phrase_matcher" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.UpdatePhraseMatcherRequest.pb( contact_center_insights.UpdatePhraseMatcherRequest() ) @@ -52037,6 +52276,7 @@ def test_update_phrase_matcher_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.PhraseMatcher() + post_with_metadata.return_value = resources.PhraseMatcher(), metadata client.update_phrase_matcher( request, @@ -52048,6 +52288,7 @@ def test_update_phrase_matcher_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_calculate_stats_rest_bad_request( @@ -52134,10 +52375,14 @@ def test_calculate_stats_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_calculate_stats" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_calculate_stats_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_calculate_stats" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.CalculateStatsRequest.pb( contact_center_insights.CalculateStatsRequest() ) @@ -52163,6 +52408,10 @@ def test_calculate_stats_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = contact_center_insights.CalculateStatsResponse() + post_with_metadata.return_value = ( + contact_center_insights.CalculateStatsResponse(), + metadata, + ) client.calculate_stats( request, @@ -52174,6 +52423,7 @@ def test_calculate_stats_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_settings_rest_bad_request( @@ -52260,10 +52510,14 @@ def test_get_settings_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_get_settings" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_get_settings_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_get_settings" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.GetSettingsRequest.pb( contact_center_insights.GetSettingsRequest() ) @@ -52287,6 +52541,7 @@ def test_get_settings_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Settings() + post_with_metadata.return_value = resources.Settings(), metadata client.get_settings( request, @@ -52298,6 +52553,7 @@ def test_get_settings_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_settings_rest_bad_request( @@ -52493,10 +52749,14 @@ def test_update_settings_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_update_settings" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_update_settings_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_update_settings" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.UpdateSettingsRequest.pb( contact_center_insights.UpdateSettingsRequest() ) @@ -52520,6 +52780,7 @@ def test_update_settings_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Settings() + post_with_metadata.return_value = resources.Settings(), metadata client.update_settings( request, @@ -52531,6 +52792,7 @@ def test_update_settings_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_analysis_rule_rest_bad_request( @@ -52726,10 +52988,14 @@ def test_create_analysis_rule_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_create_analysis_rule" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_create_analysis_rule_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_create_analysis_rule" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.CreateAnalysisRuleRequest.pb( contact_center_insights.CreateAnalysisRuleRequest() ) @@ -52753,6 +53019,7 @@ def test_create_analysis_rule_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.AnalysisRule() + post_with_metadata.return_value = resources.AnalysisRule(), metadata client.create_analysis_rule( request, @@ -52764,6 +53031,7 @@ def test_create_analysis_rule_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_analysis_rule_rest_bad_request( @@ -52856,10 +53124,14 @@ def test_get_analysis_rule_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_get_analysis_rule" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_get_analysis_rule_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_get_analysis_rule" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.GetAnalysisRuleRequest.pb( contact_center_insights.GetAnalysisRuleRequest() ) @@ -52883,6 +53155,7 @@ def test_get_analysis_rule_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.AnalysisRule() + post_with_metadata.return_value = resources.AnalysisRule(), metadata client.get_analysis_rule( request, @@ -52894,6 +53167,7 @@ def test_get_analysis_rule_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_analysis_rules_rest_bad_request( @@ -52980,10 +53254,14 @@ def test_list_analysis_rules_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_list_analysis_rules" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_list_analysis_rules_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_list_analysis_rules" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.ListAnalysisRulesRequest.pb( contact_center_insights.ListAnalysisRulesRequest() ) @@ -53009,6 +53287,10 @@ def test_list_analysis_rules_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = contact_center_insights.ListAnalysisRulesResponse() + post_with_metadata.return_value = ( + contact_center_insights.ListAnalysisRulesResponse(), + metadata, + ) client.list_analysis_rules( request, @@ -53020,6 +53302,7 @@ def test_list_analysis_rules_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_analysis_rule_rest_bad_request( @@ -53223,10 +53506,14 @@ def test_update_analysis_rule_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_update_analysis_rule" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_update_analysis_rule_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_update_analysis_rule" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.UpdateAnalysisRuleRequest.pb( contact_center_insights.UpdateAnalysisRuleRequest() ) @@ -53250,6 +53537,7 @@ def test_update_analysis_rule_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.AnalysisRule() + post_with_metadata.return_value = resources.AnalysisRule(), metadata client.update_analysis_rule( request, @@ -53261,6 +53549,7 @@ def test_update_analysis_rule_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_analysis_rule_rest_bad_request( @@ -53456,10 +53745,14 @@ def test_get_encryption_spec_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_get_encryption_spec" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_get_encryption_spec_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_get_encryption_spec" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.GetEncryptionSpecRequest.pb( contact_center_insights.GetEncryptionSpecRequest() ) @@ -53483,6 +53776,7 @@ def test_get_encryption_spec_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.EncryptionSpec() + post_with_metadata.return_value = resources.EncryptionSpec(), metadata client.get_encryption_spec( request, @@ -53494,6 +53788,7 @@ def test_get_encryption_spec_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_initialize_encryption_spec_rest_bad_request( @@ -53579,11 +53874,15 @@ def test_initialize_encryption_spec_rest_interceptors(null_interceptor): transports.ContactCenterInsightsRestInterceptor, "post_initialize_encryption_spec", ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_initialize_encryption_spec_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_initialize_encryption_spec", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.InitializeEncryptionSpecRequest.pb( contact_center_insights.InitializeEncryptionSpecRequest() ) @@ -53607,6 +53906,7 @@ def test_initialize_encryption_spec_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.initialize_encryption_spec( request, @@ -53618,6 +53918,7 @@ def test_initialize_encryption_spec_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_view_rest_bad_request( @@ -53780,10 +54081,14 @@ def test_create_view_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_create_view" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_create_view_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_create_view" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.CreateViewRequest.pb( contact_center_insights.CreateViewRequest() ) @@ -53807,6 +54112,7 @@ def test_create_view_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.View() + post_with_metadata.return_value = resources.View(), metadata client.create_view( request, @@ -53818,6 +54124,7 @@ def test_create_view_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_view_rest_bad_request(request_type=contact_center_insights.GetViewRequest): @@ -53904,10 +54211,13 @@ def test_get_view_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_get_view" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, "post_get_view_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_get_view" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.GetViewRequest.pb( contact_center_insights.GetViewRequest() ) @@ -53931,6 +54241,7 @@ def test_get_view_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.View() + post_with_metadata.return_value = resources.View(), metadata client.get_view( request, @@ -53942,6 +54253,7 @@ def test_get_view_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_views_rest_bad_request( @@ -54026,10 +54338,13 @@ def test_list_views_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_list_views" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, "post_list_views_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_list_views" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.ListViewsRequest.pb( contact_center_insights.ListViewsRequest() ) @@ -54055,6 +54370,10 @@ def test_list_views_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = contact_center_insights.ListViewsResponse() + post_with_metadata.return_value = ( + contact_center_insights.ListViewsResponse(), + metadata, + ) client.list_views( request, @@ -54066,6 +54385,7 @@ def test_list_views_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_view_rest_bad_request( @@ -54232,10 +54552,14 @@ def test_update_view_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_update_view" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_update_view_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_update_view" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.UpdateViewRequest.pb( contact_center_insights.UpdateViewRequest() ) @@ -54259,6 +54583,7 @@ def test_update_view_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.View() + post_with_metadata.return_value = resources.View(), metadata client.update_view( request, @@ -54270,6 +54595,7 @@ def test_update_view_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_view_rest_bad_request( @@ -54459,10 +54785,14 @@ def test_query_metrics_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_query_metrics" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_query_metrics_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_query_metrics" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.QueryMetricsRequest.pb( contact_center_insights.QueryMetricsRequest() ) @@ -54486,6 +54816,7 @@ def test_query_metrics_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.query_metrics( request, @@ -54497,6 +54828,7 @@ def test_query_metrics_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_qa_question_rest_bad_request( @@ -54690,10 +55022,14 @@ def test_create_qa_question_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_create_qa_question" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_create_qa_question_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_create_qa_question" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.CreateQaQuestionRequest.pb( contact_center_insights.CreateQaQuestionRequest() ) @@ -54717,6 +55053,7 @@ def test_create_qa_question_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.QaQuestion() + post_with_metadata.return_value = resources.QaQuestion(), metadata client.create_qa_question( request, @@ -54728,6 +55065,7 @@ def test_create_qa_question_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_qa_question_rest_bad_request( @@ -54826,10 +55164,14 @@ def test_get_qa_question_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_get_qa_question" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_get_qa_question_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_get_qa_question" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.GetQaQuestionRequest.pb( contact_center_insights.GetQaQuestionRequest() ) @@ -54853,6 +55195,7 @@ def test_get_qa_question_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.QaQuestion() + post_with_metadata.return_value = resources.QaQuestion(), metadata client.get_qa_question( request, @@ -54864,6 +55207,7 @@ def test_get_qa_question_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_qa_question_rest_bad_request( @@ -55061,10 +55405,14 @@ def test_update_qa_question_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_update_qa_question" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_update_qa_question_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_update_qa_question" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.UpdateQaQuestionRequest.pb( contact_center_insights.UpdateQaQuestionRequest() ) @@ -55088,6 +55436,7 @@ def test_update_qa_question_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.QaQuestion() + post_with_metadata.return_value = resources.QaQuestion(), metadata client.update_qa_question( request, @@ -55099,6 +55448,7 @@ def test_update_qa_question_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_qa_question_rest_bad_request( @@ -55300,10 +55650,14 @@ def test_list_qa_questions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_list_qa_questions" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_list_qa_questions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_list_qa_questions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.ListQaQuestionsRequest.pb( contact_center_insights.ListQaQuestionsRequest() ) @@ -55329,6 +55683,10 @@ def test_list_qa_questions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = contact_center_insights.ListQaQuestionsResponse() + post_with_metadata.return_value = ( + contact_center_insights.ListQaQuestionsResponse(), + metadata, + ) client.list_qa_questions( request, @@ -55340,6 +55698,7 @@ def test_list_qa_questions_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_qa_scorecard_rest_bad_request( @@ -55504,10 +55863,14 @@ def test_create_qa_scorecard_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_create_qa_scorecard" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_create_qa_scorecard_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_create_qa_scorecard" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.CreateQaScorecardRequest.pb( contact_center_insights.CreateQaScorecardRequest() ) @@ -55531,6 +55894,7 @@ def test_create_qa_scorecard_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.QaScorecard() + post_with_metadata.return_value = resources.QaScorecard(), metadata client.create_qa_scorecard( request, @@ -55542,6 +55906,7 @@ def test_create_qa_scorecard_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_qa_scorecard_rest_bad_request( @@ -55630,10 +55995,14 @@ def test_get_qa_scorecard_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_get_qa_scorecard" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_get_qa_scorecard_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_get_qa_scorecard" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.GetQaScorecardRequest.pb( contact_center_insights.GetQaScorecardRequest() ) @@ -55657,6 +56026,7 @@ def test_get_qa_scorecard_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.QaScorecard() + post_with_metadata.return_value = resources.QaScorecard(), metadata client.get_qa_scorecard( request, @@ -55668,6 +56038,7 @@ def test_get_qa_scorecard_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_qa_scorecard_rest_bad_request( @@ -55840,10 +56211,14 @@ def test_update_qa_scorecard_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_update_qa_scorecard" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_update_qa_scorecard_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_update_qa_scorecard" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.UpdateQaScorecardRequest.pb( contact_center_insights.UpdateQaScorecardRequest() ) @@ -55867,6 +56242,7 @@ def test_update_qa_scorecard_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.QaScorecard() + post_with_metadata.return_value = resources.QaScorecard(), metadata client.update_qa_scorecard( request, @@ -55878,6 +56254,7 @@ def test_update_qa_scorecard_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_qa_scorecard_rest_bad_request( @@ -56071,10 +56448,14 @@ def test_list_qa_scorecards_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_list_qa_scorecards" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_list_qa_scorecards_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_list_qa_scorecards" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.ListQaScorecardsRequest.pb( contact_center_insights.ListQaScorecardsRequest() ) @@ -56100,6 +56481,10 @@ def test_list_qa_scorecards_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = contact_center_insights.ListQaScorecardsResponse() + post_with_metadata.return_value = ( + contact_center_insights.ListQaScorecardsResponse(), + metadata, + ) client.list_qa_scorecards( request, @@ -56111,6 +56496,7 @@ def test_list_qa_scorecards_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_qa_scorecard_revision_rest_bad_request( @@ -56284,11 +56670,15 @@ def test_create_qa_scorecard_revision_rest_interceptors(null_interceptor): transports.ContactCenterInsightsRestInterceptor, "post_create_qa_scorecard_revision", ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_create_qa_scorecard_revision_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_create_qa_scorecard_revision", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.CreateQaScorecardRevisionRequest.pb( contact_center_insights.CreateQaScorecardRevisionRequest() ) @@ -56314,6 +56704,7 @@ def test_create_qa_scorecard_revision_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.QaScorecardRevision() + post_with_metadata.return_value = resources.QaScorecardRevision(), metadata client.create_qa_scorecard_revision( request, @@ -56325,6 +56716,7 @@ def test_create_qa_scorecard_revision_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_qa_scorecard_revision_rest_bad_request( @@ -56418,10 +56810,14 @@ def test_get_qa_scorecard_revision_rest_interceptors(null_interceptor): transports.ContactCenterInsightsRestInterceptor, "post_get_qa_scorecard_revision", ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_get_qa_scorecard_revision_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_get_qa_scorecard_revision" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.GetQaScorecardRevisionRequest.pb( contact_center_insights.GetQaScorecardRevisionRequest() ) @@ -56447,6 +56843,7 @@ def test_get_qa_scorecard_revision_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.QaScorecardRevision() + post_with_metadata.return_value = resources.QaScorecardRevision(), metadata client.get_qa_scorecard_revision( request, @@ -56458,6 +56855,7 @@ def test_get_qa_scorecard_revision_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_tune_qa_scorecard_revision_rest_bad_request( @@ -56543,11 +56941,15 @@ def test_tune_qa_scorecard_revision_rest_interceptors(null_interceptor): transports.ContactCenterInsightsRestInterceptor, "post_tune_qa_scorecard_revision", ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_tune_qa_scorecard_revision_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_tune_qa_scorecard_revision", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.TuneQaScorecardRevisionRequest.pb( contact_center_insights.TuneQaScorecardRevisionRequest() ) @@ -56571,6 +56973,7 @@ def test_tune_qa_scorecard_revision_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.tune_qa_scorecard_revision( request, @@ -56582,6 +56985,7 @@ def test_tune_qa_scorecard_revision_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_deploy_qa_scorecard_revision_rest_bad_request( @@ -56675,11 +57079,15 @@ def test_deploy_qa_scorecard_revision_rest_interceptors(null_interceptor): transports.ContactCenterInsightsRestInterceptor, "post_deploy_qa_scorecard_revision", ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_deploy_qa_scorecard_revision_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_deploy_qa_scorecard_revision", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.DeployQaScorecardRevisionRequest.pb( contact_center_insights.DeployQaScorecardRevisionRequest() ) @@ -56705,6 +57113,7 @@ def test_deploy_qa_scorecard_revision_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.QaScorecardRevision() + post_with_metadata.return_value = resources.QaScorecardRevision(), metadata client.deploy_qa_scorecard_revision( request, @@ -56716,6 +57125,7 @@ def test_deploy_qa_scorecard_revision_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_undeploy_qa_scorecard_revision_rest_bad_request( @@ -56809,11 +57219,15 @@ def test_undeploy_qa_scorecard_revision_rest_interceptors(null_interceptor): transports.ContactCenterInsightsRestInterceptor, "post_undeploy_qa_scorecard_revision", ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_undeploy_qa_scorecard_revision_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_undeploy_qa_scorecard_revision", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.UndeployQaScorecardRevisionRequest.pb( contact_center_insights.UndeployQaScorecardRevisionRequest() ) @@ -56839,6 +57253,7 @@ def test_undeploy_qa_scorecard_revision_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.QaScorecardRevision() + post_with_metadata.return_value = resources.QaScorecardRevision(), metadata client.undeploy_qa_scorecard_revision( request, @@ -56850,6 +57265,7 @@ def test_undeploy_qa_scorecard_revision_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_qa_scorecard_revision_rest_bad_request( @@ -57051,11 +57467,15 @@ def test_list_qa_scorecard_revisions_rest_interceptors(null_interceptor): transports.ContactCenterInsightsRestInterceptor, "post_list_qa_scorecard_revisions", ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_list_qa_scorecard_revisions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_list_qa_scorecard_revisions", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.ListQaScorecardRevisionsRequest.pb( contact_center_insights.ListQaScorecardRevisionsRequest() ) @@ -57081,6 +57501,10 @@ def test_list_qa_scorecard_revisions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = contact_center_insights.ListQaScorecardRevisionsResponse() + post_with_metadata.return_value = ( + contact_center_insights.ListQaScorecardRevisionsResponse(), + metadata, + ) client.list_qa_scorecard_revisions( request, @@ -57092,6 +57516,7 @@ def test_list_qa_scorecard_revisions_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_feedback_label_rest_bad_request( @@ -57269,10 +57694,14 @@ def test_create_feedback_label_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_create_feedback_label" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_create_feedback_label_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_create_feedback_label" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.CreateFeedbackLabelRequest.pb( contact_center_insights.CreateFeedbackLabelRequest() ) @@ -57296,6 +57725,7 @@ def test_create_feedback_label_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.FeedbackLabel() + post_with_metadata.return_value = resources.FeedbackLabel(), metadata client.create_feedback_label( request, @@ -57307,6 +57737,7 @@ def test_create_feedback_label_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_feedback_labels_rest_bad_request( @@ -57397,10 +57828,14 @@ def test_list_feedback_labels_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_list_feedback_labels" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_list_feedback_labels_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_list_feedback_labels" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.ListFeedbackLabelsRequest.pb( contact_center_insights.ListFeedbackLabelsRequest() ) @@ -57426,6 +57861,10 @@ def test_list_feedback_labels_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = contact_center_insights.ListFeedbackLabelsResponse() + post_with_metadata.return_value = ( + contact_center_insights.ListFeedbackLabelsResponse(), + metadata, + ) client.list_feedback_labels( request, @@ -57437,6 +57876,7 @@ def test_list_feedback_labels_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_feedback_label_rest_bad_request( @@ -57528,10 +57968,14 @@ def test_get_feedback_label_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_get_feedback_label" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_get_feedback_label_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_get_feedback_label" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.GetFeedbackLabelRequest.pb( contact_center_insights.GetFeedbackLabelRequest() ) @@ -57555,6 +57999,7 @@ def test_get_feedback_label_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.FeedbackLabel() + post_with_metadata.return_value = resources.FeedbackLabel(), metadata client.get_feedback_label( request, @@ -57566,6 +58011,7 @@ def test_get_feedback_label_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_feedback_label_rest_bad_request( @@ -57747,10 +58193,14 @@ def test_update_feedback_label_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_update_feedback_label" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_update_feedback_label_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_update_feedback_label" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.UpdateFeedbackLabelRequest.pb( contact_center_insights.UpdateFeedbackLabelRequest() ) @@ -57774,6 +58224,7 @@ def test_update_feedback_label_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.FeedbackLabel() + post_with_metadata.return_value = resources.FeedbackLabel(), metadata client.update_feedback_label( request, @@ -57785,6 +58236,7 @@ def test_update_feedback_label_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_feedback_label_rest_bad_request( @@ -57984,10 +58436,14 @@ def test_list_all_feedback_labels_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "post_list_all_feedback_labels" ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_list_all_feedback_labels_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_list_all_feedback_labels" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.ListAllFeedbackLabelsRequest.pb( contact_center_insights.ListAllFeedbackLabelsRequest() ) @@ -58013,6 +58469,10 @@ def test_list_all_feedback_labels_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = contact_center_insights.ListAllFeedbackLabelsResponse() + post_with_metadata.return_value = ( + contact_center_insights.ListAllFeedbackLabelsResponse(), + metadata, + ) client.list_all_feedback_labels( request, @@ -58024,6 +58484,7 @@ def test_list_all_feedback_labels_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_bulk_upload_feedback_labels_rest_bad_request( @@ -58105,11 +58566,15 @@ def test_bulk_upload_feedback_labels_rest_interceptors(null_interceptor): transports.ContactCenterInsightsRestInterceptor, "post_bulk_upload_feedback_labels", ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_bulk_upload_feedback_labels_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_bulk_upload_feedback_labels", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.BulkUploadFeedbackLabelsRequest.pb( contact_center_insights.BulkUploadFeedbackLabelsRequest() ) @@ -58133,6 +58598,7 @@ def test_bulk_upload_feedback_labels_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.bulk_upload_feedback_labels( request, @@ -58144,6 +58610,7 @@ def test_bulk_upload_feedback_labels_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_bulk_download_feedback_labels_rest_bad_request( @@ -58225,11 +58692,15 @@ def test_bulk_download_feedback_labels_rest_interceptors(null_interceptor): transports.ContactCenterInsightsRestInterceptor, "post_bulk_download_feedback_labels", ) as post, mock.patch.object( + transports.ContactCenterInsightsRestInterceptor, + "post_bulk_download_feedback_labels_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContactCenterInsightsRestInterceptor, "pre_bulk_download_feedback_labels", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = contact_center_insights.BulkDownloadFeedbackLabelsRequest.pb( contact_center_insights.BulkDownloadFeedbackLabelsRequest() ) @@ -58253,6 +58724,7 @@ def test_bulk_download_feedback_labels_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.bulk_download_feedback_labels( request, @@ -58264,6 +58736,7 @@ def test_bulk_download_feedback_labels_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-container/google/cloud/container/gapic_version.py b/packages/google-cloud-container/google/cloud/container/gapic_version.py index eff15f4490b1..558c8aab67c5 100644 --- a/packages/google-cloud-container/google/cloud/container/gapic_version.py +++ b/packages/google-cloud-container/google/cloud/container/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "2.55.1" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-container/google/cloud/container_v1/gapic_version.py b/packages/google-cloud-container/google/cloud/container_v1/gapic_version.py index eff15f4490b1..558c8aab67c5 100644 --- a/packages/google-cloud-container/google/cloud/container_v1/gapic_version.py +++ b/packages/google-cloud-container/google/cloud/container_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "2.55.1" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-container/google/cloud/container_v1/services/cluster_manager/client.py b/packages/google-cloud-container/google/cloud/container_v1/services/cluster_manager/client.py index 06edda889c30..cc44b0c232f4 100644 --- a/packages/google-cloud-container/google/cloud/container_v1/services/cluster_manager/client.py +++ b/packages/google-cloud-container/google/cloud/container_v1/services/cluster_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 @@ -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-container/google/cloud/container_v1/services/cluster_manager/transports/rest.py b/packages/google-cloud-container/google/cloud/container_v1/services/cluster_manager/transports/rest.py index 018d2a0beb06..15c8fec90053 100644 --- a/packages/google-cloud-container/google/cloud/container_v1/services/cluster_manager/transports/rest.py +++ b/packages/google-cloud-container/google/cloud/container_v1/services/cluster_manager/transports/rest.py @@ -373,12 +373,38 @@ def post_check_autopilot_compatibility( ) -> cluster_service.CheckAutopilotCompatibilityResponse: """Post-rpc interceptor for check_autopilot_compatibility - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_check_autopilot_compatibility_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ClusterManager server but before - it is returned to user code. + it is returned to user code. This `post_check_autopilot_compatibility` interceptor runs + before the `post_check_autopilot_compatibility_with_metadata` interceptor. """ return response + def post_check_autopilot_compatibility_with_metadata( + self, + response: cluster_service.CheckAutopilotCompatibilityResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + cluster_service.CheckAutopilotCompatibilityResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for check_autopilot_compatibility + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ClusterManager server but before it is returned to user code. + + We recommend only using this `post_check_autopilot_compatibility_with_metadata` + interceptor in new development instead of the `post_check_autopilot_compatibility` interceptor. + When both interceptors are used, this `post_check_autopilot_compatibility_with_metadata` interceptor runs after the + `post_check_autopilot_compatibility` interceptor. The (possibly modified) response returned by + `post_check_autopilot_compatibility` will be passed to + `post_check_autopilot_compatibility_with_metadata`. + """ + return response, metadata + def pre_complete_ip_rotation( self, request: cluster_service.CompleteIPRotationRequest, @@ -399,12 +425,35 @@ def post_complete_ip_rotation( ) -> cluster_service.Operation: """Post-rpc interceptor for complete_ip_rotation - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_complete_ip_rotation_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ClusterManager server but before - it is returned to user code. + it is returned to user code. This `post_complete_ip_rotation` interceptor runs + before the `post_complete_ip_rotation_with_metadata` interceptor. """ return response + def post_complete_ip_rotation_with_metadata( + self, + response: cluster_service.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cluster_service.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for complete_ip_rotation + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ClusterManager server but before it is returned to user code. + + We recommend only using this `post_complete_ip_rotation_with_metadata` + interceptor in new development instead of the `post_complete_ip_rotation` interceptor. + When both interceptors are used, this `post_complete_ip_rotation_with_metadata` interceptor runs after the + `post_complete_ip_rotation` interceptor. The (possibly modified) response returned by + `post_complete_ip_rotation` will be passed to + `post_complete_ip_rotation_with_metadata`. + """ + return response, metadata + def pre_complete_node_pool_upgrade( self, request: cluster_service.CompleteNodePoolUpgradeRequest, @@ -439,12 +488,35 @@ def post_create_cluster( ) -> cluster_service.Operation: """Post-rpc interceptor for create_cluster - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_cluster_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ClusterManager server but before - it is returned to user code. + it is returned to user code. This `post_create_cluster` interceptor runs + before the `post_create_cluster_with_metadata` interceptor. """ return response + def post_create_cluster_with_metadata( + self, + response: cluster_service.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cluster_service.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_cluster + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ClusterManager server but before it is returned to user code. + + We recommend only using this `post_create_cluster_with_metadata` + interceptor in new development instead of the `post_create_cluster` interceptor. + When both interceptors are used, this `post_create_cluster_with_metadata` interceptor runs after the + `post_create_cluster` interceptor. The (possibly modified) response returned by + `post_create_cluster` will be passed to + `post_create_cluster_with_metadata`. + """ + return response, metadata + def pre_create_node_pool( self, request: cluster_service.CreateNodePoolRequest, @@ -464,12 +536,35 @@ def post_create_node_pool( ) -> cluster_service.Operation: """Post-rpc interceptor for create_node_pool - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_node_pool_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ClusterManager server but before - it is returned to user code. + it is returned to user code. This `post_create_node_pool` interceptor runs + before the `post_create_node_pool_with_metadata` interceptor. """ return response + def post_create_node_pool_with_metadata( + self, + response: cluster_service.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cluster_service.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_node_pool + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ClusterManager server but before it is returned to user code. + + We recommend only using this `post_create_node_pool_with_metadata` + interceptor in new development instead of the `post_create_node_pool` interceptor. + When both interceptors are used, this `post_create_node_pool_with_metadata` interceptor runs after the + `post_create_node_pool` interceptor. The (possibly modified) response returned by + `post_create_node_pool` will be passed to + `post_create_node_pool_with_metadata`. + """ + return response, metadata + def pre_delete_cluster( self, request: cluster_service.DeleteClusterRequest, @@ -489,12 +584,35 @@ def post_delete_cluster( ) -> cluster_service.Operation: """Post-rpc interceptor for delete_cluster - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_cluster_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ClusterManager server but before - it is returned to user code. + it is returned to user code. This `post_delete_cluster` interceptor runs + before the `post_delete_cluster_with_metadata` interceptor. """ return response + def post_delete_cluster_with_metadata( + self, + response: cluster_service.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cluster_service.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_cluster + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ClusterManager server but before it is returned to user code. + + We recommend only using this `post_delete_cluster_with_metadata` + interceptor in new development instead of the `post_delete_cluster` interceptor. + When both interceptors are used, this `post_delete_cluster_with_metadata` interceptor runs after the + `post_delete_cluster` interceptor. The (possibly modified) response returned by + `post_delete_cluster` will be passed to + `post_delete_cluster_with_metadata`. + """ + return response, metadata + def pre_delete_node_pool( self, request: cluster_service.DeleteNodePoolRequest, @@ -514,12 +632,35 @@ def post_delete_node_pool( ) -> cluster_service.Operation: """Post-rpc interceptor for delete_node_pool - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_node_pool_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ClusterManager server but before - it is returned to user code. + it is returned to user code. This `post_delete_node_pool` interceptor runs + before the `post_delete_node_pool_with_metadata` interceptor. """ return response + def post_delete_node_pool_with_metadata( + self, + response: cluster_service.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cluster_service.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_node_pool + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ClusterManager server but before it is returned to user code. + + We recommend only using this `post_delete_node_pool_with_metadata` + interceptor in new development instead of the `post_delete_node_pool` interceptor. + When both interceptors are used, this `post_delete_node_pool_with_metadata` interceptor runs after the + `post_delete_node_pool` interceptor. The (possibly modified) response returned by + `post_delete_node_pool` will be passed to + `post_delete_node_pool_with_metadata`. + """ + return response, metadata + def pre_get_cluster( self, request: cluster_service.GetClusterRequest, @@ -539,12 +680,35 @@ def post_get_cluster( ) -> cluster_service.Cluster: """Post-rpc interceptor for get_cluster - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_cluster_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ClusterManager server but before - it is returned to user code. + it is returned to user code. This `post_get_cluster` interceptor runs + before the `post_get_cluster_with_metadata` interceptor. """ return response + def post_get_cluster_with_metadata( + self, + response: cluster_service.Cluster, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cluster_service.Cluster, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_cluster + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ClusterManager server but before it is returned to user code. + + We recommend only using this `post_get_cluster_with_metadata` + interceptor in new development instead of the `post_get_cluster` interceptor. + When both interceptors are used, this `post_get_cluster_with_metadata` interceptor runs after the + `post_get_cluster` interceptor. The (possibly modified) response returned by + `post_get_cluster` will be passed to + `post_get_cluster_with_metadata`. + """ + return response, metadata + def pre_get_json_web_keys( self, request: cluster_service.GetJSONWebKeysRequest, @@ -564,12 +728,37 @@ def post_get_json_web_keys( ) -> cluster_service.GetJSONWebKeysResponse: """Post-rpc interceptor for get_json_web_keys - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_json_web_keys_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ClusterManager server but before - it is returned to user code. + it is returned to user code. This `post_get_json_web_keys` interceptor runs + before the `post_get_json_web_keys_with_metadata` interceptor. """ return response + def post_get_json_web_keys_with_metadata( + self, + response: cluster_service.GetJSONWebKeysResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + cluster_service.GetJSONWebKeysResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_json_web_keys + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ClusterManager server but before it is returned to user code. + + We recommend only using this `post_get_json_web_keys_with_metadata` + interceptor in new development instead of the `post_get_json_web_keys` interceptor. + When both interceptors are used, this `post_get_json_web_keys_with_metadata` interceptor runs after the + `post_get_json_web_keys` interceptor. The (possibly modified) response returned by + `post_get_json_web_keys` will be passed to + `post_get_json_web_keys_with_metadata`. + """ + return response, metadata + def pre_get_node_pool( self, request: cluster_service.GetNodePoolRequest, @@ -589,12 +778,35 @@ def post_get_node_pool( ) -> cluster_service.NodePool: """Post-rpc interceptor for get_node_pool - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_node_pool_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ClusterManager server but before - it is returned to user code. + it is returned to user code. This `post_get_node_pool` interceptor runs + before the `post_get_node_pool_with_metadata` interceptor. """ return response + def post_get_node_pool_with_metadata( + self, + response: cluster_service.NodePool, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cluster_service.NodePool, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_node_pool + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ClusterManager server but before it is returned to user code. + + We recommend only using this `post_get_node_pool_with_metadata` + interceptor in new development instead of the `post_get_node_pool` interceptor. + When both interceptors are used, this `post_get_node_pool_with_metadata` interceptor runs after the + `post_get_node_pool` interceptor. The (possibly modified) response returned by + `post_get_node_pool` will be passed to + `post_get_node_pool_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: cluster_service.GetOperationRequest, @@ -614,12 +826,35 @@ def post_get_operation( ) -> cluster_service.Operation: """Post-rpc interceptor for get_operation - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_operation_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ClusterManager server but before - it is returned to user code. + it is returned to user code. This `post_get_operation` interceptor runs + before the `post_get_operation_with_metadata` interceptor. """ return response + def post_get_operation_with_metadata( + self, + response: cluster_service.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cluster_service.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_operation + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ClusterManager server but before it is returned to user code. + + We recommend only using this `post_get_operation_with_metadata` + interceptor in new development instead of the `post_get_operation` interceptor. + When both interceptors are used, this `post_get_operation_with_metadata` interceptor runs after the + `post_get_operation` interceptor. The (possibly modified) response returned by + `post_get_operation` will be passed to + `post_get_operation_with_metadata`. + """ + return response, metadata + def pre_get_server_config( self, request: cluster_service.GetServerConfigRequest, @@ -639,12 +874,35 @@ def post_get_server_config( ) -> cluster_service.ServerConfig: """Post-rpc interceptor for get_server_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_server_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ClusterManager server but before - it is returned to user code. + it is returned to user code. This `post_get_server_config` interceptor runs + before the `post_get_server_config_with_metadata` interceptor. """ return response + def post_get_server_config_with_metadata( + self, + response: cluster_service.ServerConfig, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cluster_service.ServerConfig, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_server_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ClusterManager server but before it is returned to user code. + + We recommend only using this `post_get_server_config_with_metadata` + interceptor in new development instead of the `post_get_server_config` interceptor. + When both interceptors are used, this `post_get_server_config_with_metadata` interceptor runs after the + `post_get_server_config` interceptor. The (possibly modified) response returned by + `post_get_server_config` will be passed to + `post_get_server_config_with_metadata`. + """ + return response, metadata + def pre_list_clusters( self, request: cluster_service.ListClustersRequest, @@ -664,12 +922,37 @@ def post_list_clusters( ) -> cluster_service.ListClustersResponse: """Post-rpc interceptor for list_clusters - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_clusters_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ClusterManager server but before - it is returned to user code. + it is returned to user code. This `post_list_clusters` interceptor runs + before the `post_list_clusters_with_metadata` interceptor. """ return response + def post_list_clusters_with_metadata( + self, + response: cluster_service.ListClustersResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + cluster_service.ListClustersResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_clusters + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ClusterManager server but before it is returned to user code. + + We recommend only using this `post_list_clusters_with_metadata` + interceptor in new development instead of the `post_list_clusters` interceptor. + When both interceptors are used, this `post_list_clusters_with_metadata` interceptor runs after the + `post_list_clusters` interceptor. The (possibly modified) response returned by + `post_list_clusters` will be passed to + `post_list_clusters_with_metadata`. + """ + return response, metadata + def pre_list_node_pools( self, request: cluster_service.ListNodePoolsRequest, @@ -689,12 +972,37 @@ def post_list_node_pools( ) -> cluster_service.ListNodePoolsResponse: """Post-rpc interceptor for list_node_pools - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_node_pools_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ClusterManager server but before - it is returned to user code. + it is returned to user code. This `post_list_node_pools` interceptor runs + before the `post_list_node_pools_with_metadata` interceptor. """ return response + def post_list_node_pools_with_metadata( + self, + response: cluster_service.ListNodePoolsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + cluster_service.ListNodePoolsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_node_pools + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ClusterManager server but before it is returned to user code. + + We recommend only using this `post_list_node_pools_with_metadata` + interceptor in new development instead of the `post_list_node_pools` interceptor. + When both interceptors are used, this `post_list_node_pools_with_metadata` interceptor runs after the + `post_list_node_pools` interceptor. The (possibly modified) response returned by + `post_list_node_pools` will be passed to + `post_list_node_pools_with_metadata`. + """ + return response, metadata + def pre_list_operations( self, request: cluster_service.ListOperationsRequest, @@ -714,12 +1022,37 @@ def post_list_operations( ) -> cluster_service.ListOperationsResponse: """Post-rpc interceptor for list_operations - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_operations_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ClusterManager server but before - it is returned to user code. + it is returned to user code. This `post_list_operations` interceptor runs + before the `post_list_operations_with_metadata` interceptor. """ return response + def post_list_operations_with_metadata( + self, + response: cluster_service.ListOperationsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + cluster_service.ListOperationsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_operations + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ClusterManager server but before it is returned to user code. + + We recommend only using this `post_list_operations_with_metadata` + interceptor in new development instead of the `post_list_operations` interceptor. + When both interceptors are used, this `post_list_operations_with_metadata` interceptor runs after the + `post_list_operations` interceptor. The (possibly modified) response returned by + `post_list_operations` will be passed to + `post_list_operations_with_metadata`. + """ + return response, metadata + def pre_list_usable_subnetworks( self, request: cluster_service.ListUsableSubnetworksRequest, @@ -740,12 +1073,38 @@ def post_list_usable_subnetworks( ) -> cluster_service.ListUsableSubnetworksResponse: """Post-rpc interceptor for list_usable_subnetworks - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_usable_subnetworks_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ClusterManager server but before - it is returned to user code. + it is returned to user code. This `post_list_usable_subnetworks` interceptor runs + before the `post_list_usable_subnetworks_with_metadata` interceptor. """ return response + def post_list_usable_subnetworks_with_metadata( + self, + response: cluster_service.ListUsableSubnetworksResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + cluster_service.ListUsableSubnetworksResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_usable_subnetworks + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ClusterManager server but before it is returned to user code. + + We recommend only using this `post_list_usable_subnetworks_with_metadata` + interceptor in new development instead of the `post_list_usable_subnetworks` interceptor. + When both interceptors are used, this `post_list_usable_subnetworks_with_metadata` interceptor runs after the + `post_list_usable_subnetworks` interceptor. The (possibly modified) response returned by + `post_list_usable_subnetworks` will be passed to + `post_list_usable_subnetworks_with_metadata`. + """ + return response, metadata + def pre_rollback_node_pool_upgrade( self, request: cluster_service.RollbackNodePoolUpgradeRequest, @@ -766,12 +1125,35 @@ def post_rollback_node_pool_upgrade( ) -> cluster_service.Operation: """Post-rpc interceptor for rollback_node_pool_upgrade - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_rollback_node_pool_upgrade_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ClusterManager server but before - it is returned to user code. + it is returned to user code. This `post_rollback_node_pool_upgrade` interceptor runs + before the `post_rollback_node_pool_upgrade_with_metadata` interceptor. """ return response + def post_rollback_node_pool_upgrade_with_metadata( + self, + response: cluster_service.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cluster_service.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for rollback_node_pool_upgrade + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ClusterManager server but before it is returned to user code. + + We recommend only using this `post_rollback_node_pool_upgrade_with_metadata` + interceptor in new development instead of the `post_rollback_node_pool_upgrade` interceptor. + When both interceptors are used, this `post_rollback_node_pool_upgrade_with_metadata` interceptor runs after the + `post_rollback_node_pool_upgrade` interceptor. The (possibly modified) response returned by + `post_rollback_node_pool_upgrade` will be passed to + `post_rollback_node_pool_upgrade_with_metadata`. + """ + return response, metadata + def pre_set_addons_config( self, request: cluster_service.SetAddonsConfigRequest, @@ -791,12 +1173,35 @@ def post_set_addons_config( ) -> cluster_service.Operation: """Post-rpc interceptor for set_addons_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_addons_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ClusterManager server but before - it is returned to user code. + it is returned to user code. This `post_set_addons_config` interceptor runs + before the `post_set_addons_config_with_metadata` interceptor. """ return response + def post_set_addons_config_with_metadata( + self, + response: cluster_service.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cluster_service.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_addons_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ClusterManager server but before it is returned to user code. + + We recommend only using this `post_set_addons_config_with_metadata` + interceptor in new development instead of the `post_set_addons_config` interceptor. + When both interceptors are used, this `post_set_addons_config_with_metadata` interceptor runs after the + `post_set_addons_config` interceptor. The (possibly modified) response returned by + `post_set_addons_config` will be passed to + `post_set_addons_config_with_metadata`. + """ + return response, metadata + def pre_set_labels( self, request: cluster_service.SetLabelsRequest, @@ -816,12 +1221,35 @@ def post_set_labels( ) -> cluster_service.Operation: """Post-rpc interceptor for set_labels - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_labels_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ClusterManager server but before - it is returned to user code. + it is returned to user code. This `post_set_labels` interceptor runs + before the `post_set_labels_with_metadata` interceptor. """ return response + def post_set_labels_with_metadata( + self, + response: cluster_service.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cluster_service.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_labels + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ClusterManager server but before it is returned to user code. + + We recommend only using this `post_set_labels_with_metadata` + interceptor in new development instead of the `post_set_labels` interceptor. + When both interceptors are used, this `post_set_labels_with_metadata` interceptor runs after the + `post_set_labels` interceptor. The (possibly modified) response returned by + `post_set_labels` will be passed to + `post_set_labels_with_metadata`. + """ + return response, metadata + def pre_set_legacy_abac( self, request: cluster_service.SetLegacyAbacRequest, @@ -841,12 +1269,35 @@ def post_set_legacy_abac( ) -> cluster_service.Operation: """Post-rpc interceptor for set_legacy_abac - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_legacy_abac_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ClusterManager server but before - it is returned to user code. + it is returned to user code. This `post_set_legacy_abac` interceptor runs + before the `post_set_legacy_abac_with_metadata` interceptor. """ return response + def post_set_legacy_abac_with_metadata( + self, + response: cluster_service.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cluster_service.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_legacy_abac + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ClusterManager server but before it is returned to user code. + + We recommend only using this `post_set_legacy_abac_with_metadata` + interceptor in new development instead of the `post_set_legacy_abac` interceptor. + When both interceptors are used, this `post_set_legacy_abac_with_metadata` interceptor runs after the + `post_set_legacy_abac` interceptor. The (possibly modified) response returned by + `post_set_legacy_abac` will be passed to + `post_set_legacy_abac_with_metadata`. + """ + return response, metadata + def pre_set_locations( self, request: cluster_service.SetLocationsRequest, @@ -866,12 +1317,35 @@ def post_set_locations( ) -> cluster_service.Operation: """Post-rpc interceptor for set_locations - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_locations_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ClusterManager server but before - it is returned to user code. + it is returned to user code. This `post_set_locations` interceptor runs + before the `post_set_locations_with_metadata` interceptor. """ return response + def post_set_locations_with_metadata( + self, + response: cluster_service.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cluster_service.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_locations + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ClusterManager server but before it is returned to user code. + + We recommend only using this `post_set_locations_with_metadata` + interceptor in new development instead of the `post_set_locations` interceptor. + When both interceptors are used, this `post_set_locations_with_metadata` interceptor runs after the + `post_set_locations` interceptor. The (possibly modified) response returned by + `post_set_locations` will be passed to + `post_set_locations_with_metadata`. + """ + return response, metadata + def pre_set_logging_service( self, request: cluster_service.SetLoggingServiceRequest, @@ -892,12 +1366,35 @@ def post_set_logging_service( ) -> cluster_service.Operation: """Post-rpc interceptor for set_logging_service - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_logging_service_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ClusterManager server but before - it is returned to user code. + it is returned to user code. This `post_set_logging_service` interceptor runs + before the `post_set_logging_service_with_metadata` interceptor. """ return response + def post_set_logging_service_with_metadata( + self, + response: cluster_service.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cluster_service.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_logging_service + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ClusterManager server but before it is returned to user code. + + We recommend only using this `post_set_logging_service_with_metadata` + interceptor in new development instead of the `post_set_logging_service` interceptor. + When both interceptors are used, this `post_set_logging_service_with_metadata` interceptor runs after the + `post_set_logging_service` interceptor. The (possibly modified) response returned by + `post_set_logging_service` will be passed to + `post_set_logging_service_with_metadata`. + """ + return response, metadata + def pre_set_maintenance_policy( self, request: cluster_service.SetMaintenancePolicyRequest, @@ -918,12 +1415,35 @@ def post_set_maintenance_policy( ) -> cluster_service.Operation: """Post-rpc interceptor for set_maintenance_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_maintenance_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ClusterManager server but before - it is returned to user code. + it is returned to user code. This `post_set_maintenance_policy` interceptor runs + before the `post_set_maintenance_policy_with_metadata` interceptor. """ return response + def post_set_maintenance_policy_with_metadata( + self, + response: cluster_service.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cluster_service.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_maintenance_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ClusterManager server but before it is returned to user code. + + We recommend only using this `post_set_maintenance_policy_with_metadata` + interceptor in new development instead of the `post_set_maintenance_policy` interceptor. + When both interceptors are used, this `post_set_maintenance_policy_with_metadata` interceptor runs after the + `post_set_maintenance_policy` interceptor. The (possibly modified) response returned by + `post_set_maintenance_policy` will be passed to + `post_set_maintenance_policy_with_metadata`. + """ + return response, metadata + def pre_set_master_auth( self, request: cluster_service.SetMasterAuthRequest, @@ -943,12 +1463,35 @@ def post_set_master_auth( ) -> cluster_service.Operation: """Post-rpc interceptor for set_master_auth - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_master_auth_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ClusterManager server but before - it is returned to user code. + it is returned to user code. This `post_set_master_auth` interceptor runs + before the `post_set_master_auth_with_metadata` interceptor. """ return response + def post_set_master_auth_with_metadata( + self, + response: cluster_service.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cluster_service.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_master_auth + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ClusterManager server but before it is returned to user code. + + We recommend only using this `post_set_master_auth_with_metadata` + interceptor in new development instead of the `post_set_master_auth` interceptor. + When both interceptors are used, this `post_set_master_auth_with_metadata` interceptor runs after the + `post_set_master_auth` interceptor. The (possibly modified) response returned by + `post_set_master_auth` will be passed to + `post_set_master_auth_with_metadata`. + """ + return response, metadata + def pre_set_monitoring_service( self, request: cluster_service.SetMonitoringServiceRequest, @@ -969,12 +1512,35 @@ def post_set_monitoring_service( ) -> cluster_service.Operation: """Post-rpc interceptor for set_monitoring_service - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_monitoring_service_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ClusterManager server but before - it is returned to user code. + it is returned to user code. This `post_set_monitoring_service` interceptor runs + before the `post_set_monitoring_service_with_metadata` interceptor. """ return response + def post_set_monitoring_service_with_metadata( + self, + response: cluster_service.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cluster_service.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_monitoring_service + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ClusterManager server but before it is returned to user code. + + We recommend only using this `post_set_monitoring_service_with_metadata` + interceptor in new development instead of the `post_set_monitoring_service` interceptor. + When both interceptors are used, this `post_set_monitoring_service_with_metadata` interceptor runs after the + `post_set_monitoring_service` interceptor. The (possibly modified) response returned by + `post_set_monitoring_service` will be passed to + `post_set_monitoring_service_with_metadata`. + """ + return response, metadata + def pre_set_network_policy( self, request: cluster_service.SetNetworkPolicyRequest, @@ -994,12 +1560,35 @@ def post_set_network_policy( ) -> cluster_service.Operation: """Post-rpc interceptor for set_network_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_network_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ClusterManager server but before - it is returned to user code. + it is returned to user code. This `post_set_network_policy` interceptor runs + before the `post_set_network_policy_with_metadata` interceptor. """ return response + def post_set_network_policy_with_metadata( + self, + response: cluster_service.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cluster_service.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_network_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ClusterManager server but before it is returned to user code. + + We recommend only using this `post_set_network_policy_with_metadata` + interceptor in new development instead of the `post_set_network_policy` interceptor. + When both interceptors are used, this `post_set_network_policy_with_metadata` interceptor runs after the + `post_set_network_policy` interceptor. The (possibly modified) response returned by + `post_set_network_policy` will be passed to + `post_set_network_policy_with_metadata`. + """ + return response, metadata + def pre_set_node_pool_autoscaling( self, request: cluster_service.SetNodePoolAutoscalingRequest, @@ -1020,12 +1609,35 @@ def post_set_node_pool_autoscaling( ) -> cluster_service.Operation: """Post-rpc interceptor for set_node_pool_autoscaling - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_node_pool_autoscaling_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ClusterManager server but before - it is returned to user code. + it is returned to user code. This `post_set_node_pool_autoscaling` interceptor runs + before the `post_set_node_pool_autoscaling_with_metadata` interceptor. """ return response + def post_set_node_pool_autoscaling_with_metadata( + self, + response: cluster_service.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cluster_service.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_node_pool_autoscaling + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ClusterManager server but before it is returned to user code. + + We recommend only using this `post_set_node_pool_autoscaling_with_metadata` + interceptor in new development instead of the `post_set_node_pool_autoscaling` interceptor. + When both interceptors are used, this `post_set_node_pool_autoscaling_with_metadata` interceptor runs after the + `post_set_node_pool_autoscaling` interceptor. The (possibly modified) response returned by + `post_set_node_pool_autoscaling` will be passed to + `post_set_node_pool_autoscaling_with_metadata`. + """ + return response, metadata + def pre_set_node_pool_management( self, request: cluster_service.SetNodePoolManagementRequest, @@ -1046,12 +1658,35 @@ def post_set_node_pool_management( ) -> cluster_service.Operation: """Post-rpc interceptor for set_node_pool_management - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_node_pool_management_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ClusterManager server but before - it is returned to user code. + it is returned to user code. This `post_set_node_pool_management` interceptor runs + before the `post_set_node_pool_management_with_metadata` interceptor. """ return response + def post_set_node_pool_management_with_metadata( + self, + response: cluster_service.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cluster_service.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_node_pool_management + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ClusterManager server but before it is returned to user code. + + We recommend only using this `post_set_node_pool_management_with_metadata` + interceptor in new development instead of the `post_set_node_pool_management` interceptor. + When both interceptors are used, this `post_set_node_pool_management_with_metadata` interceptor runs after the + `post_set_node_pool_management` interceptor. The (possibly modified) response returned by + `post_set_node_pool_management` will be passed to + `post_set_node_pool_management_with_metadata`. + """ + return response, metadata + def pre_set_node_pool_size( self, request: cluster_service.SetNodePoolSizeRequest, @@ -1071,12 +1706,35 @@ def post_set_node_pool_size( ) -> cluster_service.Operation: """Post-rpc interceptor for set_node_pool_size - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_node_pool_size_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ClusterManager server but before - it is returned to user code. + it is returned to user code. This `post_set_node_pool_size` interceptor runs + before the `post_set_node_pool_size_with_metadata` interceptor. """ return response + def post_set_node_pool_size_with_metadata( + self, + response: cluster_service.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cluster_service.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_node_pool_size + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ClusterManager server but before it is returned to user code. + + We recommend only using this `post_set_node_pool_size_with_metadata` + interceptor in new development instead of the `post_set_node_pool_size` interceptor. + When both interceptors are used, this `post_set_node_pool_size_with_metadata` interceptor runs after the + `post_set_node_pool_size` interceptor. The (possibly modified) response returned by + `post_set_node_pool_size` will be passed to + `post_set_node_pool_size_with_metadata`. + """ + return response, metadata + def pre_start_ip_rotation( self, request: cluster_service.StartIPRotationRequest, @@ -1096,12 +1754,35 @@ def post_start_ip_rotation( ) -> cluster_service.Operation: """Post-rpc interceptor for start_ip_rotation - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_start_ip_rotation_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ClusterManager server but before - it is returned to user code. + it is returned to user code. This `post_start_ip_rotation` interceptor runs + before the `post_start_ip_rotation_with_metadata` interceptor. """ return response + def post_start_ip_rotation_with_metadata( + self, + response: cluster_service.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cluster_service.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for start_ip_rotation + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ClusterManager server but before it is returned to user code. + + We recommend only using this `post_start_ip_rotation_with_metadata` + interceptor in new development instead of the `post_start_ip_rotation` interceptor. + When both interceptors are used, this `post_start_ip_rotation_with_metadata` interceptor runs after the + `post_start_ip_rotation` interceptor. The (possibly modified) response returned by + `post_start_ip_rotation` will be passed to + `post_start_ip_rotation_with_metadata`. + """ + return response, metadata + def pre_update_cluster( self, request: cluster_service.UpdateClusterRequest, @@ -1121,12 +1802,35 @@ def post_update_cluster( ) -> cluster_service.Operation: """Post-rpc interceptor for update_cluster - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_cluster_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ClusterManager server but before - it is returned to user code. + it is returned to user code. This `post_update_cluster` interceptor runs + before the `post_update_cluster_with_metadata` interceptor. """ return response + def post_update_cluster_with_metadata( + self, + response: cluster_service.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cluster_service.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_cluster + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ClusterManager server but before it is returned to user code. + + We recommend only using this `post_update_cluster_with_metadata` + interceptor in new development instead of the `post_update_cluster` interceptor. + When both interceptors are used, this `post_update_cluster_with_metadata` interceptor runs after the + `post_update_cluster` interceptor. The (possibly modified) response returned by + `post_update_cluster` will be passed to + `post_update_cluster_with_metadata`. + """ + return response, metadata + def pre_update_master( self, request: cluster_service.UpdateMasterRequest, @@ -1146,12 +1850,35 @@ def post_update_master( ) -> cluster_service.Operation: """Post-rpc interceptor for update_master - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_master_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ClusterManager server but before - it is returned to user code. + it is returned to user code. This `post_update_master` interceptor runs + before the `post_update_master_with_metadata` interceptor. """ return response + def post_update_master_with_metadata( + self, + response: cluster_service.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cluster_service.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_master + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ClusterManager server but before it is returned to user code. + + We recommend only using this `post_update_master_with_metadata` + interceptor in new development instead of the `post_update_master` interceptor. + When both interceptors are used, this `post_update_master_with_metadata` interceptor runs after the + `post_update_master` interceptor. The (possibly modified) response returned by + `post_update_master` will be passed to + `post_update_master_with_metadata`. + """ + return response, metadata + def pre_update_node_pool( self, request: cluster_service.UpdateNodePoolRequest, @@ -1171,12 +1898,35 @@ def post_update_node_pool( ) -> cluster_service.Operation: """Post-rpc interceptor for update_node_pool - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_node_pool_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ClusterManager server but before - it is returned to user code. + it is returned to user code. This `post_update_node_pool` interceptor runs + before the `post_update_node_pool_with_metadata` interceptor. """ return response + def post_update_node_pool_with_metadata( + self, + response: cluster_service.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cluster_service.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_node_pool + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ClusterManager server but before it is returned to user code. + + We recommend only using this `post_update_node_pool_with_metadata` + interceptor in new development instead of the `post_update_node_pool` interceptor. + When both interceptors are used, this `post_update_node_pool_with_metadata` interceptor runs after the + `post_update_node_pool` interceptor. The (possibly modified) response returned by + `post_update_node_pool` will be passed to + `post_update_node_pool_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class ClusterManagerRestStub: @@ -1506,6 +2256,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_check_autopilot_compatibility(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_check_autopilot_compatibility_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1663,6 +2420,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_complete_ip_rotation(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_complete_ip_rotation_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1934,6 +2695,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_cluster(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_cluster_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2087,6 +2852,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_node_pool(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_node_pool_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2232,6 +3001,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_cluster(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_cluster_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2379,6 +3152,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_node_pool(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_node_pool_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2522,6 +3299,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_cluster(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_cluster_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2671,6 +3452,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_json_web_keys(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_json_web_keys_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2824,6 +3609,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_node_pool(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_node_pool_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2969,6 +3758,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_operation(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_operation_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3114,6 +3907,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_server_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_server_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3256,6 +4053,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_clusters(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_clusters_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3401,6 +4202,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_node_pools(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_node_pools_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3546,6 +4351,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_operations(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_operations_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3696,6 +4505,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_usable_subnetworks(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_usable_subnetworks_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3858,6 +4671,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_rollback_node_pool_upgrade(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_rollback_node_pool_upgrade_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4011,6 +4828,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_addons_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_addons_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4171,6 +4992,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_labels(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_labels_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4323,6 +5148,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_legacy_abac(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_legacy_abac_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4474,6 +5303,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_locations(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_locations_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4627,6 +5460,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_logging_service(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_logging_service_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4781,6 +5618,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_maintenance_policy(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_maintenance_policy_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4932,6 +5773,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_master_auth(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_master_auth_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5086,6 +5931,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_monitoring_service(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_monitoring_service_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5240,6 +6089,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_network_policy(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_network_policy_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5396,6 +6249,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_node_pool_autoscaling(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_node_pool_autoscaling_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5551,6 +6408,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_node_pool_management(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_node_pool_management_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5704,6 +6565,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_node_pool_size(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_node_pool_size_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5859,6 +6724,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_start_ip_rotation(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_start_ip_rotation_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6010,6 +6879,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_cluster(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_cluster_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6161,6 +7034,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_master(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_master_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6314,6 +7191,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_node_pool(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_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-container/google/cloud/container_v1beta1/gapic_version.py b/packages/google-cloud-container/google/cloud/container_v1beta1/gapic_version.py index eff15f4490b1..558c8aab67c5 100644 --- a/packages/google-cloud-container/google/cloud/container_v1beta1/gapic_version.py +++ b/packages/google-cloud-container/google/cloud/container_v1beta1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "2.55.1" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-container/google/cloud/container_v1beta1/services/cluster_manager/client.py b/packages/google-cloud-container/google/cloud/container_v1beta1/services/cluster_manager/client.py index e4af4ca8b98d..30763066673d 100644 --- a/packages/google-cloud-container/google/cloud/container_v1beta1/services/cluster_manager/client.py +++ b/packages/google-cloud-container/google/cloud/container_v1beta1/services/cluster_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 @@ -479,6 +481,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-container/samples/generated_samples/snippet_metadata_google.container.v1.json b/packages/google-cloud-container/samples/generated_samples/snippet_metadata_google.container.v1.json index 62ddfdfede91..815ec00b3982 100644 --- a/packages/google-cloud-container/samples/generated_samples/snippet_metadata_google.container.v1.json +++ b/packages/google-cloud-container/samples/generated_samples/snippet_metadata_google.container.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-container", - "version": "2.55.1" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-container/samples/generated_samples/snippet_metadata_google.container.v1beta1.json b/packages/google-cloud-container/samples/generated_samples/snippet_metadata_google.container.v1beta1.json index 31094bcbadb1..a1b63076c321 100644 --- a/packages/google-cloud-container/samples/generated_samples/snippet_metadata_google.container.v1beta1.json +++ b/packages/google-cloud-container/samples/generated_samples/snippet_metadata_google.container.v1beta1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-container", - "version": "2.55.1" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-container/tests/unit/gapic/container_v1/test_cluster_manager.py b/packages/google-cloud-container/tests/unit/gapic/container_v1/test_cluster_manager.py index 0e48fd43902f..457a9efc153a 100644 --- a/packages/google-cloud-container/tests/unit/gapic/container_v1/test_cluster_manager.py +++ b/packages/google-cloud-container/tests/unit/gapic/container_v1/test_cluster_manager.py @@ -65,6 +65,13 @@ ) from google.cloud.container_v1.types import cluster_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 @@ -323,6 +330,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 = ClusterManagerClient(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 = ClusterManagerClient(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", [ @@ -20427,10 +20477,13 @@ def test_list_clusters_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ClusterManagerRestInterceptor, "post_list_clusters" ) as post, mock.patch.object( + transports.ClusterManagerRestInterceptor, "post_list_clusters_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ClusterManagerRestInterceptor, "pre_list_clusters" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cluster_service.ListClustersRequest.pb( cluster_service.ListClustersRequest() ) @@ -20456,6 +20509,10 @@ def test_list_clusters_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cluster_service.ListClustersResponse() + post_with_metadata.return_value = ( + cluster_service.ListClustersResponse(), + metadata, + ) client.list_clusters( request, @@ -20467,6 +20524,7 @@ def test_list_clusters_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_cluster_rest_bad_request(request_type=cluster_service.GetClusterRequest): @@ -20611,10 +20669,13 @@ def test_get_cluster_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ClusterManagerRestInterceptor, "post_get_cluster" ) as post, mock.patch.object( + transports.ClusterManagerRestInterceptor, "post_get_cluster_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ClusterManagerRestInterceptor, "pre_get_cluster" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cluster_service.GetClusterRequest.pb( cluster_service.GetClusterRequest() ) @@ -20638,6 +20699,7 @@ def test_get_cluster_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cluster_service.Cluster() + post_with_metadata.return_value = cluster_service.Cluster(), metadata client.get_cluster( request, @@ -20649,6 +20711,7 @@ def test_get_cluster_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_cluster_rest_bad_request( @@ -20753,10 +20816,13 @@ def test_create_cluster_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ClusterManagerRestInterceptor, "post_create_cluster" ) as post, mock.patch.object( + transports.ClusterManagerRestInterceptor, "post_create_cluster_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ClusterManagerRestInterceptor, "pre_create_cluster" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cluster_service.CreateClusterRequest.pb( cluster_service.CreateClusterRequest() ) @@ -20780,6 +20846,7 @@ def test_create_cluster_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cluster_service.Operation() + post_with_metadata.return_value = cluster_service.Operation(), metadata client.create_cluster( request, @@ -20791,6 +20858,7 @@ def test_create_cluster_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_cluster_rest_bad_request( @@ -20895,10 +20963,13 @@ def test_update_cluster_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ClusterManagerRestInterceptor, "post_update_cluster" ) as post, mock.patch.object( + transports.ClusterManagerRestInterceptor, "post_update_cluster_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ClusterManagerRestInterceptor, "pre_update_cluster" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cluster_service.UpdateClusterRequest.pb( cluster_service.UpdateClusterRequest() ) @@ -20922,6 +20993,7 @@ def test_update_cluster_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cluster_service.Operation() + post_with_metadata.return_value = cluster_service.Operation(), metadata client.update_cluster( request, @@ -20933,6 +21005,7 @@ def test_update_cluster_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_node_pool_rest_bad_request( @@ -21041,10 +21114,13 @@ def test_update_node_pool_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ClusterManagerRestInterceptor, "post_update_node_pool" ) as post, mock.patch.object( + transports.ClusterManagerRestInterceptor, "post_update_node_pool_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ClusterManagerRestInterceptor, "pre_update_node_pool" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cluster_service.UpdateNodePoolRequest.pb( cluster_service.UpdateNodePoolRequest() ) @@ -21068,6 +21144,7 @@ def test_update_node_pool_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cluster_service.Operation() + post_with_metadata.return_value = cluster_service.Operation(), metadata client.update_node_pool( request, @@ -21079,6 +21156,7 @@ def test_update_node_pool_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_node_pool_autoscaling_rest_bad_request( @@ -21187,10 +21265,14 @@ def test_set_node_pool_autoscaling_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ClusterManagerRestInterceptor, "post_set_node_pool_autoscaling" ) as post, mock.patch.object( + transports.ClusterManagerRestInterceptor, + "post_set_node_pool_autoscaling_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ClusterManagerRestInterceptor, "pre_set_node_pool_autoscaling" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cluster_service.SetNodePoolAutoscalingRequest.pb( cluster_service.SetNodePoolAutoscalingRequest() ) @@ -21214,6 +21296,7 @@ def test_set_node_pool_autoscaling_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cluster_service.Operation() + post_with_metadata.return_value = cluster_service.Operation(), metadata client.set_node_pool_autoscaling( request, @@ -21225,6 +21308,7 @@ def test_set_node_pool_autoscaling_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_logging_service_rest_bad_request( @@ -21329,10 +21413,14 @@ def test_set_logging_service_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ClusterManagerRestInterceptor, "post_set_logging_service" ) as post, mock.patch.object( + transports.ClusterManagerRestInterceptor, + "post_set_logging_service_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ClusterManagerRestInterceptor, "pre_set_logging_service" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cluster_service.SetLoggingServiceRequest.pb( cluster_service.SetLoggingServiceRequest() ) @@ -21356,6 +21444,7 @@ def test_set_logging_service_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cluster_service.Operation() + post_with_metadata.return_value = cluster_service.Operation(), metadata client.set_logging_service( request, @@ -21367,6 +21456,7 @@ def test_set_logging_service_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_monitoring_service_rest_bad_request( @@ -21471,10 +21561,14 @@ def test_set_monitoring_service_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ClusterManagerRestInterceptor, "post_set_monitoring_service" ) as post, mock.patch.object( + transports.ClusterManagerRestInterceptor, + "post_set_monitoring_service_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ClusterManagerRestInterceptor, "pre_set_monitoring_service" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cluster_service.SetMonitoringServiceRequest.pb( cluster_service.SetMonitoringServiceRequest() ) @@ -21498,6 +21592,7 @@ def test_set_monitoring_service_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cluster_service.Operation() + post_with_metadata.return_value = cluster_service.Operation(), metadata client.set_monitoring_service( request, @@ -21509,6 +21604,7 @@ def test_set_monitoring_service_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_addons_config_rest_bad_request( @@ -21613,10 +21709,13 @@ def test_set_addons_config_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ClusterManagerRestInterceptor, "post_set_addons_config" ) as post, mock.patch.object( + transports.ClusterManagerRestInterceptor, "post_set_addons_config_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ClusterManagerRestInterceptor, "pre_set_addons_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cluster_service.SetAddonsConfigRequest.pb( cluster_service.SetAddonsConfigRequest() ) @@ -21640,6 +21739,7 @@ def test_set_addons_config_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cluster_service.Operation() + post_with_metadata.return_value = cluster_service.Operation(), metadata client.set_addons_config( request, @@ -21651,6 +21751,7 @@ def test_set_addons_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_locations_rest_bad_request( @@ -21755,10 +21856,13 @@ def test_set_locations_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ClusterManagerRestInterceptor, "post_set_locations" ) as post, mock.patch.object( + transports.ClusterManagerRestInterceptor, "post_set_locations_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ClusterManagerRestInterceptor, "pre_set_locations" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cluster_service.SetLocationsRequest.pb( cluster_service.SetLocationsRequest() ) @@ -21782,6 +21886,7 @@ def test_set_locations_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cluster_service.Operation() + post_with_metadata.return_value = cluster_service.Operation(), metadata client.set_locations( request, @@ -21793,6 +21898,7 @@ def test_set_locations_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_master_rest_bad_request( @@ -21897,10 +22003,13 @@ def test_update_master_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ClusterManagerRestInterceptor, "post_update_master" ) as post, mock.patch.object( + transports.ClusterManagerRestInterceptor, "post_update_master_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ClusterManagerRestInterceptor, "pre_update_master" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cluster_service.UpdateMasterRequest.pb( cluster_service.UpdateMasterRequest() ) @@ -21924,6 +22033,7 @@ def test_update_master_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cluster_service.Operation() + post_with_metadata.return_value = cluster_service.Operation(), metadata client.update_master( request, @@ -21935,6 +22045,7 @@ def test_update_master_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_master_auth_rest_bad_request( @@ -22039,10 +22150,13 @@ def test_set_master_auth_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ClusterManagerRestInterceptor, "post_set_master_auth" ) as post, mock.patch.object( + transports.ClusterManagerRestInterceptor, "post_set_master_auth_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ClusterManagerRestInterceptor, "pre_set_master_auth" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cluster_service.SetMasterAuthRequest.pb( cluster_service.SetMasterAuthRequest() ) @@ -22066,6 +22180,7 @@ def test_set_master_auth_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cluster_service.Operation() + post_with_metadata.return_value = cluster_service.Operation(), metadata client.set_master_auth( request, @@ -22077,6 +22192,7 @@ def test_set_master_auth_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_cluster_rest_bad_request( @@ -22181,10 +22297,13 @@ def test_delete_cluster_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ClusterManagerRestInterceptor, "post_delete_cluster" ) as post, mock.patch.object( + transports.ClusterManagerRestInterceptor, "post_delete_cluster_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ClusterManagerRestInterceptor, "pre_delete_cluster" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cluster_service.DeleteClusterRequest.pb( cluster_service.DeleteClusterRequest() ) @@ -22208,6 +22327,7 @@ def test_delete_cluster_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cluster_service.Operation() + post_with_metadata.return_value = cluster_service.Operation(), metadata client.delete_cluster( request, @@ -22219,6 +22339,7 @@ def test_delete_cluster_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_operations_rest_bad_request( @@ -22303,10 +22424,13 @@ def test_list_operations_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ClusterManagerRestInterceptor, "post_list_operations" ) as post, mock.patch.object( + transports.ClusterManagerRestInterceptor, "post_list_operations_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ClusterManagerRestInterceptor, "pre_list_operations" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cluster_service.ListOperationsRequest.pb( cluster_service.ListOperationsRequest() ) @@ -22332,6 +22456,10 @@ def test_list_operations_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cluster_service.ListOperationsResponse() + post_with_metadata.return_value = ( + cluster_service.ListOperationsResponse(), + metadata, + ) client.list_operations( request, @@ -22343,6 +22471,7 @@ def test_list_operations_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( @@ -22447,10 +22576,13 @@ def test_get_operation_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ClusterManagerRestInterceptor, "post_get_operation" ) as post, mock.patch.object( + transports.ClusterManagerRestInterceptor, "post_get_operation_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ClusterManagerRestInterceptor, "pre_get_operation" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cluster_service.GetOperationRequest.pb( cluster_service.GetOperationRequest() ) @@ -22474,6 +22606,7 @@ def test_get_operation_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cluster_service.Operation() + post_with_metadata.return_value = cluster_service.Operation(), metadata client.get_operation( request, @@ -22485,6 +22618,7 @@ def test_get_operation_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( @@ -22686,10 +22820,13 @@ def test_get_server_config_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ClusterManagerRestInterceptor, "post_get_server_config" ) as post, mock.patch.object( + transports.ClusterManagerRestInterceptor, "post_get_server_config_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ClusterManagerRestInterceptor, "pre_get_server_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cluster_service.GetServerConfigRequest.pb( cluster_service.GetServerConfigRequest() ) @@ -22715,6 +22852,7 @@ def test_get_server_config_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cluster_service.ServerConfig() + post_with_metadata.return_value = cluster_service.ServerConfig(), metadata client.get_server_config( request, @@ -22726,6 +22864,7 @@ def test_get_server_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_json_web_keys_rest_bad_request( @@ -22807,10 +22946,13 @@ def test_get_json_web_keys_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ClusterManagerRestInterceptor, "post_get_json_web_keys" ) as post, mock.patch.object( + transports.ClusterManagerRestInterceptor, "post_get_json_web_keys_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ClusterManagerRestInterceptor, "pre_get_json_web_keys" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cluster_service.GetJSONWebKeysRequest.pb( cluster_service.GetJSONWebKeysRequest() ) @@ -22836,6 +22978,10 @@ def test_get_json_web_keys_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cluster_service.GetJSONWebKeysResponse() + post_with_metadata.return_value = ( + cluster_service.GetJSONWebKeysResponse(), + metadata, + ) client.get_json_web_keys( request, @@ -22847,6 +22993,7 @@ def test_get_json_web_keys_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_node_pools_rest_bad_request( @@ -22928,10 +23075,13 @@ def test_list_node_pools_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ClusterManagerRestInterceptor, "post_list_node_pools" ) as post, mock.patch.object( + transports.ClusterManagerRestInterceptor, "post_list_node_pools_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ClusterManagerRestInterceptor, "pre_list_node_pools" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cluster_service.ListNodePoolsRequest.pb( cluster_service.ListNodePoolsRequest() ) @@ -22957,6 +23107,10 @@ def test_list_node_pools_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cluster_service.ListNodePoolsResponse() + post_with_metadata.return_value = ( + cluster_service.ListNodePoolsResponse(), + metadata, + ) client.list_node_pools( request, @@ -22968,6 +23122,7 @@ def test_list_node_pools_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_node_pool_rest_bad_request( @@ -23074,10 +23229,13 @@ def test_get_node_pool_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ClusterManagerRestInterceptor, "post_get_node_pool" ) as post, mock.patch.object( + transports.ClusterManagerRestInterceptor, "post_get_node_pool_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ClusterManagerRestInterceptor, "pre_get_node_pool" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cluster_service.GetNodePoolRequest.pb( cluster_service.GetNodePoolRequest() ) @@ -23101,6 +23259,7 @@ def test_get_node_pool_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cluster_service.NodePool() + post_with_metadata.return_value = cluster_service.NodePool(), metadata client.get_node_pool( request, @@ -23112,6 +23271,7 @@ def test_get_node_pool_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_node_pool_rest_bad_request( @@ -23216,10 +23376,13 @@ def test_create_node_pool_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ClusterManagerRestInterceptor, "post_create_node_pool" ) as post, mock.patch.object( + transports.ClusterManagerRestInterceptor, "post_create_node_pool_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ClusterManagerRestInterceptor, "pre_create_node_pool" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cluster_service.CreateNodePoolRequest.pb( cluster_service.CreateNodePoolRequest() ) @@ -23243,6 +23406,7 @@ def test_create_node_pool_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cluster_service.Operation() + post_with_metadata.return_value = cluster_service.Operation(), metadata client.create_node_pool( request, @@ -23254,6 +23418,7 @@ def test_create_node_pool_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_node_pool_rest_bad_request( @@ -23362,10 +23527,13 @@ def test_delete_node_pool_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ClusterManagerRestInterceptor, "post_delete_node_pool" ) as post, mock.patch.object( + transports.ClusterManagerRestInterceptor, "post_delete_node_pool_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ClusterManagerRestInterceptor, "pre_delete_node_pool" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cluster_service.DeleteNodePoolRequest.pb( cluster_service.DeleteNodePoolRequest() ) @@ -23389,6 +23557,7 @@ def test_delete_node_pool_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cluster_service.Operation() + post_with_metadata.return_value = cluster_service.Operation(), metadata client.delete_node_pool( request, @@ -23400,6 +23569,7 @@ def test_delete_node_pool_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_complete_node_pool_upgrade_rest_bad_request( @@ -23621,10 +23791,14 @@ def test_rollback_node_pool_upgrade_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ClusterManagerRestInterceptor, "post_rollback_node_pool_upgrade" ) as post, mock.patch.object( + transports.ClusterManagerRestInterceptor, + "post_rollback_node_pool_upgrade_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ClusterManagerRestInterceptor, "pre_rollback_node_pool_upgrade" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cluster_service.RollbackNodePoolUpgradeRequest.pb( cluster_service.RollbackNodePoolUpgradeRequest() ) @@ -23648,6 +23822,7 @@ def test_rollback_node_pool_upgrade_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cluster_service.Operation() + post_with_metadata.return_value = cluster_service.Operation(), metadata client.rollback_node_pool_upgrade( request, @@ -23659,6 +23834,7 @@ def test_rollback_node_pool_upgrade_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_node_pool_management_rest_bad_request( @@ -23767,10 +23943,14 @@ def test_set_node_pool_management_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ClusterManagerRestInterceptor, "post_set_node_pool_management" ) as post, mock.patch.object( + transports.ClusterManagerRestInterceptor, + "post_set_node_pool_management_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ClusterManagerRestInterceptor, "pre_set_node_pool_management" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cluster_service.SetNodePoolManagementRequest.pb( cluster_service.SetNodePoolManagementRequest() ) @@ -23794,6 +23974,7 @@ def test_set_node_pool_management_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cluster_service.Operation() + post_with_metadata.return_value = cluster_service.Operation(), metadata client.set_node_pool_management( request, @@ -23805,6 +23986,7 @@ def test_set_node_pool_management_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_labels_rest_bad_request(request_type=cluster_service.SetLabelsRequest): @@ -23907,10 +24089,13 @@ def test_set_labels_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ClusterManagerRestInterceptor, "post_set_labels" ) as post, mock.patch.object( + transports.ClusterManagerRestInterceptor, "post_set_labels_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ClusterManagerRestInterceptor, "pre_set_labels" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cluster_service.SetLabelsRequest.pb( cluster_service.SetLabelsRequest() ) @@ -23934,6 +24119,7 @@ def test_set_labels_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cluster_service.Operation() + post_with_metadata.return_value = cluster_service.Operation(), metadata client.set_labels( request, @@ -23945,6 +24131,7 @@ def test_set_labels_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_legacy_abac_rest_bad_request( @@ -24049,10 +24236,13 @@ def test_set_legacy_abac_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ClusterManagerRestInterceptor, "post_set_legacy_abac" ) as post, mock.patch.object( + transports.ClusterManagerRestInterceptor, "post_set_legacy_abac_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ClusterManagerRestInterceptor, "pre_set_legacy_abac" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cluster_service.SetLegacyAbacRequest.pb( cluster_service.SetLegacyAbacRequest() ) @@ -24076,6 +24266,7 @@ def test_set_legacy_abac_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cluster_service.Operation() + post_with_metadata.return_value = cluster_service.Operation(), metadata client.set_legacy_abac( request, @@ -24087,6 +24278,7 @@ def test_set_legacy_abac_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_start_ip_rotation_rest_bad_request( @@ -24191,10 +24383,13 @@ def test_start_ip_rotation_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ClusterManagerRestInterceptor, "post_start_ip_rotation" ) as post, mock.patch.object( + transports.ClusterManagerRestInterceptor, "post_start_ip_rotation_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ClusterManagerRestInterceptor, "pre_start_ip_rotation" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cluster_service.StartIPRotationRequest.pb( cluster_service.StartIPRotationRequest() ) @@ -24218,6 +24413,7 @@ def test_start_ip_rotation_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cluster_service.Operation() + post_with_metadata.return_value = cluster_service.Operation(), metadata client.start_ip_rotation( request, @@ -24229,6 +24425,7 @@ def test_start_ip_rotation_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_complete_ip_rotation_rest_bad_request( @@ -24333,10 +24530,14 @@ def test_complete_ip_rotation_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ClusterManagerRestInterceptor, "post_complete_ip_rotation" ) as post, mock.patch.object( + transports.ClusterManagerRestInterceptor, + "post_complete_ip_rotation_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ClusterManagerRestInterceptor, "pre_complete_ip_rotation" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cluster_service.CompleteIPRotationRequest.pb( cluster_service.CompleteIPRotationRequest() ) @@ -24360,6 +24561,7 @@ def test_complete_ip_rotation_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cluster_service.Operation() + post_with_metadata.return_value = cluster_service.Operation(), metadata client.complete_ip_rotation( request, @@ -24371,6 +24573,7 @@ def test_complete_ip_rotation_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_node_pool_size_rest_bad_request( @@ -24479,10 +24682,14 @@ def test_set_node_pool_size_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ClusterManagerRestInterceptor, "post_set_node_pool_size" ) as post, mock.patch.object( + transports.ClusterManagerRestInterceptor, + "post_set_node_pool_size_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ClusterManagerRestInterceptor, "pre_set_node_pool_size" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cluster_service.SetNodePoolSizeRequest.pb( cluster_service.SetNodePoolSizeRequest() ) @@ -24506,6 +24713,7 @@ def test_set_node_pool_size_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cluster_service.Operation() + post_with_metadata.return_value = cluster_service.Operation(), metadata client.set_node_pool_size( request, @@ -24517,6 +24725,7 @@ def test_set_node_pool_size_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_network_policy_rest_bad_request( @@ -24621,10 +24830,14 @@ def test_set_network_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ClusterManagerRestInterceptor, "post_set_network_policy" ) as post, mock.patch.object( + transports.ClusterManagerRestInterceptor, + "post_set_network_policy_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ClusterManagerRestInterceptor, "pre_set_network_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cluster_service.SetNetworkPolicyRequest.pb( cluster_service.SetNetworkPolicyRequest() ) @@ -24648,6 +24861,7 @@ def test_set_network_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cluster_service.Operation() + post_with_metadata.return_value = cluster_service.Operation(), metadata client.set_network_policy( request, @@ -24659,6 +24873,7 @@ def test_set_network_policy_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_maintenance_policy_rest_bad_request( @@ -24763,10 +24978,14 @@ def test_set_maintenance_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ClusterManagerRestInterceptor, "post_set_maintenance_policy" ) as post, mock.patch.object( + transports.ClusterManagerRestInterceptor, + "post_set_maintenance_policy_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ClusterManagerRestInterceptor, "pre_set_maintenance_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cluster_service.SetMaintenancePolicyRequest.pb( cluster_service.SetMaintenancePolicyRequest() ) @@ -24790,6 +25009,7 @@ def test_set_maintenance_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cluster_service.Operation() + post_with_metadata.return_value = cluster_service.Operation(), metadata client.set_maintenance_policy( request, @@ -24801,6 +25021,7 @@ def test_set_maintenance_policy_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_usable_subnetworks_rest_bad_request( @@ -24885,10 +25106,14 @@ def test_list_usable_subnetworks_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ClusterManagerRestInterceptor, "post_list_usable_subnetworks" ) as post, mock.patch.object( + transports.ClusterManagerRestInterceptor, + "post_list_usable_subnetworks_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ClusterManagerRestInterceptor, "pre_list_usable_subnetworks" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cluster_service.ListUsableSubnetworksRequest.pb( cluster_service.ListUsableSubnetworksRequest() ) @@ -24914,6 +25139,10 @@ def test_list_usable_subnetworks_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cluster_service.ListUsableSubnetworksResponse() + post_with_metadata.return_value = ( + cluster_service.ListUsableSubnetworksResponse(), + metadata, + ) client.list_usable_subnetworks( request, @@ -24925,6 +25154,7 @@ def test_list_usable_subnetworks_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_check_autopilot_compatibility_rest_bad_request( @@ -25011,10 +25241,14 @@ def test_check_autopilot_compatibility_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ClusterManagerRestInterceptor, "post_check_autopilot_compatibility" ) as post, mock.patch.object( + transports.ClusterManagerRestInterceptor, + "post_check_autopilot_compatibility_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ClusterManagerRestInterceptor, "pre_check_autopilot_compatibility" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cluster_service.CheckAutopilotCompatibilityRequest.pb( cluster_service.CheckAutopilotCompatibilityRequest() ) @@ -25040,6 +25274,10 @@ def test_check_autopilot_compatibility_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cluster_service.CheckAutopilotCompatibilityResponse() + post_with_metadata.return_value = ( + cluster_service.CheckAutopilotCompatibilityResponse(), + metadata, + ) client.check_autopilot_compatibility( request, @@ -25051,6 +25289,7 @@ def test_check_autopilot_compatibility_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-container/tests/unit/gapic/container_v1beta1/test_cluster_manager.py b/packages/google-cloud-container/tests/unit/gapic/container_v1beta1/test_cluster_manager.py index 593f7711426f..a4e9cf39d5f0 100644 --- a/packages/google-cloud-container/tests/unit/gapic/container_v1beta1/test_cluster_manager.py +++ b/packages/google-cloud-container/tests/unit/gapic/container_v1beta1/test_cluster_manager.py @@ -22,6 +22,7 @@ except ImportError: # pragma: NO COVER import mock +import json import math from google.api_core import api_core_version @@ -60,6 +61,13 @@ ) from google.cloud.container_v1beta1.types import cluster_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 @@ -318,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 = ClusterManagerClient(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 = ClusterManagerClient(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-containeranalysis/google/cloud/devtools/containeranalysis/gapic_version.py b/packages/google-cloud-containeranalysis/google/cloud/devtools/containeranalysis/gapic_version.py index e154065d8da8..558c8aab67c5 100644 --- a/packages/google-cloud-containeranalysis/google/cloud/devtools/containeranalysis/gapic_version.py +++ b/packages/google-cloud-containeranalysis/google/cloud/devtools/containeranalysis/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-containeranalysis/google/cloud/devtools/containeranalysis_v1/gapic_version.py b/packages/google-cloud-containeranalysis/google/cloud/devtools/containeranalysis_v1/gapic_version.py index e154065d8da8..558c8aab67c5 100644 --- a/packages/google-cloud-containeranalysis/google/cloud/devtools/containeranalysis_v1/gapic_version.py +++ b/packages/google-cloud-containeranalysis/google/cloud/devtools/containeranalysis_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-containeranalysis/google/cloud/devtools/containeranalysis_v1/services/container_analysis/client.py b/packages/google-cloud-containeranalysis/google/cloud/devtools/containeranalysis_v1/services/container_analysis/client.py index 8a3d9797f0ac..7536af1548e5 100644 --- a/packages/google-cloud-containeranalysis/google/cloud/devtools/containeranalysis_v1/services/container_analysis/client.py +++ b/packages/google-cloud-containeranalysis/google/cloud/devtools/containeranalysis_v1/services/container_analysis/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 @@ -481,6 +483,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-containeranalysis/google/cloud/devtools/containeranalysis_v1/services/container_analysis/transports/rest.py b/packages/google-cloud-containeranalysis/google/cloud/devtools/containeranalysis_v1/services/container_analysis/transports/rest.py index e65bf1a30375..f8b6095a7180 100644 --- a/packages/google-cloud-containeranalysis/google/cloud/devtools/containeranalysis_v1/services/container_analysis/transports/rest.py +++ b/packages/google-cloud-containeranalysis/google/cloud/devtools/containeranalysis_v1/services/container_analysis/transports/rest.py @@ -125,12 +125,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 ContainerAnalysis 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 ContainerAnalysis 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_vulnerability_occurrences_summary( self, request: containeranalysis.GetVulnerabilityOccurrencesSummaryRequest, @@ -151,12 +174,38 @@ def post_get_vulnerability_occurrences_summary( ) -> containeranalysis.VulnerabilityOccurrencesSummary: """Post-rpc interceptor for get_vulnerability_occurrences_summary - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_vulnerability_occurrences_summary_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ContainerAnalysis server but before - it is returned to user code. + it is returned to user code. This `post_get_vulnerability_occurrences_summary` interceptor runs + before the `post_get_vulnerability_occurrences_summary_with_metadata` interceptor. """ return response + def post_get_vulnerability_occurrences_summary_with_metadata( + self, + response: containeranalysis.VulnerabilityOccurrencesSummary, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + containeranalysis.VulnerabilityOccurrencesSummary, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for get_vulnerability_occurrences_summary + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ContainerAnalysis server but before it is returned to user code. + + We recommend only using this `post_get_vulnerability_occurrences_summary_with_metadata` + interceptor in new development instead of the `post_get_vulnerability_occurrences_summary` interceptor. + When both interceptors are used, this `post_get_vulnerability_occurrences_summary_with_metadata` interceptor runs after the + `post_get_vulnerability_occurrences_summary` interceptor. The (possibly modified) response returned by + `post_get_vulnerability_occurrences_summary` will be passed to + `post_get_vulnerability_occurrences_summary_with_metadata`. + """ + return response, metadata + def pre_set_iam_policy( self, request: iam_policy_pb2.SetIamPolicyRequest, @@ -174,12 +223,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 ContainerAnalysis 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 ContainerAnalysis 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, @@ -200,12 +272,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 ContainerAnalysis 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 ContainerAnalysis 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 + @dataclasses.dataclass class ContainerAnalysisRestStub: @@ -505,6 +603,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 @@ -658,6 +760,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_vulnerability_occurrences_summary(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_get_vulnerability_occurrences_summary_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -883,6 +992,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 @@ -1032,6 +1145,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 diff --git a/packages/google-cloud-containeranalysis/samples/generated_samples/snippet_metadata_google.devtools.containeranalysis.v1.json b/packages/google-cloud-containeranalysis/samples/generated_samples/snippet_metadata_google.devtools.containeranalysis.v1.json index 80c3335e233b..07f9c39e95c2 100644 --- a/packages/google-cloud-containeranalysis/samples/generated_samples/snippet_metadata_google.devtools.containeranalysis.v1.json +++ b/packages/google-cloud-containeranalysis/samples/generated_samples/snippet_metadata_google.devtools.containeranalysis.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-containeranalysis", - "version": "2.16.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-containeranalysis/tests/unit/gapic/containeranalysis_v1/test_container_analysis.py b/packages/google-cloud-containeranalysis/tests/unit/gapic/containeranalysis_v1/test_container_analysis.py index c06694ce385d..b9b16ca2a123 100644 --- a/packages/google-cloud-containeranalysis/tests/unit/gapic/containeranalysis_v1/test_container_analysis.py +++ b/packages/google-cloud-containeranalysis/tests/unit/gapic/containeranalysis_v1/test_container_analysis.py @@ -64,6 +64,13 @@ ) from google.cloud.devtools.containeranalysis_v1.types import containeranalysis +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 = ContainerAnalysisClient(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 = ContainerAnalysisClient(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", [ @@ -3662,10 +3712,13 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ContainerAnalysisRestInterceptor, "post_set_iam_policy" ) as post, mock.patch.object( + transports.ContainerAnalysisRestInterceptor, "post_set_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ContainerAnalysisRestInterceptor, "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", @@ -3687,6 +3740,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, @@ -3698,6 +3752,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( @@ -3781,10 +3836,13 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ContainerAnalysisRestInterceptor, "post_get_iam_policy" ) as post, mock.patch.object( + transports.ContainerAnalysisRestInterceptor, "post_get_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ContainerAnalysisRestInterceptor, "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", @@ -3806,6 +3864,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, @@ -3817,6 +3876,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( @@ -3898,10 +3958,14 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ContainerAnalysisRestInterceptor, "post_test_iam_permissions" ) as post, mock.patch.object( + transports.ContainerAnalysisRestInterceptor, + "post_test_iam_permissions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContainerAnalysisRestInterceptor, "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", @@ -3925,6 +3989,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, @@ -3936,6 +4004,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_vulnerability_occurrences_summary_rest_bad_request( @@ -4020,11 +4089,15 @@ def test_get_vulnerability_occurrences_summary_rest_interceptors(null_intercepto transports.ContainerAnalysisRestInterceptor, "post_get_vulnerability_occurrences_summary", ) as post, mock.patch.object( + transports.ContainerAnalysisRestInterceptor, + "post_get_vulnerability_occurrences_summary_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ContainerAnalysisRestInterceptor, "pre_get_vulnerability_occurrences_summary", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = containeranalysis.GetVulnerabilityOccurrencesSummaryRequest.pb( containeranalysis.GetVulnerabilityOccurrencesSummaryRequest() ) @@ -4050,6 +4123,10 @@ def test_get_vulnerability_occurrences_summary_rest_interceptors(null_intercepto ] pre.return_value = request, metadata post.return_value = containeranalysis.VulnerabilityOccurrencesSummary() + post_with_metadata.return_value = ( + containeranalysis.VulnerabilityOccurrencesSummary(), + metadata, + ) client.get_vulnerability_occurrences_summary( request, @@ -4061,6 +4138,7 @@ def test_get_vulnerability_occurrences_summary_rest_interceptors(null_intercepto 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-contentwarehouse/google/cloud/contentwarehouse/gapic_version.py b/packages/google-cloud-contentwarehouse/google/cloud/contentwarehouse/gapic_version.py index 43f4d6aa457c..558c8aab67c5 100644 --- a/packages/google-cloud-contentwarehouse/google/cloud/contentwarehouse/gapic_version.py +++ b/packages/google-cloud-contentwarehouse/google/cloud/contentwarehouse/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.7.12" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-contentwarehouse/google/cloud/contentwarehouse_v1/gapic_version.py b/packages/google-cloud-contentwarehouse/google/cloud/contentwarehouse_v1/gapic_version.py index 43f4d6aa457c..558c8aab67c5 100644 --- a/packages/google-cloud-contentwarehouse/google/cloud/contentwarehouse_v1/gapic_version.py +++ b/packages/google-cloud-contentwarehouse/google/cloud/contentwarehouse_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.7.12" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-contentwarehouse/google/cloud/contentwarehouse_v1/services/document_link_service/client.py b/packages/google-cloud-contentwarehouse/google/cloud/contentwarehouse_v1/services/document_link_service/client.py index 78942e2c5a82..6434bb3ca204 100644 --- a/packages/google-cloud-contentwarehouse/google/cloud/contentwarehouse_v1/services/document_link_service/client.py +++ b/packages/google-cloud-contentwarehouse/google/cloud/contentwarehouse_v1/services/document_link_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 @@ -514,6 +516,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. @@ -1219,16 +1248,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-contentwarehouse/google/cloud/contentwarehouse_v1/services/document_link_service/transports/rest.py b/packages/google-cloud-contentwarehouse/google/cloud/contentwarehouse_v1/services/document_link_service/transports/rest.py index 073434a430fb..f15033c8e0c6 100644 --- a/packages/google-cloud-contentwarehouse/google/cloud/contentwarehouse_v1/services/document_link_service/transports/rest.py +++ b/packages/google-cloud-contentwarehouse/google/cloud/contentwarehouse_v1/services/document_link_service/transports/rest.py @@ -124,12 +124,37 @@ def post_create_document_link( ) -> document_link_service.DocumentLink: """Post-rpc interceptor for create_document_link - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_document_link_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the DocumentLinkService server but before - it is returned to user code. + it is returned to user code. This `post_create_document_link` interceptor runs + before the `post_create_document_link_with_metadata` interceptor. """ return response + def post_create_document_link_with_metadata( + self, + response: document_link_service.DocumentLink, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + document_link_service.DocumentLink, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for create_document_link + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the DocumentLinkService server but before it is returned to user code. + + We recommend only using this `post_create_document_link_with_metadata` + interceptor in new development instead of the `post_create_document_link` interceptor. + When both interceptors are used, this `post_create_document_link_with_metadata` interceptor runs after the + `post_create_document_link` interceptor. The (possibly modified) response returned by + `post_create_document_link` will be passed to + `post_create_document_link_with_metadata`. + """ + return response, metadata + def pre_delete_document_link( self, request: document_link_service.DeleteDocumentLinkRequest, @@ -165,12 +190,38 @@ def post_list_linked_sources( ) -> document_link_service.ListLinkedSourcesResponse: """Post-rpc interceptor for list_linked_sources - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_linked_sources_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the DocumentLinkService server but before - it is returned to user code. + it is returned to user code. This `post_list_linked_sources` interceptor runs + before the `post_list_linked_sources_with_metadata` interceptor. """ return response + def post_list_linked_sources_with_metadata( + self, + response: document_link_service.ListLinkedSourcesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + document_link_service.ListLinkedSourcesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_linked_sources + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the DocumentLinkService server but before it is returned to user code. + + We recommend only using this `post_list_linked_sources_with_metadata` + interceptor in new development instead of the `post_list_linked_sources` interceptor. + When both interceptors are used, this `post_list_linked_sources_with_metadata` interceptor runs after the + `post_list_linked_sources` interceptor. The (possibly modified) response returned by + `post_list_linked_sources` will be passed to + `post_list_linked_sources_with_metadata`. + """ + return response, metadata + def pre_list_linked_targets( self, request: document_link_service.ListLinkedTargetsRequest, @@ -191,12 +242,38 @@ def post_list_linked_targets( ) -> document_link_service.ListLinkedTargetsResponse: """Post-rpc interceptor for list_linked_targets - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_linked_targets_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the DocumentLinkService server but before - it is returned to user code. + it is returned to user code. This `post_list_linked_targets` interceptor runs + before the `post_list_linked_targets_with_metadata` interceptor. """ return response + def post_list_linked_targets_with_metadata( + self, + response: document_link_service.ListLinkedTargetsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + document_link_service.ListLinkedTargetsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_linked_targets + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the DocumentLinkService server but before it is returned to user code. + + We recommend only using this `post_list_linked_targets_with_metadata` + interceptor in new development instead of the `post_list_linked_targets` interceptor. + When both interceptors are used, this `post_list_linked_targets_with_metadata` interceptor runs after the + `post_list_linked_targets` interceptor. The (possibly modified) response returned by + `post_list_linked_targets` will be passed to + `post_list_linked_targets_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -442,6 +519,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_document_link(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_document_link_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -716,6 +797,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_linked_sources(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_linked_sources_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -874,6 +959,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_linked_targets(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_linked_targets_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-contentwarehouse/google/cloud/contentwarehouse_v1/services/document_schema_service/client.py b/packages/google-cloud-contentwarehouse/google/cloud/contentwarehouse_v1/services/document_schema_service/client.py index 09ec871376a0..c815d72f8e13 100644 --- a/packages/google-cloud-contentwarehouse/google/cloud/contentwarehouse_v1/services/document_schema_service/client.py +++ b/packages/google-cloud-contentwarehouse/google/cloud/contentwarehouse_v1/services/document_schema_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 @@ -510,6 +512,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. @@ -1343,16 +1372,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-contentwarehouse/google/cloud/contentwarehouse_v1/services/document_schema_service/transports/rest.py b/packages/google-cloud-contentwarehouse/google/cloud/contentwarehouse_v1/services/document_schema_service/transports/rest.py index cc082ce5425c..d4fa1eb88180 100644 --- a/packages/google-cloud-contentwarehouse/google/cloud/contentwarehouse_v1/services/document_schema_service/transports/rest.py +++ b/packages/google-cloud-contentwarehouse/google/cloud/contentwarehouse_v1/services/document_schema_service/transports/rest.py @@ -136,12 +136,37 @@ def post_create_document_schema( ) -> gcc_document_schema.DocumentSchema: """Post-rpc interceptor for create_document_schema - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_document_schema_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the DocumentSchemaService server but before - it is returned to user code. + it is returned to user code. This `post_create_document_schema` interceptor runs + before the `post_create_document_schema_with_metadata` interceptor. """ return response + def post_create_document_schema_with_metadata( + self, + response: gcc_document_schema.DocumentSchema, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + gcc_document_schema.DocumentSchema, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for create_document_schema + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the DocumentSchemaService server but before it is returned to user code. + + We recommend only using this `post_create_document_schema_with_metadata` + interceptor in new development instead of the `post_create_document_schema` interceptor. + When both interceptors are used, this `post_create_document_schema_with_metadata` interceptor runs after the + `post_create_document_schema` interceptor. The (possibly modified) response returned by + `post_create_document_schema` will be passed to + `post_create_document_schema_with_metadata`. + """ + return response, metadata + def pre_delete_document_schema( self, request: document_schema_service.DeleteDocumentSchemaRequest, @@ -177,12 +202,35 @@ def post_get_document_schema( ) -> document_schema.DocumentSchema: """Post-rpc interceptor for get_document_schema - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_document_schema_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the DocumentSchemaService server but before - it is returned to user code. + it is returned to user code. This `post_get_document_schema` interceptor runs + before the `post_get_document_schema_with_metadata` interceptor. """ return response + def post_get_document_schema_with_metadata( + self, + response: document_schema.DocumentSchema, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[document_schema.DocumentSchema, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_document_schema + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the DocumentSchemaService server but before it is returned to user code. + + We recommend only using this `post_get_document_schema_with_metadata` + interceptor in new development instead of the `post_get_document_schema` interceptor. + When both interceptors are used, this `post_get_document_schema_with_metadata` interceptor runs after the + `post_get_document_schema` interceptor. The (possibly modified) response returned by + `post_get_document_schema` will be passed to + `post_get_document_schema_with_metadata`. + """ + return response, metadata + def pre_list_document_schemas( self, request: document_schema_service.ListDocumentSchemasRequest, @@ -203,12 +251,38 @@ def post_list_document_schemas( ) -> document_schema_service.ListDocumentSchemasResponse: """Post-rpc interceptor for list_document_schemas - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_document_schemas_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the DocumentSchemaService server but before - it is returned to user code. + it is returned to user code. This `post_list_document_schemas` interceptor runs + before the `post_list_document_schemas_with_metadata` interceptor. """ return response + def post_list_document_schemas_with_metadata( + self, + response: document_schema_service.ListDocumentSchemasResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + document_schema_service.ListDocumentSchemasResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_document_schemas + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the DocumentSchemaService server but before it is returned to user code. + + We recommend only using this `post_list_document_schemas_with_metadata` + interceptor in new development instead of the `post_list_document_schemas` interceptor. + When both interceptors are used, this `post_list_document_schemas_with_metadata` interceptor runs after the + `post_list_document_schemas` interceptor. The (possibly modified) response returned by + `post_list_document_schemas` will be passed to + `post_list_document_schemas_with_metadata`. + """ + return response, metadata + def pre_update_document_schema( self, request: document_schema_service.UpdateDocumentSchemaRequest, @@ -229,12 +303,37 @@ def post_update_document_schema( ) -> gcc_document_schema.DocumentSchema: """Post-rpc interceptor for update_document_schema - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_document_schema_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the DocumentSchemaService server but before - it is returned to user code. + it is returned to user code. This `post_update_document_schema` interceptor runs + before the `post_update_document_schema_with_metadata` interceptor. """ return response + def post_update_document_schema_with_metadata( + self, + response: gcc_document_schema.DocumentSchema, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + gcc_document_schema.DocumentSchema, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for update_document_schema + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the DocumentSchemaService server but before it is returned to user code. + + We recommend only using this `post_update_document_schema_with_metadata` + interceptor in new development instead of the `post_update_document_schema` interceptor. + When both interceptors are used, this `post_update_document_schema_with_metadata` interceptor runs after the + `post_update_document_schema` interceptor. The (possibly modified) response returned by + `post_update_document_schema` will be passed to + `post_update_document_schema_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -478,6 +577,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_document_schema(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_document_schema_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -740,6 +843,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_document_schema(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_document_schema_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -888,6 +995,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_document_schemas(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_document_schemas_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1046,6 +1157,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_document_schema(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_document_schema_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-contentwarehouse/google/cloud/contentwarehouse_v1/services/document_service/client.py b/packages/google-cloud-contentwarehouse/google/cloud/contentwarehouse_v1/services/document_service/client.py index af97ded9e546..1a465a9337d3 100644 --- a/packages/google-cloud-contentwarehouse/google/cloud/contentwarehouse_v1/services/document_service/client.py +++ b/packages/google-cloud-contentwarehouse/google/cloud/contentwarehouse_v1/services/document_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 @@ -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. @@ -1727,16 +1756,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-contentwarehouse/google/cloud/contentwarehouse_v1/services/document_service/transports/rest.py b/packages/google-cloud-contentwarehouse/google/cloud/contentwarehouse_v1/services/document_service/transports/rest.py index f63c43f85b30..bd19343e9f80 100644 --- a/packages/google-cloud-contentwarehouse/google/cloud/contentwarehouse_v1/services/document_service/transports/rest.py +++ b/packages/google-cloud-contentwarehouse/google/cloud/contentwarehouse_v1/services/document_service/transports/rest.py @@ -160,12 +160,37 @@ def post_create_document( ) -> document_service.CreateDocumentResponse: """Post-rpc interceptor for create_document - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_document_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the DocumentService server but before - it is returned to user code. + it is returned to user code. This `post_create_document` interceptor runs + before the `post_create_document_with_metadata` interceptor. """ return response + def post_create_document_with_metadata( + self, + response: document_service.CreateDocumentResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + document_service.CreateDocumentResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for create_document + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the DocumentService server but before it is returned to user code. + + We recommend only using this `post_create_document_with_metadata` + interceptor in new development instead of the `post_create_document` interceptor. + When both interceptors are used, this `post_create_document_with_metadata` interceptor runs after the + `post_create_document` interceptor. The (possibly modified) response returned by + `post_create_document` will be passed to + `post_create_document_with_metadata`. + """ + return response, metadata + def pre_delete_document( self, request: document_service_request.DeleteDocumentRequest, @@ -201,12 +226,37 @@ def post_fetch_acl( ) -> document_service.FetchAclResponse: """Post-rpc interceptor for fetch_acl - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_fetch_acl_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the DocumentService server but before - it is returned to user code. + it is returned to user code. This `post_fetch_acl` interceptor runs + before the `post_fetch_acl_with_metadata` interceptor. """ return response + def post_fetch_acl_with_metadata( + self, + response: document_service.FetchAclResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + document_service.FetchAclResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for fetch_acl + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the DocumentService server but before it is returned to user code. + + We recommend only using this `post_fetch_acl_with_metadata` + interceptor in new development instead of the `post_fetch_acl` interceptor. + When both interceptors are used, this `post_fetch_acl_with_metadata` interceptor runs after the + `post_fetch_acl` interceptor. The (possibly modified) response returned by + `post_fetch_acl` will be passed to + `post_fetch_acl_with_metadata`. + """ + return response, metadata + def pre_get_document( self, request: document_service_request.GetDocumentRequest, @@ -227,12 +277,35 @@ def post_get_document( ) -> gcc_document.Document: """Post-rpc interceptor for get_document - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_document_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the DocumentService server but before - it is returned to user code. + it is returned to user code. This `post_get_document` interceptor runs + before the `post_get_document_with_metadata` interceptor. """ return response + def post_get_document_with_metadata( + self, + response: gcc_document.Document, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gcc_document.Document, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_document + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the DocumentService server but before it is returned to user code. + + We recommend only using this `post_get_document_with_metadata` + interceptor in new development instead of the `post_get_document` interceptor. + When both interceptors are used, this `post_get_document_with_metadata` interceptor runs after the + `post_get_document` interceptor. The (possibly modified) response returned by + `post_get_document` will be passed to + `post_get_document_with_metadata`. + """ + return response, metadata + def pre_lock_document( self, request: document_service_request.LockDocumentRequest, @@ -253,12 +326,35 @@ def post_lock_document( ) -> gcc_document.Document: """Post-rpc interceptor for lock_document - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_lock_document_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the DocumentService server but before - it is returned to user code. + it is returned to user code. This `post_lock_document` interceptor runs + before the `post_lock_document_with_metadata` interceptor. """ return response + def post_lock_document_with_metadata( + self, + response: gcc_document.Document, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gcc_document.Document, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for lock_document + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the DocumentService server but before it is returned to user code. + + We recommend only using this `post_lock_document_with_metadata` + interceptor in new development instead of the `post_lock_document` interceptor. + When both interceptors are used, this `post_lock_document_with_metadata` interceptor runs after the + `post_lock_document` interceptor. The (possibly modified) response returned by + `post_lock_document` will be passed to + `post_lock_document_with_metadata`. + """ + return response, metadata + def pre_search_documents( self, request: document_service_request.SearchDocumentsRequest, @@ -279,12 +375,38 @@ def post_search_documents( ) -> document_service.SearchDocumentsResponse: """Post-rpc interceptor for search_documents - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_search_documents_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the DocumentService server but before - it is returned to user code. + it is returned to user code. This `post_search_documents` interceptor runs + before the `post_search_documents_with_metadata` interceptor. """ return response + def post_search_documents_with_metadata( + self, + response: document_service.SearchDocumentsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + document_service.SearchDocumentsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for search_documents + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the DocumentService server but before it is returned to user code. + + We recommend only using this `post_search_documents_with_metadata` + interceptor in new development instead of the `post_search_documents` interceptor. + When both interceptors are used, this `post_search_documents_with_metadata` interceptor runs after the + `post_search_documents` interceptor. The (possibly modified) response returned by + `post_search_documents` will be passed to + `post_search_documents_with_metadata`. + """ + return response, metadata + def pre_set_acl( self, request: document_service_request.SetAclRequest, @@ -304,12 +426,37 @@ def post_set_acl( ) -> document_service.SetAclResponse: """Post-rpc interceptor for set_acl - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_acl_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the DocumentService server but before - it is returned to user code. + it is returned to user code. This `post_set_acl` interceptor runs + before the `post_set_acl_with_metadata` interceptor. """ return response + def post_set_acl_with_metadata( + self, + response: document_service.SetAclResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + document_service.SetAclResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for set_acl + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the DocumentService server but before it is returned to user code. + + We recommend only using this `post_set_acl_with_metadata` + interceptor in new development instead of the `post_set_acl` interceptor. + When both interceptors are used, this `post_set_acl_with_metadata` interceptor runs after the + `post_set_acl` interceptor. The (possibly modified) response returned by + `post_set_acl` will be passed to + `post_set_acl_with_metadata`. + """ + return response, metadata + def pre_update_document( self, request: document_service_request.UpdateDocumentRequest, @@ -330,12 +477,37 @@ def post_update_document( ) -> document_service.UpdateDocumentResponse: """Post-rpc interceptor for update_document - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_document_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the DocumentService server but before - it is returned to user code. + it is returned to user code. This `post_update_document` interceptor runs + before the `post_update_document_with_metadata` interceptor. """ return response + def post_update_document_with_metadata( + self, + response: document_service.UpdateDocumentResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + document_service.UpdateDocumentResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for update_document + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the DocumentService server but before it is returned to user code. + + We recommend only using this `post_update_document_with_metadata` + interceptor in new development instead of the `post_update_document` interceptor. + When both interceptors are used, this `post_update_document_with_metadata` interceptor runs after the + `post_update_document` interceptor. The (possibly modified) response returned by + `post_update_document` will be passed to + `post_update_document_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -574,6 +746,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_document(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_document_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -844,6 +1020,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_fetch_acl(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_fetch_acl_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -995,6 +1175,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_document(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_document_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1144,6 +1328,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_lock_document(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_lock_document_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1295,6 +1483,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_search_documents(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_search_documents_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1450,6 +1642,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_acl(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_acl_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1599,6 +1795,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_document(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_document_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-contentwarehouse/google/cloud/contentwarehouse_v1/services/pipeline_service/client.py b/packages/google-cloud-contentwarehouse/google/cloud/contentwarehouse_v1/services/pipeline_service/client.py index 2c81f27be6c0..e1b74665bfbb 100644 --- a/packages/google-cloud-contentwarehouse/google/cloud/contentwarehouse_v1/services/pipeline_service/client.py +++ b/packages/google-cloud-contentwarehouse/google/cloud/contentwarehouse_v1/services/pipeline_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 @@ -504,6 +506,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. @@ -880,16 +909,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-contentwarehouse/google/cloud/contentwarehouse_v1/services/pipeline_service/transports/rest.py b/packages/google-cloud-contentwarehouse/google/cloud/contentwarehouse_v1/services/pipeline_service/transports/rest.py index 80f147358162..b3669bca8c18 100644 --- a/packages/google-cloud-contentwarehouse/google/cloud/contentwarehouse_v1/services/pipeline_service/transports/rest.py +++ b/packages/google-cloud-contentwarehouse/google/cloud/contentwarehouse_v1/services/pipeline_service/transports/rest.py @@ -102,12 +102,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 PipelineService 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 PipelineService 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_operation( self, request: operations_pb2.GetOperationRequest, @@ -380,6 +403,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-contentwarehouse/google/cloud/contentwarehouse_v1/services/rule_set_service/client.py b/packages/google-cloud-contentwarehouse/google/cloud/contentwarehouse_v1/services/rule_set_service/client.py index abd7608daa4c..f17e73c0b4ff 100644 --- a/packages/google-cloud-contentwarehouse/google/cloud/contentwarehouse_v1/services/rule_set_service/client.py +++ b/packages/google-cloud-contentwarehouse/google/cloud/contentwarehouse_v1/services/rule_set_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. @@ -1335,16 +1364,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-contentwarehouse/google/cloud/contentwarehouse_v1/services/rule_set_service/transports/rest.py b/packages/google-cloud-contentwarehouse/google/cloud/contentwarehouse_v1/services/rule_set_service/transports/rest.py index 72d159664462..ea31518aa9cb 100644 --- a/packages/google-cloud-contentwarehouse/google/cloud/contentwarehouse_v1/services/rule_set_service/transports/rest.py +++ b/packages/google-cloud-contentwarehouse/google/cloud/contentwarehouse_v1/services/rule_set_service/transports/rest.py @@ -132,12 +132,35 @@ def post_create_rule_set( ) -> rule_engine.RuleSet: """Post-rpc interceptor for create_rule_set - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_rule_set_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RuleSetService server but before - it is returned to user code. + it is returned to user code. This `post_create_rule_set` interceptor runs + before the `post_create_rule_set_with_metadata` interceptor. """ return response + def post_create_rule_set_with_metadata( + self, + response: rule_engine.RuleSet, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[rule_engine.RuleSet, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_rule_set + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RuleSetService server but before it is returned to user code. + + We recommend only using this `post_create_rule_set_with_metadata` + interceptor in new development instead of the `post_create_rule_set` interceptor. + When both interceptors are used, this `post_create_rule_set_with_metadata` interceptor runs after the + `post_create_rule_set` interceptor. The (possibly modified) response returned by + `post_create_rule_set` will be passed to + `post_create_rule_set_with_metadata`. + """ + return response, metadata + def pre_delete_rule_set( self, request: ruleset_service_request.DeleteRuleSetRequest, @@ -171,12 +194,35 @@ def pre_get_rule_set( def post_get_rule_set(self, response: rule_engine.RuleSet) -> rule_engine.RuleSet: """Post-rpc interceptor for get_rule_set - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_rule_set_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RuleSetService server but before - it is returned to user code. + it is returned to user code. This `post_get_rule_set` interceptor runs + before the `post_get_rule_set_with_metadata` interceptor. """ return response + def post_get_rule_set_with_metadata( + self, + response: rule_engine.RuleSet, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[rule_engine.RuleSet, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_rule_set + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RuleSetService server but before it is returned to user code. + + We recommend only using this `post_get_rule_set_with_metadata` + interceptor in new development instead of the `post_get_rule_set` interceptor. + When both interceptors are used, this `post_get_rule_set_with_metadata` interceptor runs after the + `post_get_rule_set` interceptor. The (possibly modified) response returned by + `post_get_rule_set` will be passed to + `post_get_rule_set_with_metadata`. + """ + return response, metadata + def pre_list_rule_sets( self, request: ruleset_service_request.ListRuleSetsRequest, @@ -197,12 +243,38 @@ def post_list_rule_sets( ) -> ruleset_service_request.ListRuleSetsResponse: """Post-rpc interceptor for list_rule_sets - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_rule_sets_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RuleSetService server but before - it is returned to user code. + it is returned to user code. This `post_list_rule_sets` interceptor runs + before the `post_list_rule_sets_with_metadata` interceptor. """ return response + def post_list_rule_sets_with_metadata( + self, + response: ruleset_service_request.ListRuleSetsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + ruleset_service_request.ListRuleSetsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_rule_sets + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RuleSetService server but before it is returned to user code. + + We recommend only using this `post_list_rule_sets_with_metadata` + interceptor in new development instead of the `post_list_rule_sets` interceptor. + When both interceptors are used, this `post_list_rule_sets_with_metadata` interceptor runs after the + `post_list_rule_sets` interceptor. The (possibly modified) response returned by + `post_list_rule_sets` will be passed to + `post_list_rule_sets_with_metadata`. + """ + return response, metadata + def pre_update_rule_set( self, request: ruleset_service_request.UpdateRuleSetRequest, @@ -223,12 +295,35 @@ def post_update_rule_set( ) -> rule_engine.RuleSet: """Post-rpc interceptor for update_rule_set - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_rule_set_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RuleSetService server but before - it is returned to user code. + it is returned to user code. This `post_update_rule_set` interceptor runs + before the `post_update_rule_set_with_metadata` interceptor. """ return response + def post_update_rule_set_with_metadata( + self, + response: rule_engine.RuleSet, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[rule_engine.RuleSet, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_rule_set + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RuleSetService server but before it is returned to user code. + + We recommend only using this `post_update_rule_set_with_metadata` + interceptor in new development instead of the `post_update_rule_set` interceptor. + When both interceptors are used, this `post_update_rule_set_with_metadata` interceptor runs after the + `post_update_rule_set` interceptor. The (possibly modified) response returned by + `post_update_rule_set` will be passed to + `post_update_rule_set_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -467,6 +562,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_rule_set(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_rule_set_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -719,6 +818,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_rule_set(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_rule_set_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -862,6 +965,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_rule_sets(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_rule_sets_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1013,6 +1120,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_rule_set(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_rule_set_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-contentwarehouse/google/cloud/contentwarehouse_v1/services/synonym_set_service/client.py b/packages/google-cloud-contentwarehouse/google/cloud/contentwarehouse_v1/services/synonym_set_service/client.py index 8eaf81880821..491fe09b83cc 100644 --- a/packages/google-cloud-contentwarehouse/google/cloud/contentwarehouse_v1/services/synonym_set_service/client.py +++ b/packages/google-cloud-contentwarehouse/google/cloud/contentwarehouse_v1/services/synonym_set_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 @@ -506,6 +508,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. @@ -1356,16 +1385,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-contentwarehouse/google/cloud/contentwarehouse_v1/services/synonym_set_service/transports/rest.py b/packages/google-cloud-contentwarehouse/google/cloud/contentwarehouse_v1/services/synonym_set_service/transports/rest.py index ae0a7f14cbd7..08f69d2b2b9f 100644 --- a/packages/google-cloud-contentwarehouse/google/cloud/contentwarehouse_v1/services/synonym_set_service/transports/rest.py +++ b/packages/google-cloud-contentwarehouse/google/cloud/contentwarehouse_v1/services/synonym_set_service/transports/rest.py @@ -135,12 +135,35 @@ def post_create_synonym_set( ) -> synonymset.SynonymSet: """Post-rpc interceptor for create_synonym_set - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_synonym_set_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SynonymSetService server but before - it is returned to user code. + it is returned to user code. This `post_create_synonym_set` interceptor runs + before the `post_create_synonym_set_with_metadata` interceptor. """ return response + def post_create_synonym_set_with_metadata( + self, + response: synonymset.SynonymSet, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[synonymset.SynonymSet, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_synonym_set + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SynonymSetService server but before it is returned to user code. + + We recommend only using this `post_create_synonym_set_with_metadata` + interceptor in new development instead of the `post_create_synonym_set` interceptor. + When both interceptors are used, this `post_create_synonym_set_with_metadata` interceptor runs after the + `post_create_synonym_set` interceptor. The (possibly modified) response returned by + `post_create_synonym_set` will be passed to + `post_create_synonym_set_with_metadata`. + """ + return response, metadata + def pre_delete_synonym_set( self, request: synonymset_service_request.DeleteSynonymSetRequest, @@ -176,12 +199,35 @@ def post_get_synonym_set( ) -> synonymset.SynonymSet: """Post-rpc interceptor for get_synonym_set - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_synonym_set_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SynonymSetService server but before - it is returned to user code. + it is returned to user code. This `post_get_synonym_set` interceptor runs + before the `post_get_synonym_set_with_metadata` interceptor. """ return response + def post_get_synonym_set_with_metadata( + self, + response: synonymset.SynonymSet, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[synonymset.SynonymSet, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_synonym_set + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SynonymSetService server but before it is returned to user code. + + We recommend only using this `post_get_synonym_set_with_metadata` + interceptor in new development instead of the `post_get_synonym_set` interceptor. + When both interceptors are used, this `post_get_synonym_set_with_metadata` interceptor runs after the + `post_get_synonym_set` interceptor. The (possibly modified) response returned by + `post_get_synonym_set` will be passed to + `post_get_synonym_set_with_metadata`. + """ + return response, metadata + def pre_list_synonym_sets( self, request: synonymset_service_request.ListSynonymSetsRequest, @@ -202,12 +248,38 @@ def post_list_synonym_sets( ) -> synonymset_service_request.ListSynonymSetsResponse: """Post-rpc interceptor for list_synonym_sets - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_synonym_sets_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SynonymSetService server but before - it is returned to user code. + it is returned to user code. This `post_list_synonym_sets` interceptor runs + before the `post_list_synonym_sets_with_metadata` interceptor. """ return response + def post_list_synonym_sets_with_metadata( + self, + response: synonymset_service_request.ListSynonymSetsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + synonymset_service_request.ListSynonymSetsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_synonym_sets + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SynonymSetService server but before it is returned to user code. + + We recommend only using this `post_list_synonym_sets_with_metadata` + interceptor in new development instead of the `post_list_synonym_sets` interceptor. + When both interceptors are used, this `post_list_synonym_sets_with_metadata` interceptor runs after the + `post_list_synonym_sets` interceptor. The (possibly modified) response returned by + `post_list_synonym_sets` will be passed to + `post_list_synonym_sets_with_metadata`. + """ + return response, metadata + def pre_update_synonym_set( self, request: synonymset_service_request.UpdateSynonymSetRequest, @@ -228,12 +300,35 @@ def post_update_synonym_set( ) -> synonymset.SynonymSet: """Post-rpc interceptor for update_synonym_set - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_synonym_set_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SynonymSetService server but before - it is returned to user code. + it is returned to user code. This `post_update_synonym_set` interceptor runs + before the `post_update_synonym_set_with_metadata` interceptor. """ return response + def post_update_synonym_set_with_metadata( + self, + response: synonymset.SynonymSet, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[synonymset.SynonymSet, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_synonym_set + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SynonymSetService server but before it is returned to user code. + + We recommend only using this `post_update_synonym_set_with_metadata` + interceptor in new development instead of the `post_update_synonym_set` interceptor. + When both interceptors are used, this `post_update_synonym_set_with_metadata` interceptor runs after the + `post_update_synonym_set` interceptor. The (possibly modified) response returned by + `post_update_synonym_set` will be passed to + `post_update_synonym_set_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -482,6 +577,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_synonym_set(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_synonym_set_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -744,6 +843,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_synonym_set(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_synonym_set_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -892,6 +995,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_synonym_sets(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_synonym_sets_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1058,6 +1165,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_synonym_set(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_synonym_set_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-contentwarehouse/samples/generated_samples/snippet_metadata_google.cloud.contentwarehouse.v1.json b/packages/google-cloud-contentwarehouse/samples/generated_samples/snippet_metadata_google.cloud.contentwarehouse.v1.json index a4ef6e0c7057..3d6fe0e86ed6 100644 --- a/packages/google-cloud-contentwarehouse/samples/generated_samples/snippet_metadata_google.cloud.contentwarehouse.v1.json +++ b/packages/google-cloud-contentwarehouse/samples/generated_samples/snippet_metadata_google.cloud.contentwarehouse.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-contentwarehouse", - "version": "0.7.12" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-contentwarehouse/tests/unit/gapic/contentwarehouse_v1/test_document_link_service.py b/packages/google-cloud-contentwarehouse/tests/unit/gapic/contentwarehouse_v1/test_document_link_service.py index 2837aaf39f58..30c39cba35bc 100644 --- a/packages/google-cloud-contentwarehouse/tests/unit/gapic/contentwarehouse_v1/test_document_link_service.py +++ b/packages/google-cloud-contentwarehouse/tests/unit/gapic/contentwarehouse_v1/test_document_link_service.py @@ -66,6 +66,13 @@ document_link_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 @@ -339,6 +346,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 = DocumentLinkServiceClient(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 = DocumentLinkServiceClient(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", [ @@ -3936,10 +3986,14 @@ def test_list_linked_targets_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.DocumentLinkServiceRestInterceptor, "post_list_linked_targets" ) as post, mock.patch.object( + transports.DocumentLinkServiceRestInterceptor, + "post_list_linked_targets_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.DocumentLinkServiceRestInterceptor, "pre_list_linked_targets" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = document_link_service.ListLinkedTargetsRequest.pb( document_link_service.ListLinkedTargetsRequest() ) @@ -3965,6 +4019,10 @@ def test_list_linked_targets_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = document_link_service.ListLinkedTargetsResponse() + post_with_metadata.return_value = ( + document_link_service.ListLinkedTargetsResponse(), + metadata, + ) client.list_linked_targets( request, @@ -3976,6 +4034,7 @@ def test_list_linked_targets_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_linked_sources_rest_bad_request( @@ -4060,10 +4119,14 @@ def test_list_linked_sources_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.DocumentLinkServiceRestInterceptor, "post_list_linked_sources" ) as post, mock.patch.object( + transports.DocumentLinkServiceRestInterceptor, + "post_list_linked_sources_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.DocumentLinkServiceRestInterceptor, "pre_list_linked_sources" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = document_link_service.ListLinkedSourcesRequest.pb( document_link_service.ListLinkedSourcesRequest() ) @@ -4089,6 +4152,10 @@ def test_list_linked_sources_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = document_link_service.ListLinkedSourcesResponse() + post_with_metadata.return_value = ( + document_link_service.ListLinkedSourcesResponse(), + metadata, + ) client.list_linked_sources( request, @@ -4100,6 +4167,7 @@ def test_list_linked_sources_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_document_link_rest_bad_request( @@ -4188,10 +4256,14 @@ def test_create_document_link_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.DocumentLinkServiceRestInterceptor, "post_create_document_link" ) as post, mock.patch.object( + transports.DocumentLinkServiceRestInterceptor, + "post_create_document_link_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.DocumentLinkServiceRestInterceptor, "pre_create_document_link" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = document_link_service.CreateDocumentLinkRequest.pb( document_link_service.CreateDocumentLinkRequest() ) @@ -4217,6 +4289,7 @@ def test_create_document_link_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = document_link_service.DocumentLink() + post_with_metadata.return_value = document_link_service.DocumentLink(), metadata client.create_document_link( request, @@ -4228,6 +4301,7 @@ def test_create_document_link_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_document_link_rest_bad_request( diff --git a/packages/google-cloud-contentwarehouse/tests/unit/gapic/contentwarehouse_v1/test_document_schema_service.py b/packages/google-cloud-contentwarehouse/tests/unit/gapic/contentwarehouse_v1/test_document_schema_service.py index f438ebdf86e5..98ed8fc315e8 100644 --- a/packages/google-cloud-contentwarehouse/tests/unit/gapic/contentwarehouse_v1/test_document_schema_service.py +++ b/packages/google-cloud-contentwarehouse/tests/unit/gapic/contentwarehouse_v1/test_document_schema_service.py @@ -66,6 +66,13 @@ from google.cloud.contentwarehouse_v1.types import document_schema from google.cloud.contentwarehouse_v1.types import document_schema_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 @@ -341,6 +348,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 = DocumentSchemaServiceClient(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 = DocumentSchemaServiceClient(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", [ @@ -4696,10 +4746,14 @@ def test_create_document_schema_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.DocumentSchemaServiceRestInterceptor, "post_create_document_schema" ) as post, mock.patch.object( + transports.DocumentSchemaServiceRestInterceptor, + "post_create_document_schema_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.DocumentSchemaServiceRestInterceptor, "pre_create_document_schema" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = document_schema_service.CreateDocumentSchemaRequest.pb( document_schema_service.CreateDocumentSchemaRequest() ) @@ -4725,6 +4779,7 @@ def test_create_document_schema_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcc_document_schema.DocumentSchema() + post_with_metadata.return_value = gcc_document_schema.DocumentSchema(), metadata client.create_document_schema( request, @@ -4736,6 +4791,7 @@ def test_create_document_schema_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_document_schema_rest_bad_request( @@ -4830,10 +4886,14 @@ def test_update_document_schema_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.DocumentSchemaServiceRestInterceptor, "post_update_document_schema" ) as post, mock.patch.object( + transports.DocumentSchemaServiceRestInterceptor, + "post_update_document_schema_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.DocumentSchemaServiceRestInterceptor, "pre_update_document_schema" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = document_schema_service.UpdateDocumentSchemaRequest.pb( document_schema_service.UpdateDocumentSchemaRequest() ) @@ -4859,6 +4919,7 @@ def test_update_document_schema_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcc_document_schema.DocumentSchema() + post_with_metadata.return_value = gcc_document_schema.DocumentSchema(), metadata client.update_document_schema( request, @@ -4870,6 +4931,7 @@ def test_update_document_schema_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_document_schema_rest_bad_request( @@ -4964,10 +5026,14 @@ def test_get_document_schema_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.DocumentSchemaServiceRestInterceptor, "post_get_document_schema" ) as post, mock.patch.object( + transports.DocumentSchemaServiceRestInterceptor, + "post_get_document_schema_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.DocumentSchemaServiceRestInterceptor, "pre_get_document_schema" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = document_schema_service.GetDocumentSchemaRequest.pb( document_schema_service.GetDocumentSchemaRequest() ) @@ -4993,6 +5059,7 @@ def test_get_document_schema_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = document_schema.DocumentSchema() + post_with_metadata.return_value = document_schema.DocumentSchema(), metadata client.get_document_schema( request, @@ -5004,6 +5071,7 @@ def test_get_document_schema_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_document_schema_rest_bad_request( @@ -5203,10 +5271,14 @@ def test_list_document_schemas_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.DocumentSchemaServiceRestInterceptor, "post_list_document_schemas" ) as post, mock.patch.object( + transports.DocumentSchemaServiceRestInterceptor, + "post_list_document_schemas_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.DocumentSchemaServiceRestInterceptor, "pre_list_document_schemas" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = document_schema_service.ListDocumentSchemasRequest.pb( document_schema_service.ListDocumentSchemasRequest() ) @@ -5232,6 +5304,10 @@ def test_list_document_schemas_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = document_schema_service.ListDocumentSchemasResponse() + post_with_metadata.return_value = ( + document_schema_service.ListDocumentSchemasResponse(), + metadata, + ) client.list_document_schemas( request, @@ -5243,6 +5319,7 @@ def test_list_document_schemas_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-contentwarehouse/tests/unit/gapic/contentwarehouse_v1/test_document_service.py b/packages/google-cloud-contentwarehouse/tests/unit/gapic/contentwarehouse_v1/test_document_service.py index fd8d8f1719db..b5fc6ccd9ca6 100644 --- a/packages/google-cloud-contentwarehouse/tests/unit/gapic/contentwarehouse_v1/test_document_service.py +++ b/packages/google-cloud-contentwarehouse/tests/unit/gapic/contentwarehouse_v1/test_document_service.py @@ -86,6 +86,13 @@ from google.cloud.contentwarehouse_v1.types import common from google.cloud.contentwarehouse_v1.types import document as gcc_document +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 @@ -344,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 = DocumentServiceClient(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 = DocumentServiceClient(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", [ @@ -6186,10 +6236,13 @@ def test_create_document_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.DocumentServiceRestInterceptor, "post_create_document" ) as post, mock.patch.object( + transports.DocumentServiceRestInterceptor, "post_create_document_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.DocumentServiceRestInterceptor, "pre_create_document" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = document_service_request.CreateDocumentRequest.pb( document_service_request.CreateDocumentRequest() ) @@ -6215,6 +6268,10 @@ def test_create_document_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = document_service.CreateDocumentResponse() + post_with_metadata.return_value = ( + document_service.CreateDocumentResponse(), + metadata, + ) client.create_document( request, @@ -6226,6 +6283,7 @@ def test_create_document_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_document_rest_bad_request( @@ -6345,10 +6403,13 @@ def test_get_document_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.DocumentServiceRestInterceptor, "post_get_document" ) as post, mock.patch.object( + transports.DocumentServiceRestInterceptor, "post_get_document_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.DocumentServiceRestInterceptor, "pre_get_document" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = document_service_request.GetDocumentRequest.pb( document_service_request.GetDocumentRequest() ) @@ -6372,6 +6433,7 @@ def test_get_document_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcc_document.Document() + post_with_metadata.return_value = gcc_document.Document(), metadata client.get_document( request, @@ -6383,6 +6445,7 @@ def test_get_document_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_document_rest_bad_request( @@ -6464,10 +6527,13 @@ def test_update_document_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.DocumentServiceRestInterceptor, "post_update_document" ) as post, mock.patch.object( + transports.DocumentServiceRestInterceptor, "post_update_document_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.DocumentServiceRestInterceptor, "pre_update_document" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = document_service_request.UpdateDocumentRequest.pb( document_service_request.UpdateDocumentRequest() ) @@ -6493,6 +6559,10 @@ def test_update_document_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = document_service.UpdateDocumentResponse() + post_with_metadata.return_value = ( + document_service.UpdateDocumentResponse(), + metadata, + ) client.update_document( request, @@ -6504,6 +6574,7 @@ def test_update_document_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_document_rest_bad_request( @@ -6701,10 +6772,13 @@ def test_search_documents_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.DocumentServiceRestInterceptor, "post_search_documents" ) as post, mock.patch.object( + transports.DocumentServiceRestInterceptor, "post_search_documents_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.DocumentServiceRestInterceptor, "pre_search_documents" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = document_service_request.SearchDocumentsRequest.pb( document_service_request.SearchDocumentsRequest() ) @@ -6730,6 +6804,10 @@ def test_search_documents_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = document_service.SearchDocumentsResponse() + post_with_metadata.return_value = ( + document_service.SearchDocumentsResponse(), + metadata, + ) client.search_documents( request, @@ -6741,6 +6819,7 @@ def test_search_documents_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_lock_document_rest_bad_request( @@ -6860,10 +6939,13 @@ def test_lock_document_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.DocumentServiceRestInterceptor, "post_lock_document" ) as post, mock.patch.object( + transports.DocumentServiceRestInterceptor, "post_lock_document_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.DocumentServiceRestInterceptor, "pre_lock_document" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = document_service_request.LockDocumentRequest.pb( document_service_request.LockDocumentRequest() ) @@ -6887,6 +6969,7 @@ def test_lock_document_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcc_document.Document() + post_with_metadata.return_value = gcc_document.Document(), metadata client.lock_document( request, @@ -6898,6 +6981,7 @@ def test_lock_document_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_fetch_acl_rest_bad_request( @@ -6979,10 +7063,13 @@ def test_fetch_acl_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.DocumentServiceRestInterceptor, "post_fetch_acl" ) as post, mock.patch.object( + transports.DocumentServiceRestInterceptor, "post_fetch_acl_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.DocumentServiceRestInterceptor, "pre_fetch_acl" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = document_service_request.FetchAclRequest.pb( document_service_request.FetchAclRequest() ) @@ -7008,6 +7095,7 @@ def test_fetch_acl_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = document_service.FetchAclResponse() + post_with_metadata.return_value = document_service.FetchAclResponse(), metadata client.fetch_acl( request, @@ -7019,6 +7107,7 @@ def test_fetch_acl_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_acl_rest_bad_request(request_type=document_service_request.SetAclRequest): @@ -7098,10 +7187,13 @@ def test_set_acl_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.DocumentServiceRestInterceptor, "post_set_acl" ) as post, mock.patch.object( + transports.DocumentServiceRestInterceptor, "post_set_acl_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.DocumentServiceRestInterceptor, "pre_set_acl" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = document_service_request.SetAclRequest.pb( document_service_request.SetAclRequest() ) @@ -7127,6 +7219,7 @@ def test_set_acl_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = document_service.SetAclResponse() + post_with_metadata.return_value = document_service.SetAclResponse(), metadata client.set_acl( request, @@ -7138,6 +7231,7 @@ def test_set_acl_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-contentwarehouse/tests/unit/gapic/contentwarehouse_v1/test_pipeline_service.py b/packages/google-cloud-contentwarehouse/tests/unit/gapic/contentwarehouse_v1/test_pipeline_service.py index b2ab9bdcfb17..33341fa83509 100644 --- a/packages/google-cloud-contentwarehouse/tests/unit/gapic/contentwarehouse_v1/test_pipeline_service.py +++ b/packages/google-cloud-contentwarehouse/tests/unit/gapic/contentwarehouse_v1/test_pipeline_service.py @@ -71,6 +71,13 @@ ) from google.cloud.contentwarehouse_v1.types import common, pipeline_service, pipelines +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 = PipelineServiceClient(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 = PipelineServiceClient(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", [ @@ -1850,10 +1900,13 @@ def test_run_pipeline_rest_interceptors(null_interceptor): ), mock.patch.object( transports.PipelineServiceRestInterceptor, "post_run_pipeline" ) as post, mock.patch.object( + transports.PipelineServiceRestInterceptor, "post_run_pipeline_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.PipelineServiceRestInterceptor, "pre_run_pipeline" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = pipeline_service.RunPipelineRequest.pb( pipeline_service.RunPipelineRequest() ) @@ -1877,6 +1930,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, @@ -1888,6 +1942,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_operation_rest_bad_request( diff --git a/packages/google-cloud-contentwarehouse/tests/unit/gapic/contentwarehouse_v1/test_rule_set_service.py b/packages/google-cloud-contentwarehouse/tests/unit/gapic/contentwarehouse_v1/test_rule_set_service.py index 7848e16f6034..eacfbb42420d 100644 --- a/packages/google-cloud-contentwarehouse/tests/unit/gapic/contentwarehouse_v1/test_rule_set_service.py +++ b/packages/google-cloud-contentwarehouse/tests/unit/gapic/contentwarehouse_v1/test_rule_set_service.py @@ -63,6 +63,13 @@ ) from google.cloud.contentwarehouse_v1.types import rule_engine, ruleset_service_request +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 @@ -321,6 +328,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 = RuleSetServiceClient(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 = RuleSetServiceClient(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", [ @@ -4470,10 +4520,13 @@ def test_create_rule_set_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RuleSetServiceRestInterceptor, "post_create_rule_set" ) as post, mock.patch.object( + transports.RuleSetServiceRestInterceptor, "post_create_rule_set_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RuleSetServiceRestInterceptor, "pre_create_rule_set" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = ruleset_service_request.CreateRuleSetRequest.pb( ruleset_service_request.CreateRuleSetRequest() ) @@ -4497,6 +4550,7 @@ def test_create_rule_set_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = rule_engine.RuleSet() + post_with_metadata.return_value = rule_engine.RuleSet(), metadata client.create_rule_set( request, @@ -4508,6 +4562,7 @@ def test_create_rule_set_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rule_set_rest_bad_request( @@ -4596,10 +4651,13 @@ def test_get_rule_set_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RuleSetServiceRestInterceptor, "post_get_rule_set" ) as post, mock.patch.object( + transports.RuleSetServiceRestInterceptor, "post_get_rule_set_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RuleSetServiceRestInterceptor, "pre_get_rule_set" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = ruleset_service_request.GetRuleSetRequest.pb( ruleset_service_request.GetRuleSetRequest() ) @@ -4623,6 +4681,7 @@ def test_get_rule_set_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = rule_engine.RuleSet() + post_with_metadata.return_value = rule_engine.RuleSet(), metadata client.get_rule_set( request, @@ -4634,6 +4693,7 @@ def test_get_rule_set_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_rule_set_rest_bad_request( @@ -4722,10 +4782,13 @@ def test_update_rule_set_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RuleSetServiceRestInterceptor, "post_update_rule_set" ) as post, mock.patch.object( + transports.RuleSetServiceRestInterceptor, "post_update_rule_set_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RuleSetServiceRestInterceptor, "pre_update_rule_set" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = ruleset_service_request.UpdateRuleSetRequest.pb( ruleset_service_request.UpdateRuleSetRequest() ) @@ -4749,6 +4812,7 @@ def test_update_rule_set_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = rule_engine.RuleSet() + post_with_metadata.return_value = rule_engine.RuleSet(), metadata client.update_rule_set( request, @@ -4760,6 +4824,7 @@ def test_update_rule_set_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rule_set_rest_bad_request( @@ -4953,10 +5018,13 @@ def test_list_rule_sets_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RuleSetServiceRestInterceptor, "post_list_rule_sets" ) as post, mock.patch.object( + transports.RuleSetServiceRestInterceptor, "post_list_rule_sets_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RuleSetServiceRestInterceptor, "pre_list_rule_sets" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = ruleset_service_request.ListRuleSetsRequest.pb( ruleset_service_request.ListRuleSetsRequest() ) @@ -4982,6 +5050,10 @@ def test_list_rule_sets_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = ruleset_service_request.ListRuleSetsResponse() + post_with_metadata.return_value = ( + ruleset_service_request.ListRuleSetsResponse(), + metadata, + ) client.list_rule_sets( request, @@ -4993,6 +5065,7 @@ def test_list_rule_sets_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-contentwarehouse/tests/unit/gapic/contentwarehouse_v1/test_synonym_set_service.py b/packages/google-cloud-contentwarehouse/tests/unit/gapic/contentwarehouse_v1/test_synonym_set_service.py index 6541b5f3a56a..7282b0f09f27 100644 --- a/packages/google-cloud-contentwarehouse/tests/unit/gapic/contentwarehouse_v1/test_synonym_set_service.py +++ b/packages/google-cloud-contentwarehouse/tests/unit/gapic/contentwarehouse_v1/test_synonym_set_service.py @@ -64,6 +64,13 @@ synonymset_service_request, ) +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 = SynonymSetServiceClient(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 = SynonymSetServiceClient(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", [ @@ -4566,10 +4616,14 @@ def test_create_synonym_set_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SynonymSetServiceRestInterceptor, "post_create_synonym_set" ) as post, mock.patch.object( + transports.SynonymSetServiceRestInterceptor, + "post_create_synonym_set_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SynonymSetServiceRestInterceptor, "pre_create_synonym_set" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = synonymset_service_request.CreateSynonymSetRequest.pb( synonymset_service_request.CreateSynonymSetRequest() ) @@ -4593,6 +4647,7 @@ def test_create_synonym_set_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = synonymset.SynonymSet() + post_with_metadata.return_value = synonymset.SynonymSet(), metadata client.create_synonym_set( request, @@ -4604,6 +4659,7 @@ def test_create_synonym_set_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_synonym_set_rest_bad_request( @@ -4690,10 +4746,14 @@ def test_get_synonym_set_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SynonymSetServiceRestInterceptor, "post_get_synonym_set" ) as post, mock.patch.object( + transports.SynonymSetServiceRestInterceptor, + "post_get_synonym_set_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SynonymSetServiceRestInterceptor, "pre_get_synonym_set" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = synonymset_service_request.GetSynonymSetRequest.pb( synonymset_service_request.GetSynonymSetRequest() ) @@ -4717,6 +4777,7 @@ def test_get_synonym_set_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = synonymset.SynonymSet() + post_with_metadata.return_value = synonymset.SynonymSet(), metadata client.get_synonym_set( request, @@ -4728,6 +4789,7 @@ def test_get_synonym_set_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_synonym_set_rest_bad_request( @@ -4888,10 +4950,14 @@ def test_update_synonym_set_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SynonymSetServiceRestInterceptor, "post_update_synonym_set" ) as post, mock.patch.object( + transports.SynonymSetServiceRestInterceptor, + "post_update_synonym_set_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SynonymSetServiceRestInterceptor, "pre_update_synonym_set" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = synonymset_service_request.UpdateSynonymSetRequest.pb( synonymset_service_request.UpdateSynonymSetRequest() ) @@ -4915,6 +4981,7 @@ def test_update_synonym_set_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = synonymset.SynonymSet() + post_with_metadata.return_value = synonymset.SynonymSet(), metadata client.update_synonym_set( request, @@ -4926,6 +4993,7 @@ def test_update_synonym_set_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_synonym_set_rest_bad_request( @@ -5121,10 +5189,14 @@ def test_list_synonym_sets_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SynonymSetServiceRestInterceptor, "post_list_synonym_sets" ) as post, mock.patch.object( + transports.SynonymSetServiceRestInterceptor, + "post_list_synonym_sets_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SynonymSetServiceRestInterceptor, "pre_list_synonym_sets" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = synonymset_service_request.ListSynonymSetsRequest.pb( synonymset_service_request.ListSynonymSetsRequest() ) @@ -5150,6 +5222,10 @@ def test_list_synonym_sets_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = synonymset_service_request.ListSynonymSetsResponse() + post_with_metadata.return_value = ( + synonymset_service_request.ListSynonymSetsResponse(), + metadata, + ) client.list_synonym_sets( request, @@ -5161,6 +5237,7 @@ def test_list_synonym_sets_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-data-fusion/google/cloud/data_fusion/gapic_version.py b/packages/google-cloud-data-fusion/google/cloud/data_fusion/gapic_version.py index 739fdfae141c..558c8aab67c5 100644 --- a/packages/google-cloud-data-fusion/google/cloud/data_fusion/gapic_version.py +++ b/packages/google-cloud-data-fusion/google/cloud/data_fusion/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.12.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-data-fusion/google/cloud/data_fusion_v1/gapic_version.py b/packages/google-cloud-data-fusion/google/cloud/data_fusion_v1/gapic_version.py index 739fdfae141c..558c8aab67c5 100644 --- a/packages/google-cloud-data-fusion/google/cloud/data_fusion_v1/gapic_version.py +++ b/packages/google-cloud-data-fusion/google/cloud/data_fusion_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.12.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-data-fusion/google/cloud/data_fusion_v1/services/data_fusion/client.py b/packages/google-cloud-data-fusion/google/cloud/data_fusion_v1/services/data_fusion/client.py index 73aae58c91f0..75497fc61ba6 100644 --- a/packages/google-cloud-data-fusion/google/cloud/data_fusion_v1/services/data_fusion/client.py +++ b/packages/google-cloud-data-fusion/google/cloud/data_fusion_v1/services/data_fusion/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 @@ -515,6 +517,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-data-fusion/google/cloud/data_fusion_v1/services/data_fusion/transports/rest.py b/packages/google-cloud-data-fusion/google/cloud/data_fusion_v1/services/data_fusion/transports/rest.py index dc7929200ee1..87a3a46191b6 100644 --- a/packages/google-cloud-data-fusion/google/cloud/data_fusion_v1/services/data_fusion/transports/rest.py +++ b/packages/google-cloud-data-fusion/google/cloud/data_fusion_v1/services/data_fusion/transports/rest.py @@ -150,12 +150,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 DataFusion 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 DataFusion 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_delete_instance( self, request: datafusion.DeleteInstanceRequest, @@ -175,12 +198,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 DataFusion 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 DataFusion 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_get_instance( self, request: datafusion.GetInstanceRequest, @@ -196,12 +242,35 @@ def pre_get_instance( def post_get_instance(self, response: datafusion.Instance) -> datafusion.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 DataFusion 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: datafusion.Instance, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[datafusion.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 DataFusion 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_list_available_versions( self, request: datafusion.ListAvailableVersionsRequest, @@ -221,12 +290,38 @@ def post_list_available_versions( ) -> datafusion.ListAvailableVersionsResponse: """Post-rpc interceptor for list_available_versions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_available_versions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the DataFusion server but before - it is returned to user code. + it is returned to user code. This `post_list_available_versions` interceptor runs + before the `post_list_available_versions_with_metadata` interceptor. """ return response + def post_list_available_versions_with_metadata( + self, + response: datafusion.ListAvailableVersionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + datafusion.ListAvailableVersionsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_available_versions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the DataFusion server but before it is returned to user code. + + We recommend only using this `post_list_available_versions_with_metadata` + interceptor in new development instead of the `post_list_available_versions` interceptor. + When both interceptors are used, this `post_list_available_versions_with_metadata` interceptor runs after the + `post_list_available_versions` interceptor. The (possibly modified) response returned by + `post_list_available_versions` will be passed to + `post_list_available_versions_with_metadata`. + """ + return response, metadata + def pre_list_instances( self, request: datafusion.ListInstancesRequest, @@ -246,12 +341,37 @@ def post_list_instances( ) -> datafusion.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 DataFusion 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: datafusion.ListInstancesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + datafusion.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 DataFusion 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_restart_instance( self, request: datafusion.RestartInstanceRequest, @@ -271,12 +391,35 @@ def post_restart_instance( ) -> operations_pb2.Operation: """Post-rpc interceptor for restart_instance - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_restart_instance_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the DataFusion server but before - it is returned to user code. + it is returned to user code. This `post_restart_instance` interceptor runs + before the `post_restart_instance_with_metadata` interceptor. """ return response + def post_restart_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 restart_instance + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the DataFusion server but before it is returned to user code. + + We recommend only using this `post_restart_instance_with_metadata` + interceptor in new development instead of the `post_restart_instance` interceptor. + When both interceptors are used, this `post_restart_instance_with_metadata` interceptor runs after the + `post_restart_instance` interceptor. The (possibly modified) response returned by + `post_restart_instance` will be passed to + `post_restart_instance_with_metadata`. + """ + return response, metadata + def pre_update_instance( self, request: datafusion.UpdateInstanceRequest, @@ -296,12 +439,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 DataFusion 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 DataFusion 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 + @dataclasses.dataclass class DataFusionRestStub: @@ -574,6 +740,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 @@ -718,6 +888,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 @@ -863,6 +1037,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 @@ -1008,6 +1186,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_available_versions(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_available_versions_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1157,6 +1339,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 @@ -1309,6 +1495,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_restart_instance(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_restart_instance_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1464,6 +1654,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 diff --git a/packages/google-cloud-data-fusion/samples/generated_samples/snippet_metadata_google.cloud.datafusion.v1.json b/packages/google-cloud-data-fusion/samples/generated_samples/snippet_metadata_google.cloud.datafusion.v1.json index 39a755aecf3d..fce0307055b9 100644 --- a/packages/google-cloud-data-fusion/samples/generated_samples/snippet_metadata_google.cloud.datafusion.v1.json +++ b/packages/google-cloud-data-fusion/samples/generated_samples/snippet_metadata_google.cloud.datafusion.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-data-fusion", - "version": "1.12.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-data-fusion/tests/unit/gapic/data_fusion_v1/test_data_fusion.py b/packages/google-cloud-data-fusion/tests/unit/gapic/data_fusion_v1/test_data_fusion.py index faf8ce38b522..45cb51b97d2c 100644 --- a/packages/google-cloud-data-fusion/tests/unit/gapic/data_fusion_v1/test_data_fusion.py +++ b/packages/google-cloud-data-fusion/tests/unit/gapic/data_fusion_v1/test_data_fusion.py @@ -73,6 +73,13 @@ ) from google.cloud.data_fusion_v1.types import datafusion +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 = DataFusionClient(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 = DataFusionClient(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", [ @@ -5425,10 +5475,14 @@ def test_list_available_versions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.DataFusionRestInterceptor, "post_list_available_versions" ) as post, mock.patch.object( + transports.DataFusionRestInterceptor, + "post_list_available_versions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.DataFusionRestInterceptor, "pre_list_available_versions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = datafusion.ListAvailableVersionsRequest.pb( datafusion.ListAvailableVersionsRequest() ) @@ -5454,6 +5508,10 @@ def test_list_available_versions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = datafusion.ListAvailableVersionsResponse() + post_with_metadata.return_value = ( + datafusion.ListAvailableVersionsResponse(), + metadata, + ) client.list_available_versions( request, @@ -5465,6 +5523,7 @@ def test_list_available_versions_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_instances_rest_bad_request(request_type=datafusion.ListInstancesRequest): @@ -5549,10 +5608,13 @@ def test_list_instances_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.DataFusionRestInterceptor, "post_list_instances" ) as post, mock.patch.object( + transports.DataFusionRestInterceptor, "post_list_instances_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.DataFusionRestInterceptor, "pre_list_instances" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = datafusion.ListInstancesRequest.pb( datafusion.ListInstancesRequest() ) @@ -5578,6 +5640,7 @@ def test_list_instances_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = datafusion.ListInstancesResponse() + post_with_metadata.return_value = datafusion.ListInstancesResponse(), metadata client.list_instances( request, @@ -5589,6 +5652,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(request_type=datafusion.GetInstanceRequest): @@ -5711,10 +5775,13 @@ def test_get_instance_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.DataFusionRestInterceptor, "post_get_instance" ) as post, mock.patch.object( + transports.DataFusionRestInterceptor, "post_get_instance_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.DataFusionRestInterceptor, "pre_get_instance" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = datafusion.GetInstanceRequest.pb(datafusion.GetInstanceRequest()) transcode.return_value = { "method": "post", @@ -5736,6 +5803,7 @@ def test_get_instance_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = datafusion.Instance() + post_with_metadata.return_value = datafusion.Instance(), metadata client.get_instance( request, @@ -5747,6 +5815,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( @@ -5937,10 +6006,13 @@ def test_create_instance_rest_interceptors(null_interceptor): ), mock.patch.object( transports.DataFusionRestInterceptor, "post_create_instance" ) as post, mock.patch.object( + transports.DataFusionRestInterceptor, "post_create_instance_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.DataFusionRestInterceptor, "pre_create_instance" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = datafusion.CreateInstanceRequest.pb( datafusion.CreateInstanceRequest() ) @@ -5964,6 +6036,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, @@ -5975,6 +6048,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_delete_instance_rest_bad_request( @@ -6055,10 +6129,13 @@ def test_delete_instance_rest_interceptors(null_interceptor): ), mock.patch.object( transports.DataFusionRestInterceptor, "post_delete_instance" ) as post, mock.patch.object( + transports.DataFusionRestInterceptor, "post_delete_instance_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.DataFusionRestInterceptor, "pre_delete_instance" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = datafusion.DeleteInstanceRequest.pb( datafusion.DeleteInstanceRequest() ) @@ -6082,6 +6159,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, @@ -6093,6 +6171,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_update_instance_rest_bad_request( @@ -6287,10 +6366,13 @@ def test_update_instance_rest_interceptors(null_interceptor): ), mock.patch.object( transports.DataFusionRestInterceptor, "post_update_instance" ) as post, mock.patch.object( + transports.DataFusionRestInterceptor, "post_update_instance_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.DataFusionRestInterceptor, "pre_update_instance" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = datafusion.UpdateInstanceRequest.pb( datafusion.UpdateInstanceRequest() ) @@ -6314,6 +6396,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, @@ -6325,6 +6408,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_restart_instance_rest_bad_request( @@ -6405,10 +6489,13 @@ def test_restart_instance_rest_interceptors(null_interceptor): ), mock.patch.object( transports.DataFusionRestInterceptor, "post_restart_instance" ) as post, mock.patch.object( + transports.DataFusionRestInterceptor, "post_restart_instance_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.DataFusionRestInterceptor, "pre_restart_instance" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = datafusion.RestartInstanceRequest.pb( datafusion.RestartInstanceRequest() ) @@ -6432,6 +6519,7 @@ def test_restart_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.restart_instance( request, @@ -6443,6 +6531,7 @@ def test_restart_instance_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-data-qna/google/cloud/dataqna/gapic_version.py b/packages/google-cloud-data-qna/google/cloud/dataqna/gapic_version.py index e9c1f8ae6685..558c8aab67c5 100644 --- a/packages/google-cloud-data-qna/google/cloud/dataqna/gapic_version.py +++ b/packages/google-cloud-data-qna/google/cloud/dataqna/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.10.14" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-data-qna/google/cloud/dataqna_v1alpha/gapic_version.py b/packages/google-cloud-data-qna/google/cloud/dataqna_v1alpha/gapic_version.py index e9c1f8ae6685..558c8aab67c5 100644 --- a/packages/google-cloud-data-qna/google/cloud/dataqna_v1alpha/gapic_version.py +++ b/packages/google-cloud-data-qna/google/cloud/dataqna_v1alpha/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.10.14" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-data-qna/google/cloud/dataqna_v1alpha/services/auto_suggestion_service/client.py b/packages/google-cloud-data-qna/google/cloud/dataqna_v1alpha/services/auto_suggestion_service/client.py index 9b32b8eb282f..af544a5b7180 100644 --- a/packages/google-cloud-data-qna/google/cloud/dataqna_v1alpha/services/auto_suggestion_service/client.py +++ b/packages/google-cloud-data-qna/google/cloud/dataqna_v1alpha/services/auto_suggestion_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 @@ -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-data-qna/google/cloud/dataqna_v1alpha/services/auto_suggestion_service/transports/rest.py b/packages/google-cloud-data-qna/google/cloud/dataqna_v1alpha/services/auto_suggestion_service/transports/rest.py index ad3719a8f2e6..42bd5e0fa975 100644 --- a/packages/google-cloud-data-qna/google/cloud/dataqna_v1alpha/services/auto_suggestion_service/transports/rest.py +++ b/packages/google-cloud-data-qna/google/cloud/dataqna_v1alpha/services/auto_suggestion_service/transports/rest.py @@ -102,12 +102,38 @@ def post_suggest_queries( ) -> auto_suggestion_service.SuggestQueriesResponse: """Post-rpc interceptor for suggest_queries - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_suggest_queries_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AutoSuggestionService server but before - it is returned to user code. + it is returned to user code. This `post_suggest_queries` interceptor runs + before the `post_suggest_queries_with_metadata` interceptor. """ return response + def post_suggest_queries_with_metadata( + self, + response: auto_suggestion_service.SuggestQueriesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + auto_suggestion_service.SuggestQueriesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for suggest_queries + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AutoSuggestionService server but before it is returned to user code. + + We recommend only using this `post_suggest_queries_with_metadata` + interceptor in new development instead of the `post_suggest_queries` interceptor. + When both interceptors are used, this `post_suggest_queries_with_metadata` interceptor runs after the + `post_suggest_queries` interceptor. The (possibly modified) response returned by + `post_suggest_queries` will be passed to + `post_suggest_queries_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class AutoSuggestionServiceRestStub: @@ -393,6 +419,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_suggest_queries(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_suggest_queries_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-data-qna/google/cloud/dataqna_v1alpha/services/question_service/client.py b/packages/google-cloud-data-qna/google/cloud/dataqna_v1alpha/services/question_service/client.py index 58374dbad140..f264f29158d9 100644 --- a/packages/google-cloud-data-qna/google/cloud/dataqna_v1alpha/services/question_service/client.py +++ b/packages/google-cloud-data-qna/google/cloud/dataqna_v1alpha/services/question_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 @@ -530,6 +532,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-data-qna/google/cloud/dataqna_v1alpha/services/question_service/transports/rest.py b/packages/google-cloud-data-qna/google/cloud/dataqna_v1alpha/services/question_service/transports/rest.py index f023acb8467e..5f5e1415a6b8 100644 --- a/packages/google-cloud-data-qna/google/cloud/dataqna_v1alpha/services/question_service/transports/rest.py +++ b/packages/google-cloud-data-qna/google/cloud/dataqna_v1alpha/services/question_service/transports/rest.py @@ -137,12 +137,35 @@ def post_create_question( ) -> gcd_question.Question: """Post-rpc interceptor for create_question - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_question_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the QuestionService server but before - it is returned to user code. + it is returned to user code. This `post_create_question` interceptor runs + before the `post_create_question_with_metadata` interceptor. """ return response + def post_create_question_with_metadata( + self, + response: gcd_question.Question, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gcd_question.Question, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_question + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the QuestionService server but before it is returned to user code. + + We recommend only using this `post_create_question_with_metadata` + interceptor in new development instead of the `post_create_question` interceptor. + When both interceptors are used, this `post_create_question_with_metadata` interceptor runs after the + `post_create_question` interceptor. The (possibly modified) response returned by + `post_create_question` will be passed to + `post_create_question_with_metadata`. + """ + return response, metadata + def pre_execute_question( self, request: question_service.ExecuteQuestionRequest, @@ -160,12 +183,35 @@ def pre_execute_question( def post_execute_question(self, response: question.Question) -> question.Question: """Post-rpc interceptor for execute_question - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_execute_question_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the QuestionService server but before - it is returned to user code. + it is returned to user code. This `post_execute_question` interceptor runs + before the `post_execute_question_with_metadata` interceptor. """ return response + def post_execute_question_with_metadata( + self, + response: question.Question, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[question.Question, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for execute_question + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the QuestionService server but before it is returned to user code. + + We recommend only using this `post_execute_question_with_metadata` + interceptor in new development instead of the `post_execute_question` interceptor. + When both interceptors are used, this `post_execute_question_with_metadata` interceptor runs after the + `post_execute_question` interceptor. The (possibly modified) response returned by + `post_execute_question` will be passed to + `post_execute_question_with_metadata`. + """ + return response, metadata + def pre_get_question( self, request: question_service.GetQuestionRequest, @@ -183,12 +229,35 @@ def pre_get_question( def post_get_question(self, response: question.Question) -> question.Question: """Post-rpc interceptor for get_question - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_question_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the QuestionService server but before - it is returned to user code. + it is returned to user code. This `post_get_question` interceptor runs + before the `post_get_question_with_metadata` interceptor. """ return response + def post_get_question_with_metadata( + self, + response: question.Question, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[question.Question, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_question + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the QuestionService server but before it is returned to user code. + + We recommend only using this `post_get_question_with_metadata` + interceptor in new development instead of the `post_get_question` interceptor. + When both interceptors are used, this `post_get_question_with_metadata` interceptor runs after the + `post_get_question` interceptor. The (possibly modified) response returned by + `post_get_question` will be passed to + `post_get_question_with_metadata`. + """ + return response, metadata + def pre_get_user_feedback( self, request: question_service.GetUserFeedbackRequest, @@ -208,12 +277,35 @@ def post_get_user_feedback( ) -> user_feedback.UserFeedback: """Post-rpc interceptor for get_user_feedback - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_user_feedback_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the QuestionService server but before - it is returned to user code. + it is returned to user code. This `post_get_user_feedback` interceptor runs + before the `post_get_user_feedback_with_metadata` interceptor. """ return response + def post_get_user_feedback_with_metadata( + self, + response: user_feedback.UserFeedback, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[user_feedback.UserFeedback, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_user_feedback + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the QuestionService server but before it is returned to user code. + + We recommend only using this `post_get_user_feedback_with_metadata` + interceptor in new development instead of the `post_get_user_feedback` interceptor. + When both interceptors are used, this `post_get_user_feedback_with_metadata` interceptor runs after the + `post_get_user_feedback` interceptor. The (possibly modified) response returned by + `post_get_user_feedback` will be passed to + `post_get_user_feedback_with_metadata`. + """ + return response, metadata + def pre_update_user_feedback( self, request: question_service.UpdateUserFeedbackRequest, @@ -234,12 +326,35 @@ def post_update_user_feedback( ) -> gcd_user_feedback.UserFeedback: """Post-rpc interceptor for update_user_feedback - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_user_feedback_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the QuestionService server but before - it is returned to user code. + it is returned to user code. This `post_update_user_feedback` interceptor runs + before the `post_update_user_feedback_with_metadata` interceptor. """ return response + def post_update_user_feedback_with_metadata( + self, + response: gcd_user_feedback.UserFeedback, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gcd_user_feedback.UserFeedback, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_user_feedback + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the QuestionService server but before it is returned to user code. + + We recommend only using this `post_update_user_feedback_with_metadata` + interceptor in new development instead of the `post_update_user_feedback` interceptor. + When both interceptors are used, this `post_update_user_feedback_with_metadata` interceptor runs after the + `post_update_user_feedback` interceptor. The (possibly modified) response returned by + `post_update_user_feedback` will be passed to + `post_update_user_feedback_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class QuestionServiceRestStub: @@ -476,6 +591,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_question(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_question_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -629,6 +748,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_execute_question(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_execute_question_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -775,6 +898,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_question(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_question_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -917,6 +1044,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_user_feedback(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_user_feedback_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1066,6 +1197,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_user_feedback(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_user_feedback_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-data-qna/samples/generated_samples/snippet_metadata_google.cloud.dataqna.v1alpha.json b/packages/google-cloud-data-qna/samples/generated_samples/snippet_metadata_google.cloud.dataqna.v1alpha.json index 6dc4a7fa9d15..71870177b775 100644 --- a/packages/google-cloud-data-qna/samples/generated_samples/snippet_metadata_google.cloud.dataqna.v1alpha.json +++ b/packages/google-cloud-data-qna/samples/generated_samples/snippet_metadata_google.cloud.dataqna.v1alpha.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-data-qna", - "version": "0.10.14" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-data-qna/tests/unit/gapic/dataqna_v1alpha/test_auto_suggestion_service.py b/packages/google-cloud-data-qna/tests/unit/gapic/dataqna_v1alpha/test_auto_suggestion_service.py index bf93e3acfdc3..5fef3616a9fe 100644 --- a/packages/google-cloud-data-qna/tests/unit/gapic/dataqna_v1alpha/test_auto_suggestion_service.py +++ b/packages/google-cloud-data-qna/tests/unit/gapic/dataqna_v1alpha/test_auto_suggestion_service.py @@ -59,6 +59,13 @@ ) from google.cloud.dataqna_v1alpha.types import auto_suggestion_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 = AutoSuggestionServiceClient(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 = AutoSuggestionServiceClient(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", [ @@ -1734,10 +1784,14 @@ def test_suggest_queries_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AutoSuggestionServiceRestInterceptor, "post_suggest_queries" ) as post, mock.patch.object( + transports.AutoSuggestionServiceRestInterceptor, + "post_suggest_queries_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.AutoSuggestionServiceRestInterceptor, "pre_suggest_queries" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = auto_suggestion_service.SuggestQueriesRequest.pb( auto_suggestion_service.SuggestQueriesRequest() ) @@ -1763,6 +1817,10 @@ def test_suggest_queries_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = auto_suggestion_service.SuggestQueriesResponse() + post_with_metadata.return_value = ( + auto_suggestion_service.SuggestQueriesResponse(), + metadata, + ) client.suggest_queries( request, @@ -1774,6 +1832,7 @@ def test_suggest_queries_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-data-qna/tests/unit/gapic/dataqna_v1alpha/test_question_service.py b/packages/google-cloud-data-qna/tests/unit/gapic/dataqna_v1alpha/test_question_service.py index cdebcd9a1522..0e3ef87dc156 100644 --- a/packages/google-cloud-data-qna/tests/unit/gapic/dataqna_v1alpha/test_question_service.py +++ b/packages/google-cloud-data-qna/tests/unit/gapic/dataqna_v1alpha/test_question_service.py @@ -68,6 +68,13 @@ from google.cloud.dataqna_v1alpha.types import question_service from google.cloud.dataqna_v1alpha.types import user_feedback +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 @@ -326,6 +333,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 = QuestionServiceClient(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 = QuestionServiceClient(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", [ @@ -4245,10 +4295,13 @@ def test_get_question_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.QuestionServiceRestInterceptor, "post_get_question" ) as post, mock.patch.object( + transports.QuestionServiceRestInterceptor, "post_get_question_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.QuestionServiceRestInterceptor, "pre_get_question" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = question_service.GetQuestionRequest.pb( question_service.GetQuestionRequest() ) @@ -4272,6 +4325,7 @@ def test_get_question_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = question.Question() + post_with_metadata.return_value = question.Question(), metadata client.get_question( request, @@ -4283,6 +4337,7 @@ def test_get_question_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_question_rest_bad_request( @@ -4526,10 +4581,13 @@ def test_create_question_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.QuestionServiceRestInterceptor, "post_create_question" ) as post, mock.patch.object( + transports.QuestionServiceRestInterceptor, "post_create_question_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.QuestionServiceRestInterceptor, "pre_create_question" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = question_service.CreateQuestionRequest.pb( question_service.CreateQuestionRequest() ) @@ -4553,6 +4611,7 @@ def test_create_question_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcd_question.Question() + post_with_metadata.return_value = gcd_question.Question(), metadata client.create_question( request, @@ -4564,6 +4623,7 @@ def test_create_question_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_execute_question_rest_bad_request( @@ -4656,10 +4716,13 @@ def test_execute_question_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.QuestionServiceRestInterceptor, "post_execute_question" ) as post, mock.patch.object( + transports.QuestionServiceRestInterceptor, "post_execute_question_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.QuestionServiceRestInterceptor, "pre_execute_question" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = question_service.ExecuteQuestionRequest.pb( question_service.ExecuteQuestionRequest() ) @@ -4683,6 +4746,7 @@ def test_execute_question_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = question.Question() + post_with_metadata.return_value = question.Question(), metadata client.execute_question( request, @@ -4694,6 +4758,7 @@ def test_execute_question_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_user_feedback_rest_bad_request( @@ -4786,10 +4851,14 @@ def test_get_user_feedback_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.QuestionServiceRestInterceptor, "post_get_user_feedback" ) as post, mock.patch.object( + transports.QuestionServiceRestInterceptor, + "post_get_user_feedback_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.QuestionServiceRestInterceptor, "pre_get_user_feedback" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = question_service.GetUserFeedbackRequest.pb( question_service.GetUserFeedbackRequest() ) @@ -4813,6 +4882,7 @@ def test_get_user_feedback_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = user_feedback.UserFeedback() + post_with_metadata.return_value = user_feedback.UserFeedback(), metadata client.get_user_feedback( request, @@ -4824,6 +4894,7 @@ def test_get_user_feedback_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_user_feedback_rest_bad_request( @@ -4992,10 +5063,14 @@ def test_update_user_feedback_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.QuestionServiceRestInterceptor, "post_update_user_feedback" ) as post, mock.patch.object( + transports.QuestionServiceRestInterceptor, + "post_update_user_feedback_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.QuestionServiceRestInterceptor, "pre_update_user_feedback" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = question_service.UpdateUserFeedbackRequest.pb( question_service.UpdateUserFeedbackRequest() ) @@ -5021,6 +5096,7 @@ def test_update_user_feedback_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcd_user_feedback.UserFeedback() + post_with_metadata.return_value = gcd_user_feedback.UserFeedback(), metadata client.update_user_feedback( request, @@ -5032,6 +5108,7 @@ def test_update_user_feedback_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_initialize_client_w_rest():